From 229eec97f5e375f410a19cf5a588122084fe3a98 Mon Sep 17 00:00:00 2001 From: skysilver Date: Wed, 10 Jan 2018 00:24:18 +0300 Subject: [PATCH] v.1.0-beta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Добавлено автоопределение типа (модели) устройств во время поиска при условии, что устройство сообщает свой токен. * Для шлюза Mi Smart Home Gateway 2 добавлен функционал работы с zigbee суб-устройствами (вкладка Zigbee): * получение списка суб-устройств; * удаление (отвязывание) суб-устройств; * перевод шлюза в режим сопряжения для добавления нового суб-устройства. * В перечень устройств внесена камера Mi Dafang Smart Camera 120. --- modules/xiaomimiio/miio_devices_edit.inc.php | 34 +++- modules/xiaomimiio/xiaomimiio.class.php | 48 ++++-- templates/xiaomimiio/action_admin.html | 12 +- templates/xiaomimiio/img/milogo2.png | Bin 0 -> 5293 bytes templates/xiaomimiio/img/mizigbee.png | Bin 0 -> 3636 bytes templates/xiaomimiio/img/small/86sw2.png | Bin 0 -> 4236 bytes .../xiaomimiio/img/small/ctrl_neutral2.png | Bin 0 -> 5461 bytes templates/xiaomimiio/img/small/cube.png | Bin 0 -> 3619 bytes .../xiaomimiio/img/small/isa.camera.df3.png | Bin 0 -> 6341 bytes templates/xiaomimiio/img/small/magnet.png | Bin 0 -> 4621 bytes templates/xiaomimiio/img/small/motion.png | Bin 0 -> 2327 bytes templates/xiaomimiio/img/small/plug.png | Bin 0 -> 6662 bytes templates/xiaomimiio/img/small/sensor_ht.png | Bin 0 -> 5295 bytes .../img/small/sensor_magnet.aq2.png | Bin 0 -> 4022 bytes .../img/small/sensor_motion.aq2.png | Bin 0 -> 4713 bytes .../xiaomimiio/img/small/sensor_wleak.aq1.png | Bin 0 -> 4718 bytes templates/xiaomimiio/img/small/switch.png | Bin 0 -> 6193 bytes templates/xiaomimiio/img/small/weather.v1.png | Bin 0 -> 4197 bytes .../xiaomimiio/img/small/zigbee_unknown.png | Bin 0 -> 3636 bytes .../xiaomimiio/miio_devices_edit_default.html | 1 + .../miio_devices_edit_gwzigbee.html | 152 ++++++++++++++++++ .../xiaomimiio/miio_devices_search_admin.html | 2 +- 22 files changed, 234 insertions(+), 15 deletions(-) create mode 100644 templates/xiaomimiio/img/milogo2.png create mode 100644 templates/xiaomimiio/img/mizigbee.png create mode 100644 templates/xiaomimiio/img/small/86sw2.png create mode 100644 templates/xiaomimiio/img/small/ctrl_neutral2.png create mode 100644 templates/xiaomimiio/img/small/cube.png create mode 100644 templates/xiaomimiio/img/small/isa.camera.df3.png create mode 100644 templates/xiaomimiio/img/small/magnet.png create mode 100644 templates/xiaomimiio/img/small/motion.png create mode 100644 templates/xiaomimiio/img/small/plug.png create mode 100644 templates/xiaomimiio/img/small/sensor_ht.png create mode 100644 templates/xiaomimiio/img/small/sensor_magnet.aq2.png create mode 100644 templates/xiaomimiio/img/small/sensor_motion.aq2.png create mode 100644 templates/xiaomimiio/img/small/sensor_wleak.aq1.png create mode 100644 templates/xiaomimiio/img/small/switch.png create mode 100644 templates/xiaomimiio/img/small/weather.v1.png create mode 100644 templates/xiaomimiio/img/small/zigbee_unknown.png create mode 100644 templates/xiaomimiio/miio_devices_edit_gwzigbee.html diff --git a/modules/xiaomimiio/miio_devices_edit.inc.php b/modules/xiaomimiio/miio_devices_edit.inc.php index 9294d9b..0b16c7c 100644 --- a/modules/xiaomimiio/miio_devices_edit.inc.php +++ b/modules/xiaomimiio/miio_devices_edit.inc.php @@ -2,7 +2,7 @@ /* * @author * @copyright 2017 Agaphonov Dmitri aka skysilver (c) -* @version 0.9b +* @version 1.0b */ if ($this->owner->name == 'panel') { @@ -14,7 +14,7 @@ $rec = SQLSelectOne("SELECT * FROM $table_name WHERE ID='$id'"); if ($this->mode == 'update') { - + $this->getConfig(); $ok = 1; @@ -86,6 +86,34 @@ $this->requestInfo($rec['ID']); // а также, если определен тип устройства, то запросим текущие параметры (статус). if ((int)$update_period == 0 && $rec['DEVICE_TYPE'] != '') $this->requestStatus($rec['ID']); + // Если тип устройства не указан, то пробуем получить тип устройства из miIO.info + if ($rec['DEVICE_TYPE'] == '') { + if ($this->config['API_LOG_DEBMES']) DebMes('Try to get device model from miIO.info for the device ' . $rec['IP'], 'xiaomimiio'); + + $this->getConfig(); + + if ($miio_module->config['API_IP']) $bind_ip = $miio_module->config['API_IP']; + else $bind_ip = '0.0.0.0'; + if ($miio_module->config['API_LOG_MIIO']) $miio_debug = true; + else $miio_debug = false; + + if (!class_exists('miIO', false)) { + include_once(DIR_MODULES . 'xiaomimiio/lib/miio.class.php'); + } + $midev = new miIO($rec['IP'], $bind_ip, $rec['TOKEN'], $miio_debug); + if ($midev->getInfo(time())) { + if ($midev->data != '') { + $info = json_decode($midev->data, true); + $dev_type = $info['result']['model']; + if ($this->config['API_LOG_DEBMES']) DebMes($rec['IP'] . ' is ' . $dev_type, 'xiaomimiio'); + if ($dev_type != '') { + $rec['DEVICE_TYPE'] = $dev_type; + SQLUpdate($table_name, $rec); + $this->requestStatus($rec['ID']); + } + } + } + } } } } else { @@ -94,7 +122,7 @@ } if ($this->tab == 'data') { - + $new_id = 0; global $delete_id; diff --git a/modules/xiaomimiio/xiaomimiio.class.php b/modules/xiaomimiio/xiaomimiio.class.php index 4b48550..8d1132d 100644 --- a/modules/xiaomimiio/xiaomimiio.class.php +++ b/modules/xiaomimiio/xiaomimiio.class.php @@ -4,7 +4,7 @@ * @package project * @author * @copyright 2017 Agaphonov Dmitri aka skysilver (c) -* @version 0.9.5b +* @version 1.0b */ define ('MIIO_YEELIGHT_WHITE_BULB_PROPS', 'power,bright'); @@ -313,16 +313,16 @@ function discover($ip = '') { include_once(DIR_MODULES . 'xiaomimiio/lib/miio.class.php'); } - $dev = new miIO(null, $bind_ip, null, $miio_debug); + $midev = new miIO(null, $bind_ip, null, $miio_debug); // Выполняем broadcast-поиск устройств в локальной сети if ($this->config['API_LOG_DEBMES']) DebMes("Run miIO-discover command", 'xiaomimiio'); - $res = $dev->discover(); + $res = $midev->discover(); if ($this->config['API_LOG_DEBMES']) DebMes("End miIO-discover command", 'xiaomimiio'); if ($res) { // Обрабатываем результат поиска - $reply = $dev->data; + $reply = $midev->data; if ($reply != '') { if ($this->config['API_LOG_DEBMES']) DebMes("Reply = $reply", 'xiaomimiio'); @@ -353,7 +353,7 @@ function discover($ip = '') { if ($this->config['API_LOG_DEBMES']) DebMes("Update the ip address and the token for the device $ip", 'xiaomimiio'); SQLUpdate('miio_devices', $dev_rec); - + // Ответившее устройство выкинем из претендентов на оффлайн for ($i = 0; $i < $count_devices; $i++) { if ($dev_rec['ID'] == $all_devices[$i]['ID']) { @@ -364,7 +364,7 @@ function discover($ip = '') { $this->processCommand($dev_rec['ID'], 'online', 1); } else { - // Если устройство нет в БД, то добавим его и установим свойство online + // Если устройство нет в БД, то добавим его $dev_rec = array(); $dev_rec['IP'] = $ip; if ($token != '') $dev_rec['TOKEN'] = $token; @@ -373,7 +373,36 @@ function discover($ip = '') { $dev_rec['DEVICE_TYPE_CODE'] = $device_type_code; $dev_rec['TITLE'] = 'New ' . $dev_rec['DEVICE_TYPE_CODE']; if ($this->config['API_LOG_DEBMES']) DebMes("Add new device with $ip", 'xiaomimiio'); + + // Если есть токен, то пробуем получить тип устройства из miIO.info + if ($dev_rec['TOKEN']) { + if ($this->config['API_LOG_DEBMES']) DebMes('Try to get device model from miIO.info for the device ' . $dev_rec['IP'], 'xiaomimiio'); + $midev->data = ''; + $midev->ip = $dev_rec['IP']; + $midev->token = $dev_rec['TOKEN']; + if ($midev->getInfo(time())) { + if ($midev->data != '') { + $info = json_decode($midev->data, true); + $dev_type = $info['result']['model']; + if ($this->config['API_LOG_DEBMES']) DebMes($dev_rec['IP'] . ' is ' . $dev_type, 'xiaomimiio'); + if ($dev_type != '') $dev_rec['DEVICE_TYPE'] = $dev_type; + } + } + } + $dev_rec['ID'] = SQLInsert('miio_devices', $dev_rec); + + if ($dev_rec['DEVICE_TYPE'] != '') { + $this->requestStatus($dev_rec['ID']); + if ($dev_rec['DEVICE_TYPE'] == 'lumi.gateway.v3') { + $this->processCommand($dev_rec['ID'], 'add_program', ''); + $this->processCommand($dev_rec['ID'], 'del_program', ''); + } + if ($dev_rec['DEVICE_TYPE'] == 'chuangmi.ir.v2') { + $this->processCommand($dev_rec['ID'], 'ir_play', ''); + } + } + $this->processCommand($dev_rec['ID'], 'online', 1); } } @@ -631,7 +660,7 @@ function search_miio_devices(&$out) { */ function edit_miio_devices(&$out, $id) { - + require(DIR_MODULES.$this->name . '/miio_devices_edit.inc.php'); } @@ -925,10 +954,11 @@ function processMessage($message, $command, $device_id) { } } elseif ($device['ID']) { - $res_commands[] = array('command' => 'message', 'value' => $message); $res_commands[] = array('command' => 'online', 'value' => 1); - + $res_commands[] = array('command' => 'command', 'value' => ''); + $res_commands[] = array('command' => 'message', 'value' => $message); + if ($device['DEVICE_TYPE'] == 'lumi.gateway.v3') { if ($command == 'get_prop_fm' && is_array($data['result'])) { foreach($data['result'] as $key => $value) { diff --git a/templates/xiaomimiio/action_admin.html b/templates/xiaomimiio/action_admin.html index d35723d..bb74855 100644 --- a/templates/xiaomimiio/action_admin.html +++ b/templates/xiaomimiio/action_admin.html @@ -20,7 +20,7 @@