Redmond Ready4Sky API

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Redmond Ready4Sky API

Сообщение sergejey » Пт июн 15, 2018 3:28 pm

Открою тему по работе с устройтвами Redmond через облачное API. Вся технология у них называется Ready4Sky (R4S).

Пока получилось программно сделать сделующее:
* Залогинится с именем пользователя/паролем + получить token для общения с API
* Получить по API информацию о пользователе (/api/user_data/)
* Получить список устройств пользователя (/api/device/user)
* Загрузить общий каталог устройств (/api/device/catalog/)
* Загрузить общий каталог возможных программ для устройств (/api/program/catalog/)

Из менее важного:
* Справочник языков (/api/language/catalog/)
* Список ингридиентов для приготовления (/api/ingredient_mode/catalog/ru/0/)
* Непонятное (/api/commit/last)

Собственно пока всё. Если у кого есть устройства или кто умеет "расковыривать" протоколы связи, то милости прошу продолжить работу или помочь советом. Мне не удалось перехватить команды общения между клиентским приложением и облаком -- всё по SSL идёт и что-то навыков не хватает :) Я использовал Mikrotik в режиме сниффинга с переадресацией пакетов на ноут, на котором через Wireshark смотрел чего происходит.

Для полноценной интеграции (и потом создания модуля) нужно две основные штуки:
* Возможность получать текущие данные устройства
* Возможность запускать определённую программу на устройстве

Под спойлером текущие наработки в виде файла r4s.php -- ложится в корень файлов majordomo (там где config.php), правится имя пользователя и пароль в коде ($r4s_username, $r4s_password) и запускается в браузере. На нём можно всячески экспериментировать.
СпойлерПоказать

Код: Выделить всё

<?php

include_once("./config.php");
include_once("./lib/loader.php");

// connecting to database
$db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME);
include_once("./load_settings.php");

$r4s_username = ''; // ИМЯ ПОЛЬЗОВАТЕЛЯ R4S
$r4s_password = ''; // ПАРОЛЬ


echo "<h1>Login page</h1>";
$url = 'http://content.readyforsky.com/login';
$ch = curl_init();
$tmpfname = ROOT . 'cms/cached/r4s.txt';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);

if (!preg_match('/Logged in as/', $server_output)) {
    if (preg_match('/_csrf_token" value="(.+?)"/is', $server_output, $m)) {
        $csrf_token = $m[1];
    }
    echo "<h1>Submit login</h1>";

    $postFields = array(
        '_csrf_token' => $csrf_token,
        '_username' => $r4s_username,
        '_password' => $r4s_password,
        '_remember_me' => 'on',
        '_submit' => 'Log in',
    );

    $url = 'http://content.readyforsky.com/app.php/login_check';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, 'http://content.readyforsky.com/login');
    curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec($ch);
    curl_close($ch);
    if (!preg_match('/content.readyforsky.com\/app.php\//is', $server_output)) {
        echo "Failed to login";
        exit;
    }
}

echo "<h1>OAuth 1</h1>";
$url = 'http://content.readyforsky.com/oauth/v2/auth?client_id=r4s&redirect_uri=http%3A%2F%2Fclient.android&response_type=code&scope=user';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);

$token_data = array();
if (preg_match('/client.android\?code=([\w]+)/is', $server_output, $m)) {
    echo "<h1>OAuth2</h1>";
    $code = $m[1];
    $url = 'http://content.readyforsky.com/oauth/v2/token?redirect_uri='.urlencode('http://client.android').'&response_type=code&grant_type=authorization_code&code=' . $code . '&client_secret=123&client_id=r4s';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     // bad style, I know...
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec($ch);
    curl_close($ch);
    $token_data=json_decode($server_output,true);
    if (!$token_data['access_token']) {
        echo "Failed to login";
        exit;
    }
}

$data=r4s_api_request('/api/user/current',$token_data); // информация о текущем пользователе
print_r($data);
//$data=r4s_api_request('/api/user_data/',$token_data); // ???
//$data=r4s_api_request('/api/device/user',$token_data); // список устройств пользователя

//$data=r4s_api_request('/api/device/catalog/',$token_data); // каталог устройств
//$data=r4s_api_request('/api/program/catalog/',$token_data); // Список программ готовки?
//$data=r4s_api_request('/api/language/catalog/',$token_data); // Список языков
//$data=r4s_api_request('/api/commit/last',$token_data);  // ???
//$data=r4s_api_request('/api/ingredient_mode/catalog/ru/0/',$token_data); // Список ингридиентов?


function r4s_api_request($request,$token_data,$method = 'GET', $params = 0) {
    if (!$token_data['access_token']) {
        //cannot get data. relogin?
    }
    $url = 'http://content.readyforsky.com'.$request;
    //echo "<h4>$method $url </h4>";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);

    $authorization = "Authorization: Bearer ".$token_data['access_token'];
    $headers=array('Accept: application/json' , $authorization );
    if ($method == 'POST') {
        curl_setopt($ch, CURLOPT_POST, 1);
        $data_string = json_encode($params);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        $headers[]='Content-Type: application/json, charset=utf-8';
        $headers[]='Content-Length: ' . mb_strlen($data_string,'utf8');
    }
    /*
    if (is_array($headers)) {
        echo "<h4>".print_r($headers)."<hr>$data_string</h4>";
    }
    */
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     // bad style, I know...
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    //curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $server_output = curl_exec($ch);
    if (curl_errno($ch)) {
        $errorInfo = curl_error($ch);
        $info = curl_getinfo($ch);
        echo "Curl error $info";
    }
    curl_close($ch);

    //dprint($server_output);

    $data=json_decode($server_output,true);
    return $data;
}

// closing database connection
$db->Disconnect();
За это сообщение автора sergejey поблагодарили (всего 3):
directman66 (Сб июн 16, 2018 9:50 am) • ipc2002 (Вт июн 19, 2018 12:01 pm) • Igor.P (Пт июн 22, 2018 12:34 pm)
Рейтинг: 3.49%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: Redmond Ready4Sky API

Сообщение directman66 » Пт июн 15, 2018 3:38 pm

Чайник сяоми работает по этому-же протоколу? Вроде где-то проскакивала подобная информация.

Сергей, через какой механизм работаешь с BLE? Или это именно взаимодействие с облаком и нужен телефон-шлюз с установленным https://play.google.com/store/apps/deta ... y&hl=en_US в квартире ?

Если так, то имхо полная ерунда, и кудо более интересно нарисовать свой шлюз на базе esp32, чем уже и занимаются некоторые.
Последний раз редактировалось directman66 Пт июн 15, 2018 3:44 pm, всего редактировалось 1 раз.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Redmond Ready4Sky API

Сообщение sergejey » Пт июн 15, 2018 3:43 pm

directman66 писал(а):
Пт июн 15, 2018 3:38 pm
Чайник сяоми работает по этому-же протоколу? Вроде где-то проскакивала подобная информация.

Сергей, через какой механизм работаешь с BLE?
Нет, никакого BLE :) Хочу сделать более универсально и без дополнительных устройств -- работаю напрямую с облаком. Все описанные протоколы как раз через Bluetooth работают, а я хочу чтобы система "прикидывалась" клиентским приложением и общалась с облачным API.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: Redmond Ready4Sky API

Сообщение directman66 » Пт июн 15, 2018 3:45 pm

Придется смартфон в сети в качестве шлюза держать, имхо не лучший вариант.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Redmond Ready4Sky API

Сообщение sergejey » Пт июн 15, 2018 3:58 pm

directman66 писал(а):
Пт июн 15, 2018 3:45 pm
Придется смартфон в сети в качестве шлюза держать, имхо не лучший вариант.
Дома уже несколько Android-устройств в качестве стационарных терминалов и на одном из них крутится R4S шлюз, так что не проблема по большому счёту... Кроме того, у них в каталоге есть устройства вроде wifi розетки, которые работают как шлюз для других девайсов.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Redmond Ready4Sky API

Сообщение olehs » Пт июн 15, 2018 7:03 pm

А у меня вот что-то ниодно стационарное устройство не хочет ставать шлюзом (не подключается, видимо все старье - не то BLE:) ), потому и взялся за создание шлюза на ESP32. Да и не везде добивают эти терминалы.
Aven
Сообщения: 529
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 154 раза

Re: Redmond Ready4Sky API

Сообщение Aven » Сб июн 16, 2018 6:02 pm

У них еще свой шлюз есть.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Redmond Ready4Sky API

Сообщение sergejey » Пн июн 18, 2018 9:33 am

olehs писал(а):
Пт июн 15, 2018 7:03 pm
А у меня вот что-то ниодно стационарное устройство не хочет ставать шлюзом (не подключается, видимо все старье - не то BLE:) ), потому и взялся за создание шлюза на ESP32. Да и не везде добивают эти терминалы.
Шлюз на ESP тоже нужно :) Пока с облаком ещё вопрос, так что других вариантов и нет особо.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: Redmond Ready4Sky API

Сообщение directman66 » Вт июн 19, 2018 2:26 pm

по EPS32 нашел интересный проект https://github.com/shmuelzon/esp32-ble2mqtt
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Silowar
Сообщения: 85
Зарегистрирован: Пт фев 06, 2015 10:19 am
Благодарил (а): 16 раз
Поблагодарили: 9 раз

Re: Redmond Ready4Sky API

Сообщение Silowar » Вт июн 19, 2018 4:08 pm

Недавно была статья на Хабре, про то как ковыряли протокол чайника:

Разбираем протокол чайника Redmond G200S и подключаем его к HomeAssistant https://habr.com/post/412583/

Сергей, посмотри, может поможет
Ответить