Статья

Путь от глупого чайника Redmond к умному

Два года назад был куплен чайник Redmond Skykettle RG-G210S из-за надписи на корпусе "управляй с помощью Алисы". Кто же знал, что для управления нужно купить еще док-станцию. Ввиду того, что чайником я особо не пользуюсь, мысли об его интеграции я задвинул в "дальний ящик", но сейчас видимо, его время пришло.

Начало пути

Прогуглив "в лоб", на Хабре обнаружил лишь способы интеграции в Homekit через bash скрипты. Концепция следующая. Вы устанавливаете на имеющийся у вас контроллер несколько файлов, которые позже "дергаете" через плагин CMD для Homebridge. В файлах хранятся скрипты, устанавливающие соединение с чайником и отправляющие ему команды на изменение режима, включения, выключения и т.д. Способ рабочий, у многих он работает годами и они довольны. Если вам интересно, можете почитать туттут и тут. Мне данного функционала показалось мало, поэтому я решил его расширить.

В распоряжении у меня был контроллер Wirenboard 6, расположенный недалеко от кухни, поэтому радиуса работы bluetooth адаптера вполне хватало.

С помощью ForkLift закинул данные скрипты, на контроллер. Вы можете использовать любое приложение для подключения по SFTP.

Подключаемся к контроллеру по SSH. Устанавливаем сканер Bluetooth-устройств поблизости при помощи команды:

auto
Копировать
apt-get install bluez-tools

После окончания установки вводим команду:

auto
Копировать
hcitool lescan
DD:FB:BF:5B:B6:96 - Mac адрес нашего чайника.

После того как мы узнали адрес нашего чайника, формируем 6 команд. Для включения, выключения, и считывания текущего статуса чайника.

  • bash connect.sh DD:FB:BF:5B:B6:96 auth
  • bash connect.sh DD:FB:BF:5B:B6:96 query
  • bash connect.sh DD:FB:BF:5B:B6:96 queryone
  • bash connect.sh DD:FB:BF:5B:B6:96 keeptemp 
  • bash connect.sh DD:FB:BF:5B:B6:96 on
  • bash connect.sh DD:FB:BF:5B:B6:96 off

Для взаимодействия с чайником необходимо установить с ним связь. У модели RK-G210S ввод чайника в режим сопряжение выполняется кнопкой включения/выключения.

После сопряжения, отправляем команду на чтение статуса чайника и получаем следующий ответ:

К сожалению, готовые скрипты, которые я нашел, не отображали текущую температуру чайника, и в целом выдавали малое количество информации. Поэтому вооружившись стандартным приложением, начал по байту разбирать ответ.

После чего доработал те скрипты, что у меня были, и на выходе получил следующий результат:

По запросу status выводится вся информация по чайнику, в формате обьекта{"kettle_state":0, //Текущее состояние 0 - Выкл / 2 - Вкл"program":0, //Текущий режим"sound":1, //Звуковое опощение"current_temp":25, //Текущая температура в Dec"target_temp": 0, //Целевая температура в Dec"speed_change_color":30, //Скорость изменения цвета (в секундах)booiling_time:0 //Время кипячения (от -5 до 5)}
По запросу statustics{"Turnung_on_the_device": 70, //Количество включений устройтсва"Consumption":37.292, //Количество потребленной электроэнергии в kWh"Work_time": 16:57:04 //Время работы ЧЧ:ММ:СС}
По запросу  on чайник включится. По запросу off чайник выключится.
По запросу lightIndication 1 либо 0 включится либо выключится световая индикация о том, что время на чайнике и на контроллере синхронизируются.
По запросу targettemp 35...90 мы запишем целевую температуру. И включим режим поддержания температуры.
По запросу nightlight мы включаем режим ночника. По запросу boiling мы включаем режим кипячения. По запросу boilingtargettemp мы включаем режим кипячения и поддержания температуры.
Скачать готовый скрипт вы можете по ссылке

Новый виток

К сожалению, скрипт иногда терял соединение с чайником, иногда команды на включение и выключение "терялись". Особенно при отключении чайника от док-станции для залива воды. Поэтому я принял решение продолжить поиски готовых решений. И как оказалось не зря. 

На GitHub нашел прошивку для контроллера ESP32 - ESP32-R4sGate-for-Redmond. Прошивка имеет формат .bin, и для ее установки я использовал программу esphome-flasher и windows ноутбук, ввиду того, что мой ноутбук на m1pro просто не видит esp, подключенную к com порту. Более подробную инструкцию по настройке можно прочитать тут. Кратко расскажу о процессе. 1. Прошиваем ESP32.2. Создаем гостевую сеть на вашем роутере с названием: "r4s" и паролем: "12345678".3. После создания сети, ESP сама автоматически подключится к точке доступа.4. Нам необходимо определить ее IP адрес.5. Ввести IP адрес в браузер.6. В настройках необходимо ввести имя и пароль от основной Wi-Fi сети.7. Ожидаем подключение ESP к основной Wi-Fi сети.8. Переходим в раздел "Settings" 9. Выбираем тип нашего чайника (например, у меня модель RG-G210S, но выбрал тип RK-G240S).

Обязательно включите "offline Response" - чтобы знать, когда чайник не отвечает. И "true/false Response" - чтобы статусы вкл и выкл присылались в формате true и false, ввиду того, что по моим наблюдениям ON и OFF работают нестабильно. В качестве mqtt брокера (192.168.69.207), я использовал Wirenboard, ввиду того, что он является центром моего дома и все автоматизации, сценарии у меня работают через него.

Плата перезагрузится и если вы указали верные настройки, то она подключится к вашему mqtt брокеру. Прошивка постоянно опрашивает чайник и мгновенно публикует все изменения в mqtt.

Интеграция в Wirenboard

Для интеграции нам понадобиться движок правил WB-Rules. Заходим в раздел WB-Rules и создаем новое правило SkykettleESP32.js

javascript
Копировать
var mac = "ddfbbf5bb696" //Указываем mac адрес нашего чайника
defineVirtualDevice("Skykettle_1", {
  title: "Skykettle_1",
  cells: {
    "Кипячение": {
    type: "switch",
    order: 0,
    value: false,
    },
    "Поддержание температуры": {
    type: "switch",
    order: 1,
    value: false,
    },
    "Текущая температура": {
    type: "temperature",
    order: 2,
    value: 0,
    },
    "Целевая температура": {
    type: "range",
    max: 90,
    order: 3,
    value: 35
    },
    "Звук": {
    type: "switch",
    order: 4,
    value: false,
    },
    "Время кипения": {
    type: "range",
    max: 5,
    order: 5,
    value: 0,
    },
    "Ночник": {
    type: "switch",
    order: 6,
    value: false,
    },
    "Цвет": {
    type: "rgb",
    order: 7,
    value: "0;0;0",
    },
  }
});


trackMqtt("r4s0/{}/temp".format(mac), function(message){
  dev["Skykettle_1/Текущая температура"] = parseInt(message.value);
});

trackMqtt("r4s0/{}/boil".format(mac), function(message){
  if(message.value === "true"){
  	dev["Skykettle_1/Кипячение"] = true
  }
  else if(message.value === "false"){
  	dev["Skykettle_1/Кипячение"] = false
  }
});
defineRule("Состояние", {
    whenChanged: "Skykettle_1/Кипячение",
    then: function (newValue) {
      switch(newValue){
        case true:
          publish("r4s0/{}/boil".format(mac), "true");
        break;
        case false:
          publish("r4s0/{}/boil".format(mac), "false");
        break;
      }
    }
});


trackMqtt("r4s0/{}/heat_temp".format(mac), function(message){
  dev["Skykettle_1/Целевая температура"] = parseInt(message.value);
});
defineRule("Целевая температура", {
    whenChanged: "Skykettle_1/Целевая температура",
    then: function (newValue) {
		publish("r4s0/{}/heat_temp".format(mac), newValue.toString());
    }
});

trackMqtt("r4s0/{}/beep".format(mac), function(message){
  if(message.value === "true"){
  	dev["Skykettle_1/Звук"] = true
  }
  else if(message.value === "false"){
  	dev["Skykettle_1/Звук"] = false
  }
});
defineRule("Звук", {
    whenChanged: "Skykettle_1/Звук",
    then: function (newValue) {
      switch(newValue){
        case true:
          publish("r4s0/{}/beep".format(mac), "true");
        break;
        case false:
          publish("r4s0/{}/beep".format(mac), "false");
        break;
      }
    }
});

//heat
trackMqtt("r4s0/{}/heat".format(mac), function(message){
  if(message.value == "true"){
  	dev["Skykettle_1/Поддержание температуры"] = true
  }
  else if(message.value == "false"){
  	dev["Skykettle_1/Поддержание температуры"] = false
  }
});
defineRule("Поддержание температуры", {
    whenChanged: "Skykettle_1/Поддержание температуры",
    then: function (newValue) {
      switch(newValue){
        case true:
          publish("r4s0/{}/heat".format(mac), "true");
        break;
        case false:
          publish("r4s0/{}/heat".format(mac), "false");
        break;
      }
    }
});

trackMqtt("r4s0/{}/nightlight".format(mac), function(message){
  if(message.value === "true"){
  	dev["Skykettle_1/Ночник"] = true
  }
  else if(message.value === "false"){
  	dev["Skykettle_1/Ночник"] = false
  }
});
defineRule("Ночник", {
    whenChanged: "Skykettle_1/Ночник",
    then: function (newValue) {
      switch(newValue){
        case true:
          publish("r4s0/{}/nightlight".format(mac), "true");
        break;
        case false:
          publish("r4s0/{}/nightlight".format(mac), "false");
        break;
      }
    }
});


var rgbggg
trackMqtt("r4s0/{}/nightlight_rgb".format(mac), function(message){
  rgbggg = (message.value).replace(",",";");
  rgbggg = rgbggg.replace(",",";");
  dev["Skykettle_1/Цвет"] = rgbggg;
});


defineRule("Цвет", {
    whenChanged: "Skykettle_1/Цвет",
    then: function (newValue) {
      var rgb = newValue.replace(";",",");
      rgb = rgb.replace(";",",");
      publish("r4s0/{}/nightlight_rgb".format(mac), rgb);
    }
});

Вставляем в наше правило код выше, изменяете переменную mac на мак адрес вашего чайника и нажимаем кнопку "сохранить". Заходим во вкладку "Устройства" и наблюдаем наше виртуальное устройство "чайник".

Интеграция в Яндекс.Умный дом через Node-Red

Инструкцию по установке и базовым принципам node-red можно найти тут. Для интеграции чайника из Node-Red в Яндекс.Умный дом, была использована нода: node-red-contrib-alice

Разберем каждый узел подробно. Добавляем в поток узел on/off.

Нажимаем на наш узел. Нам необходимо создать новое устройство.

Выбираем тип smartKettle, указываем имя и учетную запись вашего яндекс аккаунта.

Нажимаем "Добавить".

Наш узел сразу же привяжется к свежесозданному устройству. Для интеграции чайника я решил выключить "Disable other controls of the device is turned". Данный параметр необходим, чтобы в интерфейсе вы могли видеть включен чайник или выключен (Обратная связь). Команды на включение и выключение чайника вызываются через "Алиса, вскипяти чайник". А у нашего чайника помимо кипячения есть другие режимы, которые нужно активировать без кипячения. А в случае, если у нас чайник выключен, то другие режимы активировать мы просто не можем.
Разберем каждый узел подробнее.

Включение и выключение

Для включения и выключения нам понадобятся узлы: mqtt in /  mqtt out / change / on_off(yandex)

Датчик температуры

Для передачи информации с датчика температуры нам понадобятся узлы:  mqtt in / function / sensor(yandex)

Целевая температура

Дпя изменения целевой температуры нам понядобятся следующие узлы: mqtt in / function / range(yandex) / mqtt out

Ночник

Для включения / выключения режима Ночник нам понадобятся следующие узлы: mqtt in / change / toggle (yandex) / mqtt out

Поддержание температуры

Для включения / выключения режима поддержания температуры нам понадобятся следующие узлы: mqtt in / change / toggle (yandex) / mqtt out

Управление цветом

Для управления цветом нам понадобятся следующие узлы: mqtt in / function / color (yandex) / mqtt outОбщий вид всех использованных для интеграции узлов.

После создания всех связей между узлами, нажимаем кнопку "Развернуть".

Далее добавляем Node Red в приложении Яндекс.Умный дом.

1. Открываем приложение.2. Нажимаем на "+".3. Нажимаем "Устройство умного дома".4. В поиске выбираем серис Node Red Home.5. Входим под той учетной записью, что и в Node Red.6. Нажимаем "Продолжить".7. Нажимаем "Обновить список устройств".8. Изменяем имя и добавляем чайник в комнату.

Итог

На момент написания статьи, данная связка (ESP+Wirenboard+NodeRed) работает стабильно на протяжении месяца. Позволяя вставать с кровати к уже нагретому чайнику.


В целом интересно, но:
- мало плюсов по отношению к имеющейся интеграции HA со Sky Kettle.
- нет защиты от включения без воды.

Для себя печатал для 216S подставку с весами, которая блокировала включение при отсутствии воды.
там встроенная защита есть на случай отсутствия воды
Всё верно, я специально его включал "насухую", вырубился сразуже. Опасно изначально делать чайник с удаленным управлением без такой защиты.
пока по CTRL+F в статье не ищется "налив", "вод" - статья не имеет никакого смысла.

Вернуться назад
Вернуться назад