Функции для управления гирляндами Twinkly
В преддверии Нового Года на первое место выходит всяческая тематика, связанная с этим всеми любимым праздником. Очень хочется, чтобы все новогодние гирлянды работали и радовали глаз, когда семья дома, но не потребляли электроэнергию и свой ресурс, когда никого нет дома или все спят. В этом случае помогают смарт-розетки, коорые включаются и отключаются по алгоритмам, заданным в Majordomo. Но вот тут прикупил себе "Умную" гирлянду Twinkly. Описывать ее не буду, все есть в интернете, поэтому сразу перейду к описанию интеграции гирлянды в умный дом.
Можно было не заморачиваться и вотнуть ее в смарт-розетку, но ведь гирлянда-то "умная"! Пошарив по инету, нашел неофицальное API на основе реверс-инжиниринга. Ну раз есть API, значит можно сделать и модуль! Правда выяснилось, что все упраление сводится к включению/выключению и установке яркости. Все остальные настройки делаются со смартфона. Тогда с модулем решил не заморачиваться а просто написал пару функций, закинул их в MDM и построил управление на них. Чем и делюсь с сообществом.
Итак, создаем в папке lib в каталоге с Majordomo файл twinkly.php со следующим содержимым:
<?php
function twinkly($address, $command = 0){
$auth = twinklycnt($address, 1);
$token = $auth['authentication_token'];
twinklycnt($address, 2, $token, $auth['challenge-response']);
if($command > 1) $res = twinklycnt($address, 4, $token, $command);
else $res = twinklycnt($address, 3, $token, $command);
return $res;
}
function twinklycnt($address, $step, $token = '', $data = ''){
if($step == 1) {
$path = "/xled/v1/login";
$challenge = base64_encode(random_bytes(32));
$post = '{"challenge":"'.$challenge.'"}';
}else if($step == 2){
$path = "/xled/v1/verify";
$post = '{"challenge-response":"'.$data.'"}';
}else if($step == 3){
$path = "/xled/v1/led/mode";
if($data == 1) $post = '{"mode":"playlist"}';
else $post = '{"mode":"off"}';
}else if($step == 4){
$path = "/xled/v1/led/out/brightness";
$post = '{"mode":"enabled","value":'.$data.'}';
}
$ch = curl_init('http://'.$address.$path);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Content-Type: application/json;charset=UTF-8', 'X-Auth-Token: '.$token));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$html = curl_exec($ch);
curl_close($ch);
return(json_decode($html, true));
}
В итоге получаем в MDM функцию twinkly() с двумя параметрами: IP адрес контроллера и команда.
Команда может принимать значения: 1 - включить, 0 - выключить, 2-100 - яркость. Яркость запоминается контроллером даже после выключения.
Например:
twinkly("192.168.1.200", 1); - включить гирлянду с адресом 192.168.1.200;
twinkly("192.168.1.200", 0); - выключить гирлянду с адресом 192.168.1.200;
twinkly("192.168.1.200", 50); - установить яркость на 50% на гирлянде с адресом 192.168.1.200;
Иркутск, Россия
На форуме: V.A.S.t