Найти тему
Smart home Russia

Домашняя метеостанция v2.1. Добавляем полезные данные. [ESPHome, Home Assistant, LCD2004, ESP8266]

Запустив версию 2.0, довольно скоро подоспело первое дополнение. Нет, это не исправления, а полноценное дополнение. Вводим переменную, которая будет нам сообщать о "ощущениях"

Translation to English is here. Также основной канал в telegram

Оставлю ссылки на старые публикации, т.к. данные будут использоваться из них:

Все в дисплее было хорошо, все-то он показывал, что нужно и как нужно, но хотелось добавить полезности. И идея пришла сама собой. Вот вопрос, -20 при 95% влажности и при 45% влажности, это одно и то же? Для меня совсем нет. Но глядя в 6 утра на дисплей я не очень понимаю, насколько мне будет холодно. Я решил ввести переменную, которая будет говорить о том, насколько мне будет комфортно. Я пока не знаю формулу для высчитывания, но решил начать с того, что нужно взять текущую температуру, умножить на влажность, умножить на 2 и разделить на 100. При такой элементарной формуле -20 при 50% влажности превратится в значение -20. При 75% получится -30 и при 100% влажности результат будет -40. Соответственно наоборот тоже работает.

Пока я игрался с этим коэффициентом и вбивал формулы, esp решила, что ей пора начать глючить и пришлось поиграть с настройками WiFi и SPI шины.

А еще у меня произошло то, на что жаловались многие, ESP-шка забыла про правильный расчет времени и все мои старания шли лесом. Пришлось немного покопаться в расчетах часовых поясов.

Все это и стало версией 2.1. Итак, конфигурация:

esphome:
name: 4x20

esp32:
board: lolin_s2_mini
framework:
type: arduino

logger:

api:
encryption:
key: ""

ota:
password: ""

Естественно, пароли свои я затер, не забудьте их вставить.

Вот тут появились первые нововведения. Для устранения проблем с подключением я отключил режим сохранения энергии и быстрое подключение. Не могу оценить эти действия, но ESP вернулась в сеть:

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: none
fast_connect: yes

А вот тут появилось второе нововведение. Расчет поясов не хотел происходить верно, поэтому часовую зону прописал не через прямое указание на город, а через UTC. Еще приоритет понизил до состояния -100:

time:
- platform: sntp
id: my_time
setup_priority: -100
timezone: UTC-4

Третье нововведение было в том, что скан новых устройств отключен, частоту шины поднял со стандартного значения до 800кГц и приоритет также выставил низкий. Пусть работает с шиной уже когда WiFi подключен:

i2c:
sda: 35
scl: 33
scan: False
frequency: 800kHz
setup_priority: -100

В случаи с дисплеем, была добавлена всего одна строка, выводить переменную "JS", которая и будет сообщать о ощущениях, которые мы испытаем от погоды на улице.

display:
- platform: lcd_pcf8574
dimensions: 20x4
id: mydisplay
address: 0x3F
setup_priority: -100
user_characters:
#Sun1
- position: 0
data:
- 0b00100
- 0b00001
- 0b10010
- 0b00100
- 0b00100
- 0b10010
- 0b00001
- 0b00100
#Sun2
- position: 1
data:
- 0b00100
- 0b10000
- 0b01001
- 0b00100
- 0b00100
- 0b01001
- 0b10000
- 0b00100
#Cloud1
- position: 2
data:
- 0b00010
- 0b01101
- 0b10000
- 0b10000
- 0b01000
- 0b01100
- 0b00111
- 0b00000
#Cloud2
- position: 3
data:
- 0b10110
- 0b01001
- 0b00001
- 0b00010
- 0b00010
- 0b00100
- 0b11000
- 0b00000
#Storm
- position: 4
data:
- 0b00010
- 0b00100
- 0b01000
- 0b10111
- 0b11101
- 0b00010
- 0b00100
- 0b01000
#Smow
- position: 5
data:
- 0b10100
- 0b01000
- 0b10100
- 0b00000
- 0b00000
- 0b00101
- 0b00010
- 0b00101
#Rain
- position: 6
data:
- 0b01001
- 0b10010
- 0b00000
- 0b01001
- 0b10010
- 0b00000
- 0b01001
- 0b10010
#empty
- position: 7
data:
- 0b00000
- 0b00000
- 0b00000
- 0b00000
- 0b00000
- 0b00000
- 0b00000
- 0b00000

lambda: |-
it.strftime(0, 0, "%d %B %A ", id(my_time).now());
it.strftime(0, 1, "%H:%M:%S Week %U ", id(my_time).now());
it.printf(3, 3, "%.1f", id(current_temp).state);
it.printf(9, 3, "%.1f", id(current_humidity).state);
it.printf(14, 3, "%.1f", id(js).state);
it.print(3, 2, id(current_weather).state);
if (id(current_weather).state == "sunny") {it.print(0, 2, "\x08\x01");}
if (id(current_weather).state == "cloudy") {it.print(0, 2, "\x02\x03");}
if (id(current_weather).state == "rainy") {it.print(0, 2, "\x02\x03"); it.print(0, 3, "\x06\x06");}
if (id(current_weather).state == "partlycloudy") {it.print(0, 2, "\x08\x01"); it.print(0, 3, "\x02\x03");}

Если с сенсорами ha у нас нет изменений, то и менять нечего

sensor:
- platform: homeassistant
id: current_temp
entity_id: sensor.strt_tmprtr_temperature

- platform: homeassistant
id: current_humidity
entity_id: sensor.strt_tmprtr_humidity

А вот он тот самый коэффицент ощущений и его расчет. Я решил, что итог будет в цельсиях и классифицироваться как температура, так мне проще:

- platform: template
name: "JS"
id: js
lambda: |-
return id(current_temp).state * 2 * id(current_humidity).state * 0.01;
accuracy_decimals: 1
device_class: "temperature"
unit_of_measurement: "°C"

Данная переменная также подтянулась в Home Assistant и там ее тоже можно использовать. Удобно для уведомлений в телеграмме.

Ну и в конце все без изменений:

text_sensor:
- platform: homeassistant
id: current_weather
name: "Weather Forecast From Home Assistant"
entity_id: weather.home

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

Мой блог является некоммерческим, поэтому позитивный комментарий, лайк или репост поможет публикациям выходить чаще и развивать канал☺.

Также публикации можно найти на других площадках: Instagram, telegram (RU, EN, DE), Medium, LiveJournal, YouTube, Reddit