From 316ce17b5c5af81770fec48e1e8dffff10fad08b Mon Sep 17 00:00:00 2001 From: skysilver Date: Wed, 22 Aug 2018 23:49:58 +0300 Subject: [PATCH] v.1.8.5-beta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Для Aqara AC Companion добавлен функционал чтения (обучения) IR-команд, отправки IR-команд (метрика ir_play), управления встроенным реле (метрика power), получения потребляемой мощности (метрика load_power). * Передача параметров *NEW_VALUE* и *OLD_VALUE* в привязанный метод. * Мелкие исправления. --- languages/xiaomimiio_default.php | 1 + languages/xiaomimiio_ru.php | 1 + languages/xiaomimiio_ua.php | 1 + modules/xiaomimiio/miio_devices_edit.inc.php | 65 +-- modules/xiaomimiio/xiaomimiio.class.php | 147 +++--- scripts/cycle_xiaomimiio.php | 6 +- templates/xiaomimiio/action_admin.html | 2 +- templates/xiaomimiio/img/aqara_ir_learn.png | Bin 0 -> 9260 bytes .../xiaomimiio/miio_devices_edit_default.html | 421 ++++++++++++------ 9 files changed, 407 insertions(+), 237 deletions(-) create mode 100644 templates/xiaomimiio/img/aqara_ir_learn.png diff --git a/languages/xiaomimiio_default.php b/languages/xiaomimiio_default.php index c78222b..7231837 100644 --- a/languages/xiaomimiio_default.php +++ b/languages/xiaomimiio_default.php @@ -43,6 +43,7 @@ 'XIMI_APP_TEACH1' => 'Learning IR code', 'XIMI_APP_TEACH2' => 'IR-code learning', 'XIMI_APP_TEACH_TEXT' => 'To read the IR code from the remote control, press the Start button, point the remote control towards Mi IR Remote 360 and press the button whose code you want to know several times. Upon successful completion of the procedure, the code read will be displayed in the log.', +'XIMI_APP_TEACH_TEXT_AQARA' => 'To read the IR code from the remote control, press the Start button, point the remote control towards Aqara AC Companion and press the button whose code you want to know several times. Upon successful completion of the procedure, the code read will be displayed in the log.', 'XIMI_APP_START' => 'Start', 'XIMI_APP_TRAINING' => 'Learning mode activated', 'XIMI_APP_ERROR' => 'The problem with getting data from the device', diff --git a/languages/xiaomimiio_ru.php b/languages/xiaomimiio_ru.php index fddc80a..71e3e64 100644 --- a/languages/xiaomimiio_ru.php +++ b/languages/xiaomimiio_ru.php @@ -44,6 +44,7 @@ 'XIMI_APP_TEACH1' => 'Обучить IR-коду', 'XIMI_APP_TEACH2' => 'Обучение IR-командам', 'XIMI_APP_TEACH_TEXT' => 'Чтобы считать IR-код с пульта дистанционного управления, нажмите кнопку Старт, направьте пульт в сторону Mi IR Remote 360 и нажмите несколько раз кнопку, код которой требуется узнать. При успешном завершении процедуры прочитанный код отобразится в логе.', +'XIMI_APP_TEACH_TEXT_AQARA' => 'Чтобы считать IR-код с пульта дистанционного управления, нажмите кнопку Старт, направьте пульт в сторону Aqara AC Companion и нажмите несколько раз кнопку, код которой требуется узнать. При успешном завершении процедуры прочитанный код отобразится в логе.', 'XIMI_APP_START' => 'Старт', 'XIMI_APP_TRAINING' => 'Режим обучения активирован', 'XIMI_APP_ERROR' => 'Проблема с получением данных от устройства', diff --git a/languages/xiaomimiio_ua.php b/languages/xiaomimiio_ua.php index b1ee80b..46acc6d 100644 --- a/languages/xiaomimiio_ua.php +++ b/languages/xiaomimiio_ua.php @@ -44,6 +44,7 @@ 'XIMI_APP_TEACH1' => 'Навчити коду', 'XIMI_APP_TEACH2' => 'Навчання IR-командам', 'XIMI_APP_TEACH_TEXT' => 'Щоб отримати IR-код з пульта дистанційного керування, натисніть кнопку "Старт", направте пульт в сторону Mi IR Remote 360 і натисніть кілька разів кнопку, код якої потрібно дізнатися. При успішному завершенні процедури отриманий код відобразиться на сторінці.', +'XIMI_APP_TEACH_TEXT_AQARA' => 'Щоб отримати IR-код з пульта дистанційного керування, натисніть кнопку "Старт", направте пульт в сторону Aqara AC Companion і натисніть кілька разів кнопку, код якої потрібно дізнатися. При успішному завершенні процедури отриманий код відобразиться на сторінці.', 'XIMI_APP_START' => 'Старт', 'XIMI_APP_TRAINING' => 'Режим навчання активований', 'XIMI_APP_ERROR' => 'Проблема з отриманням даних від пристрою', diff --git a/modules/xiaomimiio/miio_devices_edit.inc.php b/modules/xiaomimiio/miio_devices_edit.inc.php index 58488ff..9a84410 100644 --- a/modules/xiaomimiio/miio_devices_edit.inc.php +++ b/modules/xiaomimiio/miio_devices_edit.inc.php @@ -2,7 +2,7 @@ /* * @author * @copyright 2017-2018 Agaphonov Dmitri aka skysilver (c) -* @version 1.8b +* @version 1.8.5b */ if ($this->owner->name == 'panel') { @@ -17,7 +17,7 @@ $this->getConfig(); $ok = 1; - + if ($this->tab == '') { global $title; @@ -33,10 +33,10 @@ $out['ERR_IP'] = 1; $ok = 0; } - + global $token; $rec['TOKEN'] = $token; - + global $device_type; $rec['DEVICE_TYPE'] = $device_type; @@ -45,21 +45,23 @@ if ($rec['UPDATE_PERIOD'] > 0) { $rec['NEXT_UPDATE'] = date('Y-m-d H:i:s'); } - + $commands = array('online', 'command', 'message'); if (($rec['DEVICE_TYPE'] == 'lumi.gateway.v3') || ($rec['DEVICE_TYPE'] == 'lumi.acpartner.v3')) { $commands[] = 'add_program'; $commands[] = 'del_program'; } - if ($rec['DEVICE_TYPE'] == 'chuangmi.ir.v2') { + if ($rec['DEVICE_TYPE'] == 'chuangmi.ir.v2' || $rec['DEVICE_TYPE'] == 'lumi.acpartner.v3') { $commands[] = 'ir_play'; - //$commands[] = 'freq'; } if ($rec['DEVICE_TYPE'] == 'xiaomi.wifispeaker.v1') { $commands[] = 'vol_up'; $commands[] = 'vol_down'; } - + if ($rec['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + $commands[] = 'power'; + $commands[] = 'load_power'; + } } if ($ok) { @@ -95,7 +97,13 @@ if ($rec['TOKEN'] != '' && $rec['IP'] != '') { $this->requestInfo($rec['ID']); // а также, если определен тип устройства, то запросим текущие параметры (статус). - if ((int)$update_period == 0 && $rec['DEVICE_TYPE'] != '') $this->requestStatus($rec['ID']); + if ($rec['DEVICE_TYPE'] != '') { + $this->requestStatus($rec['ID']); + if (($rec['DEVICE_TYPE'] == 'lumi.gateway.v3') || ($rec['DEVICE_TYPE'] == 'lumi.acpartner.v3')) { + $this->addToQueue($rec['ID'], 'get_lumi_dpf_aes_key', '[]'); + $this->addToQueue($rec['ID'], 'get_zigbee_channel', '[]'); + } + } // Если тип устройства не указан, то пробуем получить тип устройства из 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'); @@ -135,44 +143,46 @@ $new_id = 0; global $delete_id; - + if ($delete_id) { SQLExec("DELETE FROM miio_commands WHERE ID='" . (int)$delete_id . "'"); } - - if (($rec['DEVICE_TYPE'] == 'lumi.gateway.v3') || ($rec['DEVICE_TYPE'] == 'lumi.acpartner.v3')) { - // Для шлюза на вкладку data выводим только определенные свойства, т.к. для свойств радио есть отдельная вкладка - $properties = SQLSelect("SELECT * FROM miio_commands WHERE DEVICE_ID='" . $rec['ID'] . "' AND TITLE IN ('online','command','message','lumi_dpf_aes_key','zigbee_channel') ORDER BY ID"); - } else { - $properties = SQLSelect("SELECT * FROM miio_commands WHERE DEVICE_ID='" . $rec['ID'] . "' ORDER BY ID"); - } - + + if ($rec['DEVICE_TYPE'] == 'lumi.gateway.v3') { + // Для шлюза на вкладку data выводим только определенные свойства, т.к. для свойств радио есть отдельная вкладка + $properties = SQLSelect("SELECT * FROM miio_commands WHERE DEVICE_ID='" . $rec['ID'] . "' AND TITLE IN ('online','command','message','lumi_dpf_aes_key','zigbee_channel') ORDER BY ID"); + } else if ($rec['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + $properties = SQLSelect("SELECT * FROM miio_commands WHERE DEVICE_ID='" . $rec['ID'] . "' AND TITLE IN ('online','command','message','lumi_dpf_aes_key','zigbee_channel', 'ir_play', 'power', 'load_power') ORDER BY ID"); + } else { + $properties = SQLSelect("SELECT * FROM miio_commands WHERE DEVICE_ID='" . $rec['ID'] . "' ORDER BY ID"); + } + $total = count($properties); - + for($i = 0; $i < $total; $i++) { if ($properties[$i]['ID'] == $new_id) continue; - + if ($this->mode == 'update') { - + global ${'linked_object'.$properties[$i]['ID']}; $properties[$i]['LINKED_OBJECT'] = trim(${'linked_object'.$properties[$i]['ID']}); - + global ${'linked_property'.$properties[$i]['ID']}; $properties[$i]['LINKED_PROPERTY'] = trim(${'linked_property'.$properties[$i]['ID']}); - + global ${'linked_method'.$properties[$i]['ID']}; $properties[$i]['LINKED_METHOD'] = trim(${'linked_method'.$properties[$i]['ID']}); - + SQLUpdate('miio_commands', $properties[$i]); - + $old_linked_object = $properties[$i]['LINKED_OBJECT']; $old_linked_property = $properties[$i]['LINKED_PROPERTY']; - + if ($old_linked_object && $old_linked_object != $properties[$i]['LINKED_OBJECT'] && $old_linked_property && $old_linked_property != $properties[$i]['LINKED_PROPERTY']) { removeLinkedProperty($old_linked_object, $old_linked_property, $this->name); } } - + $properties[$i]['VALUE'] = str_replace('",','", ',$properties[$i]['VALUE']); if ($properties[$i]['LINKED_OBJECT'] && $properties[$i]['LINKED_PROPERTY']) { @@ -280,7 +290,6 @@ } else { $out['LAN_KEY'] = ''; } - //$out['LAN_KEY'] = ''; } if ($this->tab == 'help') { diff --git a/modules/xiaomimiio/xiaomimiio.class.php b/modules/xiaomimiio/xiaomimiio.class.php index e36012e..5199aaf 100644 --- a/modules/xiaomimiio/xiaomimiio.class.php +++ b/modules/xiaomimiio/xiaomimiio.class.php @@ -319,22 +319,22 @@ function discover($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(null, $bind_ip, null, $miio_debug); - + // Выполняем broadcast-поиск устройств в локальной сети if ($this->config['API_LOG_DEBMES']) DebMes("Run miIO-discover command", 'xiaomimiio'); $res = $midev->discover(); if ($this->config['API_LOG_DEBMES']) DebMes("End miIO-discover command", 'xiaomimiio'); - + if ($res) { // Обрабатываем результат поиска $reply = $midev->data; - + if ($reply != '') { if ($this->config['API_LOG_DEBMES']) DebMes("Reply = $reply", 'xiaomimiio'); @@ -342,7 +342,7 @@ function discover($ip = '') { $count_devices = count($all_devices); if ($this->config['API_LOG_DEBMES']) DebMes("Current count of devices $count_devices", 'xiaomimiio'); $found_devices = json_decode($reply, true); - + if (is_array($found_devices['devices'])) { foreach($found_devices['devices'] as $dev) { $dev = json_decode($dev, true); @@ -350,26 +350,26 @@ function discover($ip = '') { $device_type_code = $dev['devicetype']; $device_serial = $dev['serial']; $token = $dev['token']; - + if (preg_match('/^[0fF]+$/', $token)) $token = ''; - + if (preg_match('/^[0fF]+$/', $device_type_code) || preg_match('/^[0fF]+$/', $device_serial)) { if ($this->config['API_LOG_DEBMES']) DebMes("Device $ip has wrong type code $device_type_code and serial number $device_serial", 'xiaomimiio'); continue; } - + //TO-DO: новые сравниваются по sid и devcode, но если устройство было добавлено вручную, то эти параметры будут отсутствовать, //соотвественно устройство добавится как новое, а не перезапишет (обновит) добавленно вручную. $dev_rec = SQLSelectOne("SELECT * FROM miio_devices WHERE DEVICE_TYPE_CODE='$device_type_code' AND SERIAL='$device_serial'"); - + if ($dev_rec['ID']) { // Если устройство уже есть в БД, то обновим его IP, токен и свойство online $dev_rec['IP'] = $ip; if ($token != '') $dev_rec['TOKEN'] = $token; - + 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']) { @@ -377,7 +377,7 @@ function discover($ip = '') { break; } } - + $this->processCommand($dev_rec['ID'], 'online', 1); } else { // Если устройство нет в БД, то добавим его @@ -389,13 +389,13 @@ 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']; + $midev->token = $dev_rec['TOKEN']; if ($midev->getInfo(time())) { if ($midev->data != '') { $info = json_decode($midev->data, true); @@ -405,25 +405,32 @@ function discover($ip = '') { } } } - + $dev_rec['ID'] = SQLInsert('miio_devices', $dev_rec); - - if ($dev_rec['DEVICE_TYPE'] != '') { + + // Базовые метрики устройств + $this->processCommand($dev_rec['ID'], 'online', 1); + $this->processCommand($dev_rec['ID'], 'command', ''); + $this->processCommand($dev_rec['ID'], 'message', ''); + + if ($dev_rec['DEVICE_TYPE'] != '') { $this->requestStatus($dev_rec['ID']); if (($dev_rec['DEVICE_TYPE'] == 'lumi.gateway.v3') || ($dev_rec['DEVICE_TYPE'] == 'lumi.acpartner.v3')) { $this->processCommand($dev_rec['ID'], 'add_program', ''); $this->processCommand($dev_rec['ID'], 'del_program', ''); } - if ($dev_rec['DEVICE_TYPE'] == 'chuangmi.ir.v2') { + if ($dev_rec['DEVICE_TYPE'] == 'chuangmi.ir.v2' || $dev_rec['DEVICE_TYPE'] == 'lumi.acpartner.v3') { $this->processCommand($dev_rec['ID'], 'ir_play', ''); } if ($dev_rec['DEVICE_TYPE'] == 'xiaomi.wifispeaker.v1') { $this->processCommand($dev_rec['ID'], 'vol_up', ''); $this->processCommand($dev_rec['ID'], 'vol_down', ''); } + if ($dev_rec['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + $this->processCommand($dev_rec['ID'], 'power', ''); + $this->processCommand($dev_rec['ID'], 'load_power', ''); + } } - - $this->processCommand($dev_rec['ID'], 'online', 1); } } } @@ -539,12 +546,17 @@ function requestStatus($device_id) { } } elseif (($device_rec['DEVICE_TYPE'] == 'lumi.gateway.v3') || ($device_rec['DEVICE_TYPE'] == 'lumi.acpartner.v3')) { // - $this->addToQueue($device_id, 'get_prop_fm', '[]'); + if ($device_rec['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + $this->addToQueue($device_id, 'get_device_prop', '["lumi.0","ac_power"]'); + } + $this->addToQueue($device_id, 'get_prop_fm', '[]'); if ($this->view_mode == 'propupd_miio_devices') { $this->addToQueue($device_id, 'get_lumi_dpf_aes_key', '[]'); $this->addToQueue($device_id, 'get_zigbee_channel', '[]'); } $this->addToQueue($device_id, 'get_channels', '{"start":0}'); + //TODO: $this->addToQueue($device_id, 'get_channels', '{"start":10}'); + // Если станций больше 10, 20. } elseif ($device_rec['DEVICE_TYPE'] == 'philips.light.ceiling') { // $props = explode(',', MIIO_PHILIPS_LIGHT_CEILING_PROPS); @@ -755,12 +767,12 @@ function edit_miio_devices(&$out, $id) { */ function delete_miio_devices($id) { - + $rec = SQLSelectOne("SELECT * FROM miio_devices WHERE ID='$id'"); - + SQLExec("DELETE FROM miio_commands WHERE DEVICE_ID='" . $rec['ID'] . "'"); SQLExec("DELETE FROM miio_devices WHERE ID='" . $rec['ID'] . "'"); - + } /** @@ -806,13 +818,18 @@ function propertySetHandle($object, $property, $value) { //что может быть неприемлемо. //$this->requestStatus($properties[$i]['DEVICE_ID']); } elseif ($properties[$i]['TITLE'] == 'power') { - // Команда на включение и выключение - if ($value) { - $this->addToQueue($properties[$i]['DEVICE_ID'], 'set_power', '["on"]'); - } else { - $this->addToQueue($properties[$i]['DEVICE_ID'], 'set_power', '["off"]'); - } - // TO-DO: Если у-во yeelight, то используем дополнительные опции команды (effect, duration, mode). + // Команда на включение и выключение + if ($properties[$i]['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + $method = 'toggle_plug'; + } else { + $method = 'set_power'; + } + if ($value) { + $this->addToQueue($properties[$i]['DEVICE_ID'], $method, '["on"]'); + } else { + $this->addToQueue($properties[$i]['DEVICE_ID'], $method, '["off"]'); + } + // TO-DO: Если у-во yeelight, то используем дополнительные опции команды (effect, duration, mode). } elseif ($properties[$i]['TITLE'] == 'buzzer') { // Команда на включение и выключение пищалки if ($value) { @@ -861,9 +878,14 @@ function propertySetHandle($object, $property, $value) { $this->addToQueue($properties[$i]['DEVICE_ID'], 'set_usb_off', '[]'); } } elseif ($properties[$i]['TITLE'] == 'ir_play') { - // Команда для отправки IR-кода - $this->addToQueue($properties[$i]['DEVICE_ID'], 'miIO.ir_play', '{"freq":38400,"code":"' . $value . '"}'); - //{"id":1,"method":"miIO.ir_play","params":{"freq":38400,"code":"Z6VHABACAABE...QA="}} + // Команда для отправки IR-кода + if ($properties[$i]['DEVICE_TYPE'] == 'chuangmi.ir.v2') { + $this->addToQueue($properties[$i]['DEVICE_ID'], 'miIO.ir_play', '{"freq":38400,"code":"' . $value . '"}'); + } + else if ($properties[$i]['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + $this->addToQueue($properties[$i]['DEVICE_ID'], 'send_ir_code', '["' . $value . '"]'); + } + //{"id":1,"method":"miIO.ir_play","params":{"freq":38400,"code":"Z6VHABACAABE...QA="}} } elseif ($properties[$i]['TITLE'] == 'snm') { // Установить фиксированные сцены (1-Яркий, 2-ТВ, 3-тёплый, 4-ночь) if ($value < 1) $value = 1; @@ -1021,9 +1043,7 @@ function propertySetHandle($object, $property, $value) { $this->addToQueue($properties[$i]['DEVICE_ID'], 'remove_channels', '{"chs":[{"id":' . $value . ',"url":"' . $ch_url . '","type":0}]}'); } } - - SQLExec("UPDATE miio_commands SET VALUE='".DBSafe($value)."' WHERE ID=".$properties[$i]['ID']); - //TO-DO: также обновлять поле UPDATED + SQLExec("UPDATE miio_commands SET VALUE='" . DBSafe($value) . "', UPDATED='" . date('Y-m-d H:i:s') . "' WHERE ID=" . $properties[$i]['ID']); } } } @@ -1036,11 +1056,11 @@ function propertySetHandle($object, $property, $value) { * * @access private */ - + function processCommand($device_id, $command, $value, $params = 0) { - + $cmd_rec = SQLSelectOne("SELECT * FROM miio_commands WHERE DEVICE_ID=".(int)$device_id." AND TITLE LIKE '".DBSafe($command)."'"); - + if (!$cmd_rec['ID']) { $cmd_rec = array(); $cmd_rec['TITLE'] = $command; @@ -1053,23 +1073,29 @@ function processCommand($device_id, $command, $value, $params = 0) { $cmd_rec['VALUE'] = $value; $cmd_rec['UPDATED'] = date('Y-m-d H:i:s'); SQLUpdate('miio_commands', $cmd_rec); - - if ($old_value == $value) return; - if ($cmd_rec['LINKED_OBJECT'] && $cmd_rec['LINKED_PROPERTY']) { - setGlobal($cmd_rec['LINKED_OBJECT'] . '.' . $cmd_rec['LINKED_PROPERTY'], $value, array($this->name => '0')); - } - - if ($cmd_rec['LINKED_OBJECT'] && $cmd_rec['LINKED_METHOD']) { - if (!is_array($params)) { - $params = array(); - } - $params['VALUE'] = $value; - callMethodSafe($cmd_rec['LINKED_OBJECT'] . '.' . $cmd_rec['LINKED_METHOD'], $params); - } + // Если значение метрики не изменилось, то выходим. + if ($old_value == $value) return; + + // Иначе обновляем привязанное свойство. + if ($cmd_rec['LINKED_OBJECT'] && $cmd_rec['LINKED_PROPERTY']) { + setGlobal($cmd_rec['LINKED_OBJECT'] . '.' . $cmd_rec['LINKED_PROPERTY'], $value, array($this->name => '0')); + } + + // И вызываем привязанный метод. + if ($cmd_rec['LINKED_OBJECT'] && $cmd_rec['LINKED_METHOD']) { + if (!is_array($params)) { + $params = array(); + } + $params['VALUE'] = $value; + $params['OLD_VALUE'] = $old_value; + $params['NEW_VALUE'] = $value; + + callMethodSafe($cmd_rec['LINKED_OBJECT'] . '.' . $cmd_rec['LINKED_METHOD'], $params); + } } - + /** * processMessage * @@ -1132,12 +1158,10 @@ function processMessage($message, $command, $device_id) { } } } elseif ($device['ID']) { - + $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') || ($device['DEVICE_TYPE'] == 'lumi.acpartner.v3')) { if ($command == 'get_prop_fm' && is_array($data['result'])) { foreach($data['result'] as $key => $value) { @@ -1153,6 +1177,11 @@ function processMessage($message, $command, $device_id) { if ($command == 'get_zigbee_channel' && is_array($data['result'])) { $res_commands[] = array('command' => 'zigbee_channel', 'value' => $data['result'][0]); } + if ($device['DEVICE_TYPE'] == 'lumi.acpartner.v3') { + if ($command == 'get_device_prop' && is_array($data['result'])) { + $res_commands[] = array('command' => 'load_power', 'value' => $data['result'][0]); + } + } } elseif ($device['DEVICE_TYPE'] == 'yeelink.light.mono1' && $command == 'get_prop' && is_array($data['result'])) { $props = explode(',', MIIO_YEELIGHT_WHITE_BULB_PROPS); $i = 0; diff --git a/scripts/cycle_xiaomimiio.php b/scripts/cycle_xiaomimiio.php index 34f0966..f335c9d 100644 --- a/scripts/cycle_xiaomimiio.php +++ b/scripts/cycle_xiaomimiio.php @@ -3,7 +3,7 @@ * Xiaomi miIO Cycle * @author * @copyright 2017-2018 Agaphonov Dmitri aka skysilver (c) -* @version 1.8b +* @version 1.8.5b */ chdir(dirname(__FILE__) . '/../'); @@ -92,11 +92,7 @@ if($dev->msgSendRcv($queue[$i]['METHOD'], $queue[$i]['DATA'], $msg_id)) { $reply = $dev->data; } else { - if ($cycle_debug) echo date('H:i:s') . ' Reply: device not answered' . PHP_EOL; $reply = '{"error":"Device not answered"}'; - $url = BASE_URL.'/ajax/xiaomimiio.html?op=process&command='.urlencode($queue[$i]['METHOD']).'&device_id='.$queue[$i]['DEVICE_ID'].'&message='.urlencode($reply); - getURLBackground($url, 0); - if ($cycle_debug) echo date('H:i:s') . ' Background processing of the response is started' . PHP_EOL; } } diff --git a/templates/xiaomimiio/action_admin.html b/templates/xiaomimiio/action_admin.html index 5554c42..47ff021 100644 --- a/templates/xiaomimiio/action_admin.html +++ b/templates/xiaomimiio/action_admin.html @@ -156,7 +156,7 @@