Skip to content

Commit

Permalink
1.9.8b
Browse files Browse the repository at this point in the history
* Добавлена поддержка удлинителя **Mi (Chingmi) Smart Power Strip 5 Plugs**:
  * получение текущего статуса и параметров (power, temperature, current, power_consume_rate, voltage);
  * включение/выключение (power);
  * встроенная справка по метрикам.
* Добавлена поддержка потолочного светильника **Yeelight Square  Ceiling Light**:
  * получение текущего статуса и параметров (power, bright, ct, nl_br, color_mode, flow_params, flowing);
  * включение/выключение (power);
  * регулировка яркости (bright);
  * регулировка цветовой температуры (ct);
  * управление режимом ночника (nl_br);
  * управление цветовыми сценариями (flow);
  * встроенная справка по метрикам.
* Для настольной лампы **Philips EyeCare Smart Desk Lamp** добавлено управление режимом **eyecare**.
* Для пылесосов добавлены метрики остатка расходников (в часах) - main_brush_work_life, side_brush_work_life, filter_work_life, sensor_dirty_life.
* Добавлены изображения и ID некоторых zigbee-устройств.
* В перечень устройств внесена сушилка **Mi Mr. Bond M1 Pro**.
* Обновлены readme.md и About.
  • Loading branch information
skysilver-lab committed Mar 11, 2019
1 parent cce56ca commit 19e8468
Show file tree
Hide file tree
Showing 21 changed files with 266 additions and 61 deletions.
47 changes: 26 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@

В основе модуля лежит библиотека **[php-miio](https://github.com/skysilver-lab/php-miio)**.

Обсуждение модуля на **[Форуме](https://majordomo.smartliving.ru/forum/viewtopic.php?f=5&t=4863)**.
Обсуждение модуля на **[Форуме](https://mjdm.ru/forum/viewtopic.php?f=5&t=4863)**.

Модуль в **[Connect](https://connect.smartliving.ru/tasks/51.html)**.

![miio](https://kb.smartliving.ru/wp-content/uploads/2018/07/module_miio.gif)
![miio](https://kb.mjdm.ru/wp-content/uploads/2018/07/module_miio.gif)

### Поддерживаемые устройства
> По состоянию на август 2018 года.
> По состоянию на март 2019 года.
1. Шлюз ZigBee ***Mi Smart Home Gateway 2***
2. Шлюз ZigBee ***Aqara AC Companion Gateway***
Expand All @@ -31,22 +31,27 @@
12. Лампочки ***Philips Rui Chi Candle Light Bulb***
13. Настольная лампа ***Mi LED Desk Lamp***
14. Потолочный светильник ***Yeelight Ceiling Light***
15. Потолочный светильник ***Philips EyeCare Smart Ceiling Lamp***
16. Светодиодная лента ***Yeelight LED Lightstrip***
17. Удлинитель (6 розеток) ***Mi Smart Power Strip 6 Plugs***
18. Увлажнитель воздуха ***Mi Air Humidifier***
19. Увлажнитель воздуха ***Mi Air Humidifier 2***
20. Очиститель воздуха ***Mi Air Purifier 2S***
21. IR-контроллер ***Mi IR Remote 360***
22. WiFi-колонка ***Mi Internet Speaker***
23. Ночник ***Yeelight Bedside Lamp***
24. Светильник (спот) ***Philips Zhirui Downlight***

![devices](https://connect.smartliving.ru/cms/data_images/152_image.png)
15. Потолочный светильник ***Yeelight Square Ceiling Light***
16. Потолочный светильник ***Philips EyeCare Smart Ceiling Lamp***
17. Светодиодная лента ***Yeelight LED Lightstrip***
18. Удлинитель (5 розеток) ***Mi (Chingmi) Smart Power Strip 5 Plugs***
19. Удлинитель (6 розеток) ***Mi Smart Power Strip 6 Plugs***
20. Увлажнитель воздуха ***Mi Air Humidifier***
21. Увлажнитель воздуха ***Mi Air Humidifier 2***
22. Очиститель воздуха ***Mi Air Purifier 2S***
23. IR-контроллер ***Mi IR Remote 360***
24. WiFi-колонка ***Mi Internet Speaker***
25. Ночник ***Yeelight Bedside Lamp***
26. Светильник (спот) ***Philips Zhirui Downlight***
27. Напольный вентилятор ***Mi Smart Fan SA1***

![devices](https://connect.smartliving.ru/cms/data_images/659_image.png)
### Документация по модулю
* [Общие сведения](https://kb.smartliving.ru/xiaomimiio_help/)
* [Установка, обновление, удаление модуля](https://kb.smartliving.ru/xiaomimiio-ustanovka-obnovlenie/)
* [Интерфейс модуля](https://kb.smartliving.ru/xiaomimiio-gui/)
* [Настройка модуля](https://kb.smartliving.ru/xiaomimiio-settings/)
* [Протокол miIO](https://kb.smartliving.ru/xiaomimiio-protocol/)
* [Токены устройств](https://kb.smartliving.ru/xiaomimiio-tokens/)
* [Общие сведения](https://kb.mjdm.ru/xiaomimiio_help/)
* [Установка, обновление, удаление модуля](https://kb.mjdm.ru/xiaomimiio-ustanovka-obnovlenie/)
* [Интерфейс модуля](https://kb.mjdm.ru/xiaomimiio-gui/)
* [Настройка модуля](https://kb.mjdm.ru/xiaomimiio-settings/)
* [Протокол miIO](https://kb.mjdm.ru/xiaomimiio-protocol/)
* [Токены устройств](https://kb.mjdm.ru/xiaomimiio-tokens/)
* [Управление техникой по ИК-каналу](https://kb.mjdm.ru/xiaomi-miio-ir-control/)
* [Управление роботом-пылесосом](https://kb.mjdm.ru/miio-vacuums-control/)
1 change: 0 additions & 1 deletion modules/xiaomimiio/lib/miio.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,6 @@ public function socketWriteRead($msg) {
if ($this->token != NULL) {
if(!$this->miPacket->setToken($this->token)) {
if ($this->debug) echo 'Incorrect tokent format!' . PHP_EOL;
die('Incorrect tokent format!\n');
} else {
if ($this->debug) echo 'Using manually set token - ' . $this->token . PHP_EOL;
}
Expand Down
4 changes: 3 additions & 1 deletion modules/xiaomimiio/miio_devices_edit.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/*
* @author <skysilver.da@gmail.com>
* @copyright 2017-2018 Agaphonov Dmitri aka skysilver <skysilver.da@gmail.com> (c)
* @version 1.9.7b
* @version 1.9.8b
*/

if ($this->owner->name == 'panel') {
Expand Down Expand Up @@ -244,6 +244,8 @@
elseif ($properties[$i]['TITLE'] == 'bl') $properties[$i]['SDEVICE_TYPE'] = 'sensor_state';
elseif ($properties[$i]['TITLE'] == 'ac') $properties[$i]['SDEVICE_TYPE'] = 'sensor_state';
elseif ($properties[$i]['TITLE'] == 'limit_hum') $properties[$i]['SDEVICE_TYPE'] = 'sensor_humidity';
elseif ($properties[$i]['TITLE'] == 'voltage') $properties[$i]['SDEVICE_TYPE'] = 'sensor_voltage';
elseif ($properties[$i]['TITLE'] == 'eyecare') $properties[$i]['SDEVICE_TYPE'] = 'relay';
else $properties[$i]['SDEVICE_TYPE'] = 'sensor_general';
}
}
Expand Down
88 changes: 66 additions & 22 deletions modules/xiaomimiio/xiaomimiio.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
* @package project
* @author <skysilver.da@gmail.com>
* @copyright 2017-2018 Agaphonov Dmitri aka skysilver <skysilver.da@gmail.com> (c)
* @version 1.9.7b
* @version 1.9.8b
*/

define('EXTENDED_LOGGING', 0);
define ('EXTENDED_LOGGING', 0);

define ('MIIO_YEELIGHT_WHITE_BULB_PROPS', 'power,bright,flow_params,flowing');
define ('MIIO_YEELIGHT_COLOR_BULB_PROPS', 'power,bright,ct,rgb,hue,sat,color_mode,flow_params,flowing');
Expand All @@ -26,6 +26,7 @@
define ('MIIO_CHUANGMI_PLUG_V1_PROPS', 'power,temperature,usb_on,wifi_led');

define ('MIIO_ZIMI_POWERSTRIP_2_PROPS', 'power,temperature,current,power_consume_rate,wifi_led');
define ('MIIO_QMI_POWERSTRIP_1_PROPS', 'power,temperature,current,power_consume_rate,voltage');

define ('MIIO_ZHIMI_HUMIDIFIER_PROPS', 'power,humidity,temp_dec,mode,led_b,buzzer');
define ('MIIO_ZHIMI_HUMIDIFIER_2_PROPS', 'power,humidity,temp_dec,mode,depth,speed,dry,use_time,led_b,buzzer,child_lock,limit_hum');
Expand Down Expand Up @@ -588,7 +589,7 @@ function requestStatus($device_id) {
$props[$i] = '"' . $props[$i] . '"';
}
$this->addToQueue($device_id, 'get_prop', '['.implode(',',$props).']');
} elseif ($device_rec['DEVICE_TYPE'] == 'yeelink.light.ceiling1') {
} elseif (($device_rec['DEVICE_TYPE'] == 'yeelink.light.ceiling1') || ($device_rec['DEVICE_TYPE'] == 'yeelink.light.ceiling8')) {
//
$props = explode(',', MIIO_YEELIGHT_CEILING_LIGHT_PROPS);
$total = count($props);
Expand Down Expand Up @@ -620,6 +621,14 @@ function requestStatus($device_id) {
$props[$i] = '"' . $props[$i] . '"';
}
$this->addToQueue($device_id, 'get_prop', '[' . implode(',', $props) . ']');
} elseif ($device_rec['DEVICE_TYPE'] == 'qmi.powerstrip.v1') {
//
$props = explode(',', MIIO_QMI_POWERSTRIP_1_PROPS);
$total = count($props);
for ($i = 0; $i < $total; $i++) {
$props[$i] = '"' . $props[$i] . '"';
}
$this->addToQueue($device_id, 'get_prop', '[' . implode(',', $props) . ']');
} elseif ($device_rec['DEVICE_TYPE'] == 'zhimi.humidifier.v1') {
//
$props = explode(',', MIIO_ZHIMI_HUMIDIFIER_PROPS);
Expand Down Expand Up @@ -1092,9 +1101,16 @@ function propertySetHandle($object, $property, $value) {
} elseif ($properties[$i]['TITLE'] == 'angle_enable') {
// Команда на включение и выключение автоматического поворота вентилятора
if ($value) {
$this->addToQueue($properties[$i]['DEVICE_ID'], 'set_angle_enable', '["on"]');
}else{
$this->addToQueue($properties[$i]['DEVICE_ID'], 'set_angle_enable', '["off"]');
$this->addToQueue($properties[$i]['DEVICE_ID'], 'set_angle_enable', '["on"]');
} else {
$this->addToQueue($properties[$i]['DEVICE_ID'], 'set_angle_enable', '["off"]');
}
} elseif ($properties[$i]['TITLE'] == 'eyecare') {
// Команда на включение и выключение автоматической подстройки яркости
if ($value) {
$this->addToQueue($properties[$i]['DEVICE_ID'], 'set_eyecare', '["on"]');
} else {
$this->addToQueue($properties[$i]['DEVICE_ID'], 'set_eyecare', '["off"]');
}
}

Expand Down Expand Up @@ -1333,10 +1349,21 @@ function processMessage($message, $command, $device_id) {
if ($key == 'state') {
$state_codes = unserialize (MIIO_MIVACUUM_1_STATE_CODES);
if (array_key_exists($value, $state_codes)) $res_commands[] = array('command' => 'state_text', 'value' => $state_codes[$value]);
}
if ($key == 'error_code') {
} else if ($key == 'error_code') {
$error_codes = unserialize (MIIO_MIVACUUM_1_ERROR_CODES);
if (array_key_exists($value, $error_codes)) $res_commands[] = array('command' => 'error_text', 'value' => $error_codes[$value]);
} else if ($key == 'main_brush_work_time') {
$value = round(300 - $value/3600);
$res_commands[] = array('command' => 'main_brush_work_life', 'value' => ($value < 0) ? 0 : $value);
} else if ($key == 'side_brush_work_time') {
$value = round(200 - $value/3600);
$res_commands[] = array('command' => 'side_brush_work_life', 'value' => ($value < 0) ? 0 : $value);
} else if ($key == 'filter_work_time') {
$value = round(150 - $value/3600);
$res_commands[] = array('command' => 'filter_work_life', 'value' => ($value < 0) ? 0 : $value);
} else if ($key == 'sensor_dirty_time') {
$value = round(30 - $value/3600);
$res_commands[] = array('command' => 'sensor_dirty_life', 'value' => ($value < 0) ? 0 : $value);
}
}
} else if ($command == 'get_custom_mode' && is_array($data['result'])) {
Expand Down Expand Up @@ -1379,19 +1406,21 @@ function processMessage($message, $command, $device_id) {
$res_commands[] = array('command' => $key, 'value' => $value);
$i++;
}
} elseif ($device['DEVICE_TYPE'] == 'yeelink.light.ceiling1' && $command == 'get_prop' && is_array($data['result'])) {
$props = explode(',', MIIO_YEELIGHT_CEILING_LIGHT_PROPS);
$i = 0;
foreach($props as $key) {
$value = $data['result'][$i];
if ($key == 'flow_params') $key = 'flow';
if ($key == 'nl_br' && $value != 0) {
$res_commands[3]['value'] = $value; // свойство bright
$res_commands[] = array('command' => $key, 'value' => 1);
} else {
$res_commands[] = array('command' => $key, 'value' => $value);
} elseif (($device['DEVICE_TYPE'] == 'yeelink.light.ceiling1') || ($device['DEVICE_TYPE'] == 'yeelink.light.ceiling8')) {
if ($command == 'get_prop' && is_array($data['result'])) {
$props = explode(',', MIIO_YEELIGHT_CEILING_LIGHT_PROPS);
$i = 0;
foreach($props as $key) {
$value = $data['result'][$i];
if ($key == 'flow_params') $key = 'flow';
if ($key == 'nl_br' && $value != 0) {
$res_commands[3]['value'] = $value; // свойство bright
$res_commands[] = array('command' => $key, 'value' => 1);
} else {
$res_commands[] = array('command' => $key, 'value' => $value);
}
$i++;
}
$i++;
}
} elseif ($device['DEVICE_TYPE'] == 'yeelink.light.lamp1' && $command == 'get_prop' && is_array($data['result'])) {
$props = explode(',', MIIO_YEELIGHT_LAMP_LIGHT_PROPS);
Expand Down Expand Up @@ -1420,14 +1449,29 @@ function processMessage($message, $command, $device_id) {
foreach($props as $key) {
$value = $data['result'][$i];
if ($key == 'current' || $key == 'power_consume_rate') {
if ($value == '' || $value == 'null' || $value == null) $value = '0.00';
if ($value == '' || $value == 'null' || $value == null) $value = '0';
}
if ($key == 'mode') {
if ($value == 'null' || $value == null) $value = '';
}
$res_commands[] = array('command' => $key, 'value' => $value);
$i++;
}
} elseif ($device['DEVICE_TYPE'] == 'qmi.powerstrip.v1' && $command == 'get_prop' && is_array($data['result'])) {
$props = explode(',', MIIO_QMI_POWERSTRIP_1_PROPS);
$i = 0;
foreach($props as $key) {
$value = $data['result'][$i];
if ($key == 'current') {
if ($value == '' || $value == 'null' || $value == null) $value = '0';
else $value = $value/1000;
} elseif ($key == 'voltage') {
if ($value == '' || $value == 'null' || $value == null) $value = '0';
else $value = $value/100;
}
$res_commands[] = array('command' => $key, 'value' => $value);
$i++;
}
} elseif (($device['DEVICE_TYPE'] == 'zhimi.humidifier.v1') || ($device['DEVICE_TYPE'] == 'zhimi.humidifier.ca1')) {
if ($command == 'get_prop' && is_array($data['result'])) {
if ($device['DEVICE_TYPE'] == 'zhimi.humidifier.v1') {
Expand Down Expand Up @@ -1583,7 +1627,7 @@ function DeleteCycleProperties()
if ($object->class_id != 0) {
SQLExec("DELETE FROM properties WHERE ID={$property_id}");
}
}
}
}

SQLExec("DELETE FROM cached_values WHERE KEYWORD LIKE '%{$cycle_name}%'");
Expand Down
6 changes: 3 additions & 3 deletions templates/xiaomimiio/action_admin.html
Original file line number Diff line number Diff line change
Expand Up @@ -178,12 +178,12 @@ <h4 class="modal-title">Xiaomi miIO</h4>
<div class="modal-body">
<div class="float-right">
<img src="../templates/xiaomimiio/milogo.png" width="48" height="48">
<br><br><p><b>v.1.9.7b</b></p>
<br><br><p><b>v.1.9.8b</b></p>
</div>
<p class="float-left">
<#LANG_XIMI_APP_MODULE#><br><br>
<#LANG_XIMI_APP_DOCS#> <a href="https://kb.smartliving.ru/category/moduli-v-majordomo/xiaomi-miio/" target="_blank"><#LANG_XIMI_APP_INKB#></a>.<br>
<#LANG_XIMI_APP_DISCUS#> <a href="https://majordomo.smartliving.ru/forum/viewtopic.php?f=5&t=4863" target="_blank"><#LANG_XIMI_APP_DISCUS2#></a>.<br>
<#LANG_XIMI_APP_DOCS#> <a href="https://kb.mjdm.ru/category/moduli-v-majordomo/xiaomi-miio/" target="_blank"><#LANG_XIMI_APP_INKB#></a>.<br>
<#LANG_XIMI_APP_DISCUS#> <a href="https://mjdm.ru/forum/viewtopic.php?f=5&t=4863" target="_blank"><#LANG_XIMI_APP_DISCUS2#></a>.<br>
<#LANG_XIMI_APP_PROJ#> <a href="https://github.com/skysilver-lab/majordomo-xiaomimiio" target="_blank">Github</a>.<br>
<#LANG_XIMI_APP_PROJ#> <a href="https://connect.smartliving.ru/tasks/51.html" target="_blank">Connect</a>.<br>
</p>
Expand Down
3 changes: 3 additions & 0 deletions templates/xiaomimiio/help/ru/help_mrbond.airer.m1pro.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<br/>
<br/>
<#LANG_XIMI_APP_IN_DEVELOPMENT#>
48 changes: 48 additions & 0 deletions templates/xiaomimiio/help/ru/help_qmi.powerstrip.v1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<br>
<div>
<table border="0" cellpadding="8">
<tr>
<td rowspan="2" style="width:65px">
[#if DEVICE_TYPE!=""#]
<img src="../templates/xiaomimiio/img/small/[#DEVICE_TYPE#].png" height="60px" onError="this.src='../templates/xiaomimiio/img/small/unknown.png'">
[#else#]
<img src="../templates/xiaomimiio/img/small/unknown.png" height="60px">
[#endif#]
</td>
<td style="height:33px;vertical-align:middle"><b>Mi (Chingmi) Smart Power Strip 5 Plugs</b></td>
<td style="height:33px;vertical-align:middle">IP: <b>[#IP#]</b></td>
</tr>
<tr>
<td style="height:33px;vertical-align:middle">Модель: <b>[#DEVICE_TYPE#]</b></td>
<td style="height:33px;vertical-align:middle">Системный ID: <span class="badge">[#ID#]</span></td>
</tr>
</table>
</div>
<br>
<div class="panel-group" id="accordion" style="width:98%">
<div class="panel panel-info">
<div class="panel-heading">
<a data-toggle="collapse" data-parent="#accordion" href="#metrics_help">Описание метрик устройства</a>
</div>
<div class="panel-body collapse" id="metrics_help">
<div style="width:800px">
<table class="table table-hover" align="left">
<thead>
<th>Метрика</th><th>Описание</th><th>Значения</th><th nowrap>Чтение/запись</th>
</thead>
<tbody>
<tr><td><b>power</b></td><td>Включение и выключение питания</td><td>1 и 0</td><td nowrap>Чтение и запись</td></tr>
<tr><td><b>current</b></td><td>Сила тока</td><td>А</td><td>Чтение</td></tr>
<tr><td><b>voltage</b></td><td>Напряжение</td><td>В</td><td>Чтение</td></tr>
<tr><td><b>power_consume_rate</b></td><td>Текущая потребляемая мощность</td><td>Вт</td><td>Чтение</td></tr>
<tr><td><b>temperature</b></td><td>Температура</td><td>С</td><td>Чтение</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<br>
<div>
<a href="?data_source=<#DATA_SOURCE#>" class="btn btn-default"><#LANG_STRING_BACK#></a>
</div>
Loading

0 comments on commit 19e8468

Please sign in to comment.