Очумелые Ручки: Банный Датчик Температуры С Интеграцией В Home Assistant

Доброго времени суток, уважаемые читатели нашего мини журнальчика! Как обычно с Вами 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 – дешевле, но медленнее.

Схема запайки представлена ниже:

Да, я начал работать в Fritzing, очень удобно

Для подключения сенсора к контроллеру нужен резистор на 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" # Мы Русские, замеры в цельсиях у нас

Теперь можно вывести показания на панель в виде красивого графика

Красиво же!

Теперь можно делать весёлые интеграции с другими устройствами, вот пару идей:

  • Зажигать лампочку, когда баня готова
  • Присылать уведомление на телефоны, все смарт-телевизоры о том, что баня готова
  • Присылать уведомление, когда температура опускается, для её поддержания
  • Уведомление о том, что давно не затапливали баню.

Это ограничивается Вашим воображением!