Как управлять яндекс-лампочкой в обход апи яндекса?

Здравствуйте. Имеется несколько яндексовских лампочек. Пытаюсь сделать систему, которая будет подстраивать свет в зависимости от происходящего на мониторе, но получается большая задержка из-за того, что приходится переключать свет через яндексовское апи. Существуют ли способы как-то обойти этот этап и обращаться к лампочке через роутер в обход апи яндекса ?
  • Вопрос задан
  • 2765 просмотров
Решения вопроса 1
@justslipknot Автор вопроса
Как выяснилось, яндекс лампочки - это ребрендированная Tuya лампочка. У Tuya есть локальный протокол и модуль для Home Assistant. Но я решил вопрос немного иначе:
  1. Устанавливаем приложение Smart Life или Tuya Home (оба совместимы с яндекс лампами)
  2. Сбрасываем настройки лампочек и добавляем их в приложении Smart Life / Tuya Home
  3. Регистрируем приложение на платформе Tuya. Инструкция есть в этом репозитории.
    Пояснение
    Этот шаг нам нужно проделать, чтобы получить Local Key, который требуется для шифрования и расшифровки запросов (Local Key, как я понял, обновляется после сброса настроек). Инструкция, как быстро добавить устройства в приложение платформы Tuya так же представлено в репозитории

  4. Выбираем библиотеку для работы с Tuya local api. Я выбрал вот эту библиотеку для C#. На GitHub странице этой библиотеки есть инструкция по работе с Tuya local api.
  5. Реализуем нужный нам функционал


Небольшой топорный пример из моего тестового проекта:
Поиск устройств Tuya в сети

// Эти данные можно получить на странице вашего приложения на платформе Tuya.
var accessId = "<access id>";
var apiSecret = "<api secret>";

// Сканируем сеть на наличие доступных устройств Tuya. 
// Хранение найденных устройств реализуется как душе угодно

var scanner = new TuyaScanner();
scanner.OnNewDeviceInfoReceived += (sender, info) =>
{
   // логика сохранения найденных устройств 
};


Получение Local Key


Самый важный этап.
Пример взят из репозитория библиотеки
var api = new TuyaApi(region: TuyaApi.Region.CentralEurope, accessId: ACCESS_ID, apiSecret: API_SECRET);
var devices = await api.GetAllDevicesInfoAsync(anyDeviceId: DEVICE_ID);
foreach(var device in devices)
{
    Console.WriteLine($"Device: {device.Name}, device ID: {device.Id}, local key: {device.LocalKey}");
}


Отправка команд устройству

var device = new TuyaDevice("<IP адрес>", "<local key>", "<device id>");

// Пример команды включения лампочки
// Метод FillJson автоматически подставляет нужные параметры, поэтому сразу пишем запрос.
// Про методы DPS можно почитать в официальной документации Tuya
var onCommand = device.FillJson("{\"dps\":{\"20\":true}}");

var request = device.EncodeRequest(TuyaCommand.CONTROL, onCommand );

// Посылаем сигнал. Если устройство не ответит, то падает исключение 
var encodedResponse = await device.SendAsync(request);
var response = device.DecodeResponse(encodedResponse);



Далее остаётся разобраться с кодами команд и можете контролировать лампы как вам угодно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы