Адаптировал клавиатуру для Простых устройств из ветки модуля Телеграм

- menu.jpg (14.44 КБ) 1518 просмотров
Создаем callback-кнопку "Устройства". Добавляем в поле "Данные" строчку
Далее, в Событиях создаем callback событие со следующим кодом
Код: Выделить всё
if (strpos($callback, 'callSD_') !== false) {
$skip = true;
$attachments = array();
//разбираем строку на составляющие
$cmd = explode("_", $callback);
$title_kb = "";
if ($cmd[1] == 'home'){
$run = hex2bin('F09F8F83');
$rooms = getObjectsByClass("Rooms");
$title_kb = "<b>"."Комнаты"."</b>";
foreach ($rooms as $room) {
$room_text= getObject($room['TITLE'])->description;
if (gg($room['TITLE'].".SomebodyHere")==1) $room_text.= " ".$run;
$buttons[] = $this->buildKeyBoardButton($room_text,'callback',"callSD_room_".$room['TITLE']."_".$cmd[2], 'primary');
}
//так как максимально количество кнопок - 10, разбиваем кнопки на "страницы" и подгружаем необходимую, передавая во все кнопки номер текущей страницы
$buttons_all = $buttons;
if(count($buttons_all) > 8) {
//если страниц больше одной, разбиваем массив кнопок на страницы
$buttons_pages = array_chunk(array_slice($buttons_all, 9), 8);
//на первой странице 9 кнопок, место для кнопки "Далее" или "Выход"
if($cmd[2] == 0) $buttons = array_slice($buttons_all, 0, 9);
//для остальных 8 кнопок берем из подкотовленного массива, место для кнопок "Назад" и "Далее"
else $buttons = $buttons_pages[$cmd[2]-1];
//если это не первая страница - делаем кнопку "Назад"
if($cmd[2] != 0)$buttons[] = $this->buildKeyBoardButton("Назад",'callback', 'callSD_home_'.$cmd[2]-1, 'secondary');
//если не последняя - делаем кнопку "Вперёд"
if (isset($buttons_pages[$cmd[2]]))$buttons[] = $this->buildKeyBoardButton("Далее",'callback', 'callSD_home_'.$cmd[2]+1, 'secondary');
}
//если на странице меньше 10 кнопок, то есть страница последняя, добавляем кнопку "Выход"
if(count($buttons) < 10) $buttons[] = $this->buildKeyBoardButton("Выход",'callback', 'callSD_exit', 'negative');
}
else if ($cmd[1] == 'room' or $cmd[1] == 'device' or $cmd[1] == 'lock'){
$room = $cmd[2];
$off = hex2bin('F09F8C91');
$on = hex2bin('F09F8C95');
if ($cmd[1] == 'device' or $cmd[1] == 'lock'){
if ($cmd[1] == 'device'){
$text = getObject($cmd[2])->description;
if (gg($cmd[2].".status") == 1) $text .= " выключен ". $off;
else $text .= " включен ". $on;
} else if ($cmd[1] == 'lock'){
if (gg($cmd[2].".lockstatus")) $text .= "Замок открыт ". hex2bin('F09F9493');
else $text .= "Замок закрыт ". hex2bin('F09F9492');
}
cm($cmd[2].".switch");
$this->sendAnswerCallbackQuery($user_id, $event_id, $text);
$room = gg($cmd[2].".linkedRoom");
}
// кнопки устройств в комнате
$title_kb = "<b>".gg($room.".Title")."</b>";
$temp = '';
$humidity = '';
$co2 = '';
$door = '';
$objects = getObjectsByProperty("linkedRoom", "=", $room);
foreach($objects as $object) {
$device = SQLSelectOne("SELECT * FROM devices WHERE LINKED_OBJECT='".$object."'");
if($device['TYPE'] == 'sensor_temp' or $device['TYPE'] == 'sensor_temphum') $temp.= gg($object.'.value')."°C ";
if($device['TYPE'] == 'sensor_humidity') $humidity.= gg($object.'.value')."% ";
else if($device['TYPE'] == 'sensor_temphum') $humidity.= gg($object.'.valueHumidity')."% ";
else if($device['TYPE'] == 'sensor_co2') $co2.= gg($object.'.value')."ppm ";
else if($device['TYPE'] == 'openclose' or $device['TYPE'] == 'unlockable'){
$oc = gg($object . '.ncno') == 'nc' ? 1 - gg($object . '.status') : gg($object . '.status');
if($oc) $door.=' Открыта';
else $door.=' Закрыта';
if($device['TYPE'] == 'unlockable'){
if(gg($object . '.lockstatus')){
$state = hex2bin('F09F9492');
$color = 'negative';
} else {
$state = hex2bin('F09F9493');
$color = 'positive';
}
$buttons[] = $this->buildKeyBoardButton($state.$device['TITLE'], 'callback', "callSD_lock_".$object."_".$cmd[3], $color);
}
}
else if($device['TYPE'] == 'relay' or $device['TYPE'] == 'dimmer' or $device['TYPE'] == 'rgb' or $device['TYPE'] == 'openable'){
$state = $off;
$color = 'primary';
if($device['TYPE'] == 'openable') $status = !gg($object . '.status');
else $status = gg($object.".status");
if ($status){
$state = $on;
$color = 'positive';
}
$buttons[] = $this->buildKeyBoardButton($state.$device['TITLE'], 'callback', "callSD_device_".$object."_".$cmd[3], $color);
} else if($device['TYPE'] == 'camera'){
$buttons[] = $this->buildKeyBoardButton(hex2bin('F09F8EA5').$device['TITLE'], 'callback', "callSD_camera_".$object."_".$cmd[3]."_".$cmd[2], 'primary');
}
}
if($temp != '') $title_kb .= "\n".hex2bin('F09F8CA1')." ".$temp;
if($humidity != '') $title_kb .= "\n".hex2bin('F09F92A6')." ".$humidity;
if($co2 != '') $title_kb .= "\nCO2 ".$co2;
if($door != '') $title_kb .= "\n".hex2bin('F09F9AAA')." ".$door;
$buttons[] = $this->buildKeyBoardButton("Назад",'callback', 'callSD_home_'.$cmd[3], 'secondary');
$buttons[] = $this->buildKeyBoardButton("Выход",'callback', 'callSD_exit', 'negative');
}
else if ($cmd[1] == 'camera') {
$this->sendAction($chat_id,"photo");
$title_kb = "<b>".$cmd[2]."</b>";
$url = BASE_URL.gg($cmd[2].".snapshotPreviewURL");
$image_path = CASH_PATH.$cmd[2].".jpg";
$this->writeLog($image_path);
try {
$data = file_get_contents($url);
$i = strlen($data);
$handle = fopen($image_path, "w");
fwrite($handle, $data);
fclose($handle);
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
$buttons[] = $this->buildKeyBoardButton("Назад",'callback', 'callSD_room_'.$cmd[4].'_'.$cmd[3], 'secondary');
$buttons[] = $this->buildKeyBoardButton("Выход",'callback', 'callSD_exit', 'negative');
$attachments = $this->attachPhoto($this->config['GROUP_ID'], $image_path);
}
if ($cmd[1] == 'exit'){
$this->messageDelete($user_id, $message_id);
} else {
$keyboard = $this->buildInlineKeyBoard($buttons, 22222);
//если нет $message_id, значит вызов не из инлайн-клавиатуры - отправляем сообщение
if(empty($message_id)) $this->sendMessage($user_id, $title_kb, $keyboard, '', $attachments);
//иначе - редактируем сообщение
else $this->messageEdit($user_id, $message_id, $title_kb, $keyboard, '', $attachments);
}
}
Здесь происходит вся "магия": формируются клавиатуры, выполняются действия.
Ограничение только одно - не более 10 устройств на комнату!
Это продиктовано ограничениями inline-клавиатур в 10 кнопок.
Файлы для импорта: