London

 
<<< Назад

Интеграция c умным адаптером для домофонов от espdomofon.ru

Делюсь своим вариантом, как интегрировал этот адаптер по 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

MQTT

Внутри топика всё должно выглядеть следующим образом, покажу на примере domofon_accept_call/state:

MQTT_topic

Не забываем указывать Путь (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);

tlg_command

Теперь, переходим на вкладку События и создаём новое, например, 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);
    }
}

tlg_event

По итогу, при звонке в домофон получаем сообщение с кнопками Открыть или Сбросить, либо, если не успели отреагировать - кнопки пропадают, текст сообщения менятся.
Так же, по команде боту Домофон получаем возможность изменить настройки контроллера.

tlg_result

Если блог Вам понравился, или, был полезен, не забывайте ставить лайки :-) Это мотивирует:)

Обсуждение (0) (26)

Смотрите так же:
21.10.2021 Переезд с модуля zigbee2mqtt на модуль zigbeedev
14.10.2020 Делаем видеодомофон в Homekit
07.10.2020 Модернизируем сенсорный выключатель LIVOLO для умного дома. Выводим нулевой провод, для нормального питания.
03.09.2020 Уведомления ZoneMinder без модуля.
14.05.2020 Подписка на топики mqtt
08.05.2020 Мониторинг хостов с миротика

Королёв, Россия

На форуме: London