Два года назад был куплен чайник Redmond Skykettle RG-G210S из-за надписи на корпусе "управляй с помощью Алисы". Кто же знал, что для управления нужно купить еще док-станцию. Ввиду того, что чайником я особо не пользуюсь, мысли об его интеграции я задвинул в "дальний ящик", но сейчас видимо, его время пришло.
Начало пути
Прогуглив "в лоб", на Хабре обнаружил лишь способы интеграции в Homekit через bash скрипты. Концепция следующая. Вы устанавливаете на имеющийся у вас контроллер несколько файлов, которые позже "дергаете" через плагин CMD для Homebridge. В файлах хранятся скрипты, устанавливающие соединение с чайником и отправляющие ему команды на изменение режима, включения, выключения и т.д. Способ рабочий, у многих он работает годами и они довольны. Если вам интересно, можете почитать тут, тут и тут. Мне данного функционала показалось мало, поэтому я решил его расширить.
В распоряжении у меня был контроллер Wirenboard 6, расположенный недалеко от кухни, поэтому радиуса работы bluetooth адаптера вполне хватало.
Подключаемся к контроллеру по SSH. Устанавливаем сканер Bluetooth-устройств поблизости при помощи команды:
apt-get install bluez-tools
После окончания установки вводим команду:
hcitool lescan
После того как мы узнали адрес нашего чайника, формируем 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
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 подставку с весами, которая блокировала включение при отсутствии воды.
Бойлер выключается через час после любого включения. По энергопотреблению можно понять что в бойлере кончилась вода и что он закипел. Пробрасывается в хомкит и алису через NodeRed и уведомления в телеграм. Также можно прибиндить беспроводные кнопки Aqara, чтобы удобно было включать не доставая телефон. Итого 5 строчек кода и 15 мин времени. Переплачивать за умный чайник не вижу смысла.