Raumtemperatur und Luftfeuchtigkeit erfassen leicht gemacht mit ESPHome
Steigende Gas und Strompreise haben mich nachdenken lassen und da bin auf
die Idee gekommen jeden Raum zu überwachen damit ich weiß welche Temperaturen
und Luftfeuchtigkeit in welchem Raum vorliegen.
Sicher kann man das auch mit Thermostaten überwachen aber die erfassen meiner
Meinung nach die Temperatur nicht sehr genau. Außerdem dachte ich mir, wäre es
nicht schlecht das ganze über ein Display anzeigen zu lassen. Da die meisten ja
einen Home Assistant im Einsatz haben, ist es nur logisch auch die Außentemperatur
anzeigen zu lassen und „last but not least“ darf die Uhrzeit nicht
fehlen.
Dazu habe ich ein Gehäuse entworfen um alle nötigen Komponenten zu verbauen.
Die Grundfunktion wie Temperatur und Luftfeuchtigkeit laufen komplett auf
dem ESP selbst (Kein HA nötig). Zusätzlich wird der Sonnenstand ermittelt damit
das Display nachts gedimmt wird.
Des Weiteren besteht wenn man es möchte die Möglichkeit alle Sensoren vom Home
Assistant auf dem Display anzeigen zu lassen. Da sind eurer Fantasie keine
Grenzen gesetzt.
Anschlusse auf dem ESP Chip:
D1: RES ->Display
D2: Data -> DHT11
D5: D0 -> Display
D6: DC -> Display
D7: D1 -> Display
D8: CS -> Display
VCC und GND sollte soweit klar sein. (VCC immer 3.3v nicht 5v)
Die NodeMCU verfügt über 2x 3.3v und 2x GND
Der Temperatur Sensor muss kalibriert werden damit die Wärme vom Sensor selbst und der NodeMCU den wirklichen Wert nicht verfälscht.
Das lässt sich sehr einfach bewerkstäligen indem man einen Filter setzt.
In meinem Fall sieht das wie folgt aus:
filters:
- calibrate_linear:
- 0.0 -> 0.0
- 24.4 -> 21.7
Um die Differenz zu ermitteln muss der Filter mit einer # deaktiviert werden
#filters:
# - calibrate_linear:
# - 0.0 -> 0.0
# - 24.4 -> 21.7
Dadurch wird der reale Wert angezeigt der korrigiert werden muss.
Dazu braucht ihr ein weiteres Thermometer um die tatsächliche Temperatur zu ermitteln.
Der linke wert zeigt den Wert an der vom Sensor gemessen wurde und der rechte Wert zeigt den Wert an der von euch gemessen wurde.
Durch das Eintragen der beiden Werte ist der Sensor kalibriert.
Um den richtigen Sonnenstand zu ermitteln ist es wichtig die richtigen Längen- und Breitengrade einzutragen. Diese Werte kann man über div. Seiten im Internet ermitteln.
sun:
latitude: 52.3923°
longitude: 13.5170°
Hier der komplette Code:
esphome:
name: raumklima-wohnzimmer
esp8266:
board: nodemcuv2
logger:
api:
ota:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "raumklima-wohnzimmer"
password: "E7TE90zuyCxr"
captive_portal:
sensor:
- platform: dht
pin: D2
temperature:
name: "Wohnzimmer Temperatur"
id: "temp_wz"
filters:
- calibrate_linear:
- 0.0 -> 0.0
- 24.4 -> 21.7
humidity:
name: "Wohnzimmer Luftfeuchtigkeit"
id: "feuchte_wz"
update_interval: 10s
- platform: homeassistant
id: temp_aussen
entity_id: sensor.temp_aussen
time:
- platform: homeassistant
id: homeassistant_time
sun:
latitude: 52.3923°
longitude: 13.5170°
on_sunrise:
- then:
- light.turn_on:
id: oled_light2
on_sunset:
- then:
- light.turn_off:
id: oled_light2
font:
- file: 'arial.ttf'
id: font1
size: 20
glyphs:
['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
- file: 'arial.ttf'
id: font2
size: 12
glyphs:
['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
- file: 'arial.ttf'
id: font3
size: 16
glyphs:
['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
- file: 'arial.ttf'
id: font4
size: 18
glyphs:
['&', '@', '!', ',', '.', '?', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z','å', 'Ä', 'ä', 'Ö', 'ö', 'Ü', 'ü', 'ß', '/']
spi:
clk_pin: D5
mosi_pin: D7
display:
- platform: ssd1306_spi
model: "SSD1306 128x64"
id: my_display
cs_pin: D8
dc_pin: D6
reset_pin: D1
pages:
- id: page1
lambda: |-
it.printf(1, 0, id(font1), "%.1f°C", id(temp_wz).state);
it.printf(70, 0, id(font1), "%.1f%%", id(feuchte_wz).state);
it.printf(4, 22, id(font2), "Außentemperatur");
it.printf(1, 33, id(font3), "%.1f°C", id(temp_aussen).state);
it.strftime(56, 45, id(font4), "%X", id(homeassistant_time).now());
switch:
- platform: template
name: "Oled Backlights2"
id: oled_backlight2
assumed_state: true
optimistic: true
turn_on_action:
then:
- lambda: |-
id(my_display).turn_on();
id(my_display).fill(COLOR_ON);
turn_off_action:
then:
- lambda: |-
id(my_display).turn_off();
id(my_display).fill(COLOR_OFF);
light:
- platform: monochromatic
name: "OLED Contrast2"
output: oled_bc
id: oled_light2
output:
- platform: template
id: oled_bc
type: float
write_action:
then:
- lambda: id(my_display).set_contrast(state);
Und ja der Druck sieht nicht schön aus da es sich um einen Prototypen handelt.