vashal

 
<<< Back

Управление гирляндами Twinkly

Функции для управления гирляндами 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;

Discuss (1) (4)

See also:
2024-06-27 Есть ли жизнь на PHP8?
2023-05-17 Алиса, заведи машину!
2022-09-29 PHP cURL на Windows и штатной установке
2020-02-15 Конфиг nginx
2019-06-13 gps-trace.ru

Иркутск, Россия

На форуме: V.A.S.t