Доброго времени суток, уважаемые читатели нашего мини журнальчика! Как обычно с Вами Corvych (бывший Corvax47)!
Как Вы знаете, я очень люблю делать банальные вещи чуточку умными, параллельно помогая своему дедушке по кирпичику строить “Умный Дом”.
Всё начиналось с поиска основы – с базиса – серверного ПО.
На рынке Open Source есть несколько решений:
- OpenHAB – сложный в понимании пользователю, но простой в настройке (ОпенХАБеры, не бросайтесь помидорами)
- Domoticz – стар настолько, насколько сложен в понимании.
- ioBroker – не пробовал, но интерфейс сразу не понравился
- MajorDomo – не понравился, слишком сложный и медленный (спасибо PHP)
- Home Assistant – очень красивый, много готовых интеграций, но настройка без программирования не обойдётся.
Установив каждую из них, остановил свой выбор на Home Assistant. Зацепила гибкость системы, блестящее и удобное мобильное приложение, а именно с ним будет основное взаимодействие. Да, основной язык YAML, но к нему быстро привыкаешь. Основные вещи есть в документации, а благодаря широкому комьюнити, точно не останешься без помощи: на официальном форуме собираются целые консорциумы по решению проблемы.
В Home Assistant интегрируется буквально ВСЁ: от банального датчика движения, до автомобильной телематики (Pandora/Starline) и термостата ZONT (про него выйдет отдельный выпуск через неделю).
Теперь перейдём к самому банному – датчику температуры.
Задача: сделать датчик температуры в баню с интеграцией в Home Assistant.
Казалось бы, можно поставить любой ZigBee-совместимый датчик температуры и влажности (да, обычно они комбо). Тут всплывает две проблемы: смена батареек, риск плавления корпуса датчика и “мозгов”. Исходя из этого, готовое устройство должно иметь питание от розетки и выносную часть – “мозги” снаружи, сенсор внутри.
К сожалению, подобных сенсоров на ZigBee основе нет…
Тут-то и начинается рубрика “Очумелые Ручки”: в роли пластиковой бутылки и скотча будут легендарная и любимая ESP8266 и самый точный для неё сенсор температуры на проводе – DS18B20 с металлическим наконечником.
Всё это можно заказать как с Ozon, дороже, но быстрее (две шавермы или шаурмы, если Вы с Москвы), так и с AliExpress – дешевле, но медленнее.
Схема запайки представлена ниже:
Для подключения сенсора к контроллеру нужен резистор на 4.7КΩ, его запаиваем между питанием 5 Вольт и информационным пином D4, который выставлен в коде.
Спаяли. Теперь прошивочку надобно залить в контроллер…
А прошивочка-то вот: готовенькая. Можно глянуть на GitHub, а можно и отсюда скопировать
Весь код ниже:
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PubSubClient.h>
#define wifi_ssid "YOUR-WiFI-SSID" //смени на своё
#define wifi_password "YOUR-WIFI-PASS" //смени на своё
#define mqtt_server "YOUR-MQTT-BROKER-ADDRESS" //смени на своё
#define mqtt_user "YOUR-MQTT-USER" //смени на своё
#define mqtt_password "YOUR-MQTT-PASS" //смени на своё
#define temperature_topic "sensor/temperature" //можешь не трогать, а можешь сменить
OneWire oneWire(2);
DallasTemperature ds(&oneWire);
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
bool checkBound(float newValue, float prevValue, float maxDiff) {
return !isnan(newValue) &&
(newValue < prevValue - maxDiff || newValue > prevValue + maxDiff);
}
long lastMsg = 0;
float temp = 0.0;
float hum = 0.0;
float diff = 1.0;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 1000) {
lastMsg = now;
ds.requestTemperatures();
float newTemp = ds.getTempCByIndex(0);
if (checkBound(newTemp, temp, diff)) {
temp = newTemp;
Serial.print("New temperature:");
Serial.println(String(temp).c_str());
client.publish(temperature_topic, String(temp).c_str(), true);
}
}
}
Прошивочку залили, пора-бы в Home Assistant интегрировать.
В configuration.yaml записываем эти строки:
mqtt:
broker: localhost # Если MQTT сервер установлен не на машине, где стоит Home Assistant, впиши этот адрес сюда
username: YOUR-MQTT-USER
password: YOUR-MQTT-PASSWORD
sensor:
platform: mqtt
name: "Temperature Sensor" # Поставь Имя своему серверу
state_topic: "sensor/temperature" # Если менял топик, поменяй и здесь
qos: 0
unit_of_measurement: "ºC" # Мы Русские, замеры в цельсиях у нас
Теперь можно вывести показания на панель в виде красивого графика
Теперь можно делать весёлые интеграции с другими устройствами, вот пару идей:
- Зажигать лампочку, когда баня готова
- Присылать уведомление на телефоны, все смарт-телевизоры о том, что баня готова
- Присылать уведомление, когда температура опускается, для её поддержания
- Уведомление о том, что давно не затапливали баню.
Это ограничивается Вашим воображением!