1. Подготовительный этап.
1.1. Скачиваем и распаковываем архив с гитхаба https://github.com/skysilver-lab/php-mi ... master.zip.
1.2. На сервере MajorDoMo в каталоге modules создаем каталог miio и копируем в него файлы:
- miio.class.php
- mipacket.class.php
- philipsbulb.class.php
При необходимости mirobot.class.php и philipseyecare2.class.php копируем сюда же.
1.3. Для вновь созданных папки и файлов назначаем владельца (обычно www-data) и права (0644). Если ОС Windows, то пропускаем этот шаг.
2. Объект, свойства и методы.
Для управления лампой я воспользовался стандартным классом Relays.
2.1. В классе Relays создаем объект PhilipsLamp.
2.2. На уровне объекта создаем свойства ip, token и bright. Заполняем свойства ip и token корректными значениями.
2.3. На уровне класса создаем метод getStatus и setBright. На уровне объекта редактируем эти методы, вписывая следующий код:
Метод getStatus
Код: Выделить всё
include_once(DIR_MODULES.'miio/philipsbulb.class.php');
$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = false;
$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);
if ($bulb->getStatus()) {
if (isset($bulb->status['power']) && $bulb->status['power'] != '') {
if ($bulb->status['power'] == 'off') { $this->setProperty('status', 0); $this->setProperty('statusText', 'Выключено'); }
if ($bulb->status['power'] == 'on') { $this->setProperty('status', 1); $this->setProperty('statusText', 'Включено'); }
}
if (isset($bulb->status['bright']) && $bulb->status['bright'] != '') $this->setProperty('bright', $bulb->status['bright']);
if (isset($bulb->status['cct']) && $bulb->status['cct'] != '') $this->setProperty('cct', $bulb->status['cct']);
} else say("Статус настольной лампы не получен. Ошибка: $bulb->error", 0);
Код: Выделить всё
include_once(DIR_MODULES.'miio/philipsbulb.class.php');
$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = true;
$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);
if ($bulb->setBrightness($this->getProperty('bright'))) {
say('Задана яркость настольной лампы ' . $this->getProperty('bright'), 0);
} else say("Яркость настольной лампы не задана. Ошибка: $bulb->error", 0);
Метод turnOn
Код: Выделить всё
include_once(DIR_MODULES.'miio/philipsbulb.class.php');
$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = false;
$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);
if ($bulb->powerOn()) {
$this->setProperty('status', 1);
$this->setProperty('statusText', 'Включено');
say('Настольная лампа включена', 0);
} else say("Настольная лампа не включена. Ошибка: $bulb->error", 0);
Код: Выделить всё
include_once(DIR_MODULES.'miio/philipsbulb.class.php');
$ip = $this->getProperty('ip');
$token = $this->getProperty('token');
$bind_ip = null;
$debug = false;
$bulb = new philipsBulb($ip, $bind_ip, $token, $debug);
if ($bulb->powerOff()) {
$this->setProperty('status', 0);
$this->setProperty('statusText', 'Выключено');
say('Настольная лампа выключена', 0);
} else say("Настольная лампа не выключена. Ошибка: $bulb->error", 0);
2.6 Важно! miIO-устройства никак не оповещают локальный сервер об изменении своего статуса. Предположительно, такой функционал есть для облака Xiaomi, но нам это ничем не поможет, т.к. протокол работы с облаком на данный момент не расшифрован. Поэтому, если включить лампу через Mihome на смартфоне, то MajorDoMo никак не узнает, что лампа включена. Для этого нужно делать периодический опрос состояния устройства, например, добавив ежеминутный вызов метода getStatus в таймер onNewMinute:
Код: Выделить всё
cm('PhilipsLamp.getStatus');
Тут даже расписывать нечего, все просто. Создаем элемент switch, привязываем к нему метод switch нашего объекта PhilipsLamp для включения и выключения лампы, и свойство status для контроля состояния лампы (включена или выключена). Для управления яркостью создаем элемент sliderbox, привязываем к нему свойство bright объекта PhilipsLamp, а в поле код пишем вызов метода setBright:
Код: Выделить всё
cm('PhilipsLamp.setBright');