Делюсь своим вариантом, как интегрировал этот адаптер по MQTT в MajorDoMo и Telegram.
Описание самого проекта умного домофона и его исходники есть на GitHub
Создаем в Объектах новый класс, назовём его domofon.
Для него создадим 2 метода со следующим кодом:
метод incomingCall:
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$chat_id=XXXXXXXX;
$eventName='tlg/events/domofon';
if ((time() - registeredEventTime($eventName)) > 4) {
if ($params['NEW_VALUE'] && !$params['OLD_VALUE']) {
clearTimeOut('DomofonEndCalling');
$options='';
$options.=(gg('homeDomofon.autoOpen')?'Автооткрытие, ':'');
$options.=(gg('homeDomofon.autoOpenOnce')?'Однократное автооткрытие, ':'');
$options.=(gg('homeDomofon.muteSound')?'Без звука, ':'');
$options.=(gg('homeDomofon.muteSoundOnce')?'Однократно без звука, ':'');
$options.=(gg('homeDomofon.autoReject')?'АвтоСброс, ':'');
$options=substr($options,0,strlen($options)-2).'.';
$telegram_module->sendAction($chat_id);
$option[] = $telegram_module->buildInlineKeyboardButton($text=hex2bin('F09F9FA2')."Открыть","","Callback_domofon_Open","");
$option[] = $telegram_module->buildInlineKeyboardButton($text=hex2bin('F09F94B4')."Сбросить","","Callback_domofon_Reject","");
$count_row = 2;
$option = array_chunk($option, $count_row);
$keyb = $telegram_module->buildInlineKeyBoard($option);
$content = array("chat_id" => $chat_id, "text" => date('d.m.Y H:i:s').PHP_EOL."Звонят в домофон. Что делаем?".PHP_EOL.($options!='.'?'Включены режимы: '.$options:''), "reply_markup" => $keyb, "parse_mode" => "HTML");
$res = $telegram_module->sendContent($content);
registerEvent($eventName, $res['result']['message_id'], 1);
registerEvent('tlg/events/domofonOptions', $options, 1);
//DebMes($res);
} else if (!$params['NEW_VALUE'] && $params['OLD_VALUE']) {
//уже не звонят
$eventId=registeredEventDetails($eventName);
if ($eventId && is_numeric($eventId)) {
$options=registeredEventDetails('tlg/events/domofonOptions');
$telegram_module->editMessage($chat_id,$eventId,date('d.m.Y H:i:s').PHP_EOL.'В домофон уже не звонят. Отреагировать не успели...'.PHP_EOL.($options!='.'?'Были включены режимы: '.$options.PHP_EOL:'').'Звонили '.date('d.m.Y H:i:s',registeredEventTime($eventName)));
}
}
} else {
DebMes('Domofon call prev time: '.(time() - registeredEventTime($eventName)));
if (!$params['NEW_VALUE'] && $params['OLD_VALUE']) {
$params['SOURCE'] = 'DomofonTimeout';
setTimeOut('DomofonEndCalling',"cm('".$this->object_title.".incomingCall',json_decode('".json_encode($params)."',true));",6);
}
}
и метод smthUpdated:
include_once(DIR_MODULES . 'telegram/telegram.class.php');
$telegram_module = new telegram();
$chat_id=XXXXXXXX;
$eventName='tlg/events/domofonSettings';
$eventId=registeredEventDetails($eventName);
$option[] = $telegram_module->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoOpen')?'F09F9FA2':'F09F94B4'))."Автооткрытие","","Callback_domofon_autoOpen","");
$option[] = $telegram_module->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoOpenOnce')?'F09F9FA2':'F09F94B4'))."Автооткрытие 1 раз","","Callback_domofon_autoOpenOnce","");
$option[] = $telegram_module->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.muteSound')?'F09F9FA2':'F09F94B4'))."Без звука","","Callback_domofon_muteSound","");
$option[] = $telegram_module->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.muteSoundOnce')?'F09F9FA2':'F09F94B4'))."Без звука 1 раз","","Callback_domofon_muteSoundOnce","");
$option[] = $telegram_module->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoReject')?'F09F9FA2':'F09F94B4'))."АвтоСброс","","Callback_domofon_autoReject","");
$option[] = $telegram_module->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.restart')?'F09F9FA2':'F09F94B4'))."Рестарт","","Callback_domofon_restart","");
$count_row = 2;
$option = array_chunk($option, $count_row);
$keyb = $telegram_module->buildInlineKeyBoard($option);
$telegram_module->editMessage($chat_id,$eventId,'Настройки домофона',$keyb);
Не забываем в методам поменять ХХХХХХХ на Ваш id в телеграме.
Дальше создаём свойства и привязываем их к методам (Запускать метод при изменении) согласно скриншоту:
После этого, создаём внутри класса объект, в моём случае, с названием homeDomofon
Переходим в модуль MQTT и связываем его топики с свойствами созданного ранее объекта homeDomofon
Внутри топика всё должно выглядеть следующим образом, покажу на примере domofon_accept_call/state:
Не забываем указывать Путь (write) и Replace list.
Так же делаем для остальных топиков.
После этого, переходим в модуль Telegram, на вкладку Команды.
Создаём новую команду, например, с названием Домофон. Выставляем для неё необходимые права доступа и копируем следующий код:
$this->sendAction($chat_id);
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoOpen')?'F09F9FA2':'F09F94B4'))."Автооткрытие","","Callback_domofon_autoOpen","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoOpenOnce')?'F09F9FA2':'F09F94B4'))."Автооткрытие 1 раз","","Callback_domofon_autoOpenOnce","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.muteSound')?'F09F9FA2':'F09F94B4'))."Без звука","","Callback_domofon_muteSound","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.muteSoundOnce')?'F09F9FA2':'F09F94B4'))."Без звука 1 раз","","Callback_domofon_muteSoundOnce","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoReject')?'F09F9FA2':'F09F94B4'))."АвтоСброс","","Callback_domofon_autoReject","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.restart')?'F09F9FA2':'F09F94B4'))."Рестарт","","Callback_domofon_restart","");
$count_row = 2;
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);
$content = array("chat_id" => $chat_id, "text" => "Настройки домофона", "reply_markup" => $keyb, "parse_mode" => "HTML");
$res = $this->sendContent($content);
$eventName='tlg/events/domofonSettings';
registerEvent($eventName, $res['result']['message_id'], 1);
Теперь, переходим на вкладку События и создаём новое, например, Domofon_callback. Тип события выбираем Callback и копируем код:
if (strpos($callback,'Callback_domofon_') === 0) {
$command=str_replace('Callback_domofon_','',$callback);
$eventName='tlg/events/domofon';
if ($command == 'Open') {
sg ('homeDomofon.acceptCall',1);
setTimeOut('homeDomofon.acceptCall',"sg ('homeDomofon.acceptCall',0);",1);
$this->editMessage($chat_id,$message_id,date('d.m.Y H:i:s').PHP_EOL.hex2bin('F09F9FA2').'Открыто');
registerEvent($eventName, '', 1);
} else if ($command == 'Reject') {
sg ('homeDomofon.rejectCall',1);
setTimeOut('homeDomofon.rejectCall',"sg ('homeDomofon.rejectCall',0);",1);
$this->editMessage($chat_id,$message_id,date('d.m.Y H:i:s').PHP_EOL.hex2bin('F09F94B4').'Отбой.');
registerEvent($eventName, '', 1);
} else {
sg('homeDomofon.'.$command,!gg('homeDomofon.'.$command));
//$this->sendAction($chat_id);
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoOpen')?'F09F9FA2':'F09F94B4'))."Автооткрытие","","Callback_domofon_autoOpen","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoOpenOnce')?'F09F9FA2':'F09F94B4'))."Автооткрытие 1 раз","","Callback_domofon_autoOpenOnce","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.muteSound')?'F09F9FA2':'F09F94B4'))."Без звука","","Callback_domofon_muteSound","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.muteSoundOnce')?'F09F9FA2':'F09F94B4'))."Без звука 1 раз","","Callback_domofon_muteSoundOnce","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.autoReject')?'F09F9FA2':'F09F94B4'))."АвтоСброс","","Callback_domofon_autoReject","");
$option[] = $this->buildInlineKeyboardButton($text=(hex2bin(gg('homeDomofon.restart')?'F09F9FA2':'F09F94B4'))."Рестарт","","Callback_domofon_restart","");
$count_row = 2;
$option = array_chunk($option, $count_row);
$keyb = $this->buildInlineKeyBoard($option);
$this->editMessage($chat_id,$message_id,'Настройки домофона',$keyb);
}
}
По итогу, при звонке в домофон получаем сообщение с кнопками Открыть или Сбросить, либо, если не успели отреагировать - кнопки пропадают, текст сообщения менятся.
Так же, по команде боту Домофон получаем возможность изменить настройки контроллера.
Если блог Вам понравился, или, был полезен, не забывайте ставить лайки :-) Это мотивирует:)
Королёв, Россия
На форуме: London