Всегда мечтал о добавлении ума своему дому. Помнится когда то давно была проводная технология X10. Это когда устройства обменивались по сетевым проводам. Девайсы стоили овердофига. Я даже один, леграндовский вроде, купил. На этом все и заглохло.Несколько раз пытался вернуться к этой теме. В конце концов остановился на системе Home assistant. И хотя я совсем не программист, разобраться в ней для меня оказалось не так уж сложно. Потом пошли девайсы на Esphome. И дом начал обрастать всякими управляемыми штучками. При всех своих достоинствах, у HA есть и куча недостатков. И периодическая боль, когда после очередного обновления все идет наперекосяк. А недавно я приобрел Sprut.hub. Сервер умного дома, который умеет работать локально, имеет множество интеграций. Сначала конечно он был на некоторое время забыт. За это время пару обновлений прилетело. И наконец то я решил переезжать. Так исторически сложилось, что у меня нет ни одного девайса на Zigbee. На данный момент работаю над устранением этой досады. Но я не об этом. Как включить в прошивке MQTT известно. Проблем с этим не возникло. В самом хабе нужно сначала создать и включить контроллер MQTT. Дальше идем в вики и смотрим какие шаблоны есть. В основном датчики. И есть интеграция BLE шлюза. Отлично с него и начнем. В вики написано, для того чтоб устройство определилось, нужно добавить префикс spruthub_ к имени. Esphome кстати не любит символ подчеркивания, и сразу ругается, но скомпилить даёт. (Кстати в вики этот момент исправлен, теперь там написано что префикс нужен spruthub-. Похоже скоро опять перепрошивать девайсы. В чатах кстати проскальзывало, что скоро будет HA discovery, так что надеюсь до нового года девайсы EspHome будут залетать нативно. Вносим поправки в код: добавляем префикс к имени, кстати, так как поменялось имя, то обязательно в разделе wifi надо добавить use_address и указать старое имя, чтоб компилятор нашел. У меня все девайсы сидят на фикированных IP поэтому я указал его. Комментим раздел api, и добавляем раздел mqtt.
esphome:
name: spruthub_bletracker
comment: "134"
esp32:
board: esp-wrover-kit
framework:
type: esp-idf
version: latest
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
use_address: 192.168.168.167
manual_ip:
static_ip: 192.168.168.167
gateway: 192.168.168.1
subnet: 255.255.255.0
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Bletracker Fallback Hotspot"
password: "123456789"
logger:
# Enable Home Assistant API
#api:
# password: "tracker"
mqtt:
broker: 192.168.168.168
port: 44444
discovery: false
reboot_timeout: 0s
Компилим и обновляем прошивку теркера. В логе пишется об успешном подключении к mqtt. Далее идем в спрутхаб. Заходим в настройки, и там выбираем контроллеры:
Следующим кандидатом на переезд была метеостанция. Я о ней писал статью. Но у меня в метеостанции датчик SHT20. А такого датчика в перечне встроенных шаблонов нет. Значит будем делать свой шаблон. Оказалось это нетривиальная задача, хаб очень требователен к отступам и всяким запятым. Пришлось побегать с флешкой от ноута к хабу. В конце кноцов получился такой шаблон:
{
"name": "Датчик давления температуры",
"manufacturer": "ESPHome",
"model": "SHT20",
"services": [
{
"type": "TemperatureSensor",
"characteristics": [
{
"type": "CurrentTemperature",
"link": {
"topicSearch": "spruthub-(.*)/sensor/sht20_temperature/state",
"topicGet": "spruthub-(1)/sensor/sht20_temperature/state"
}
}
]
},
{
"type": "HumiditySensor",
"characteristics": [
{
"type": "CurrentRelativeHumidity",
"link": {
"topicGet": "spruthub-(1)/sensor/sht20_humidity/state"
}
}
]
},
{
"type": "C_AtmosphericPressureSensor",
"characteristics": [
{
"type": "C_CurrentAtmosphericPressure",
"link": {
"topicGet": "spruthub-(1)/sensor/sht20_pressure/state"
}
}
]
}
]
}
Есть маленький нюанс: датчик давления у меня bme280, и он есть в шатных шаблонах. Но тогда он в хабе будет как отдельное устройство. Поэтому я его обозвал в прошивке esphome как sht20_pressure. И вуаля, все три датчика вместе:
С датчиками разобрались. Следующие на очереди выключатели света. И вот тут ожидал подвох: в mqtt компонент light общается с помощью json. Я не стал с этим долго разбираться, просто в прошивке исправил light на switch. Дальше написал шаблон:
{
"manufacturer": "Gelmer",
"model": "ESPhome",
"status": "Done",
"services": [
{
"type": "Switch",
"characteristics": [
{
"type": "On",
"link": {
"type": "String",
"topicSearch": "spruthub-(.*)/switch/(.*)/state",
"topicGet": "spruthub-(1)/switch/(2)/state",
"topicSet": "spruthub-(1)/switch/(2)/command",
"map": {
"false": "OFF",
"true": "ON"
}
}
}
]
}
]
}
Перезагрузил шаблоны, дернул контроллер, и свич появился в интерфейсе как выключатель. И вот здесь меня ждал облом. Статус девайса видит, но не управляет. MQTT explorer говорит что топик command с хаба идет. В логах esphome пусто. Очень долго я ковырялся с этим. В конце концов выработался алгоритм: нужно выключить и включить сеть wifi чтоб девайс переподключился без перезагрузки. После этого дергаем контроллер и, о чудо, можем управлять свичом из хаба. Я перепробовал множество вариантов от ресета хаба, до дергания девайса по питанию. Алгоритм стопроцентно таков как я описал выше. Забегая вперед скажу что все мои девайсы начали управлятся только после таких действий. Кстати в чатах как то были споры по поводу домофона, что в прошивке нужно включать в топиках retain, но в esphome он по умолчанию включен. Видимо эта проблема и была. Какая то особенность в esphome видимо. Перепрошил все выключатели, и они успешно переехали в хаб. Следующим у меня был кондиционер, о нем я тоже писал статью. Опять же esphome управляется по ИК. Шаблон для него я подсмотрел у Cool.stick.
{
"manufacturer": "Gelmer",
"model": "ESPhome",
"status": "Done",
"services": [
{
"type": "Thermostat",
"characteristics": [
{
"type": "TargetTemperature",
"link": {
"type": "String",
"topicSearch": "spruthub-(.*)/climate/(.*)/target_temperature/state",
"topicGet": "spruthub-(1)/climate/(2)/target_temperature/state",
"topicSet": "spruthub-(1)/climate/(2)/target_temperature/command"
},
"minValue": 17,
"maxValue": 30,
"minStep": 1
},
{
"type": "CurrentTemperature",
"link": {
"type": "String",
"topicGet": "spruthub-(1)/climate/(2)/current_temperature/state"
}
},
{
"type": "TargetHeatingCoolingState",
"link": {
"type": "String",
"topicGet": "spruthub-(1)/climate/(2)/mode/state",
"topicSet": "spruthub-(1)/climate/(2)/mode/command",
"map": {
"OFF": "OFF",
"HEAT": "HEAT",
"COOL": "COOL",
"AUTO": "AUTO",
"FAN_ONLY": "FAN_ONLY",
"DRY": "DRY"
}
}
},
{
"type": "CurrentHeatingCoolingState",
"link": {
"type": "String",
"topicGet": "spruthub-(1)/climate/(2)/mode/state"
}
},
{
"type": "C_FunSpeed",
"link": {
"type": "String",
"topicGet": "spruthub-(1)/climate/(2)/fan_mode/state",
"topicSet": "spruthub-(1)/climate/(2)/fan_mode/command",
"map": {
"AUTO": "AUTO",
"LOW": "LOW",
"MEDIUM": "MEDIUM",
"HIGH": "HIGH"
}
}
},
{
"type": "SwingMode",
"link": {
"type": "String",
"topicGet": "spruthub-(1)/climate/(2)/swing_mode/state",
"topicSet": "spruthub-(1)/climate/(2)/swing_mode/command",
"map": {
"OFF": "OFF",
"SWING_ENABLED": "SWING_ENABLED",
"SWING_HORIZONTAL": "SWING_HORIZONTAL",
"SWING_VERTICAL": "SWING_VERTICAL"
}
}
}
]
}
]
}
Ну и оставшийся девайс конечно же умный домофон, от одного известного проекта )) Я долго с ним тянул, потому как в НА у меня он оповещал в телегу с фотографией (об этом тоже есть статья). Автооткрытие включалось по местоположению через приложение, ну и диалог в Алисе на открытие домофона был.
Шаблон к нему сделан главным тестировщиком @bigmanekb. Залетел в хаб без проблем. Правда немного шаблон я доработал. У меня к плате домофона подключен датчик открытия двери (геркон) и датчик открытия замка (тоже геркон). Ещё в нём же датчик движения.
Вроде бы всё. Но выключатели вместо лампочек не давали покоя. Решил разбираться с json. Перепрошил один из выключателей с компонентом light. С помощью MQTT explorer стал разбираться со структурой топика. Причем компонент лампочки может быть представлен в нескольких разных типах. Собрал топики в табличку по типам компонента:
RGB
{
"color_mode": "rgb",
"state": "OFF",
"brightness": 255,
"color": {
"r": 255,
"g": 255,
"b": 255
}
}
Monochromatic
{
"color_mode": "brightness",
"state": "OFF",
"brightness": 255,
"color": {}
}
Binary
{
"color_mode": "onoff",
"state": "OFF",
"color": {}
}
Color temperature
{
"color_mode": "color_temp",
"state": "OFF",
"brightness": 255,
"color": {},
"color_temp": 152
}
cold White warm white
{
"color_mode": "cwww",
"state": "OFF",
"brightness": 255,
"color": {
"c": 255,
"w": 255
}
}
Начал изучать тему, и писать шаблон. Здесь конечно случился казус, я как то случайно умудрился в процессе исправления шаблона сохранить его содержимое в шаблон датчиков. И, блин, меняю что нибудь в шаблоне, а в хабе ничего не меняется, весь мозг сломал. Ребят в каналах дергал. Пока не обратил внимание что один из датчиков отвалился. Получается применялся другой шаблон )) Потом снова казус: topicGet сделал с тире, а topicSet с символом подчеркивания. Косяк который в глаза не бросается но нервы портит). В общем в результате долгих разборок получился такой шаблон:
{
"manufacturer": "Gelmer",
"model": "ESPhome",
"status": "Done",
"services": [
{
"type": "Lightbulb",
"characteristics": [
{
"type": "On",
"link": {
"type": "String",
"topicSearch": "spruthub-(.*)/light/(.*)/state",
"topicGet": "spruthub-(1)/light/(2)/state",
"topicSet": "spruthub-(1)/light/(2)/command",
"inFunc": "JSON.parse(value).state === 'ON'",
"outFunc": "value ? JSON.stringify({state: 'ON'}) : JSON.stringify({state: 'OFF'})"
}
},
{
"type": "Hue",
"link": {
"type": "Color",
"topicGet": "spruthub-(1)/light/(2)/state",
"topicSet": "spruthub-(1)/light/(2)/command",
"inFunc": "JSON.parse(value).color",
"outFunc": "JSON.stringify({color: value})"
}
},
{
"type": "Brightness",
"link": {
"type": "String",
"topicGet": "spruthub-(1)/light/(2)/state",
"topicSet": "spruthub-(1)/light/(2)/command",
"inFunc": "JSON.parse(value).brightness",
"outFunc": "JSON.stringify({brightness: value})",
"maxValue": 255
}
},
{
"type": "Saturation"
}
]
}
]
}
Лампочка включается и управляется яркость. Цвет пока не победил. И то что есть в шаблоне это один из множества вариантов, и к сожалению не работает. И на том спасибо. Лампочки теперь в интерфейсе лампочки. На будущее конечно хочется использовать параметр color_mode и включать отображение нужных параметров в интерфейсе. Думаю в конце концов допилим совместными усилиями.Вердикт таков: Esphome прекрасно залетает в хаб. Вполне можно юзать. В чатах часто просят поддержку WiFi в хабе, вот она пожалуйста!
Надо сказать что есть и другие прошивки под Esp: Espeasy, Tasmota, HAA Ravencore. Из них первые два работают с MQTT, а последняя нативно залетает в Хоум кит. Так что такие девайсы можно подтянуть обратным ХК. Но это уже другая тема.
Думаю закруглиться на этом. Про автоматизации можно написать в следующей статье, хотя там ничего такого особенного нет.
Поднимать ХА после обновлений замаялся? Так у EspHome тоже, бывает, апдейты рушатъ многое...
А Спрутхаб выбрал, за то что это законченное коробочное решение. После обновлений системы становится удобнее и лучше в работе.
А кондиционер управляется.
И через спрутхаб и через алису