function ajax_client_update()
 {
     $nv = new H2NVStore();
     $clientIdentifier = $_POST['id'];
     $clientSettings = $nv->get($clientIdentifier);
     $clientSettings[$_POST['key']] = $_POST['value'];
     $nv->set($clientIdentifier, $clientSettings);
 }
<?php

echo $this->_getSubmenu2('groups');
?>
<ul><?php 
$GLOBALS['pagetitle'] = 'Device Groups';
if ($_POST['name']) {
    H2NVStore::set('group/' . $_POST['name'], array());
}
if ($_REQUEST['remove']) {
    db()->get('DELETE FROM nvstore WHERE nv_key = ?', array('group/' . $_REQUEST['remove']));
}
foreach (o(db)->get('SELECT * FROM nvstore 
  WHERE nv_key LIKE "group/%"
  ORDER BY nv_key') as $g) {
    $gname = substr($g['nv_key'], 6);
    ?>
<li><a href="<?php 
    echo actionUrl('group', 'devices', array('id' => $gname));
    ?>
">
    <?php 
    echo htmlspecialchars($gname);
    ?>
    </a> &nbsp; 
    | <a href="<?php 
    echo actionUrl('groups', 'devices', array('remove' => $gname));
    ?>
">delete</a>
  </li><?php 
}
<h1 style="font-size: 120%;"><?php 
echo htmlspecialchars($_REQUEST['id']);
?>
</h1>
<?php 
$group = H2NVStore::get('group/' . $_REQUEST['id']);
if ($_POST['cmd'] == 'change') {
    if ($_REQUEST['inGroup'] == 'Y') {
        $group[] = $_REQUEST['device'];
    } else {
        $idx = array_search($_REQUEST['device'], $group);
        if ($idx !== false) {
            unset($group[$idx]);
        }
    }
    H2NVStore::set('group/' . $_REQUEST['id'], $group);
    die;
}
$evt = new H2Event();
$prevRoom = '';
foreach (db()->get('SELECT * FROM devices WHERE d_visible = "Y" AND d_room != "unknown" ORDER BY d_room,d_name') as $ds) {
    if ($prevRoom != $ds['d_room']) {
        print '<h2 style="margin:0;padding-top: 8px;">' . htmlspecialchars($ds['d_room']) . '</h2>';
        $prevRoom = $ds['d_room'];
    }
    ?>
<div>
    <input type="checkbox" id="c_<?php 
    echo $ds['d_key'];
    ?>
"