Ein Temperatursensor BME280 an ein ESP32 Wroom anschließen und in Home Assistant anzeigen

Das Dashboard vom Home Assistant lebt von Daten. Und die einfachsten Daten sind Temperatur, Luftdruck und Luftfeuchtigkeit. Diese Daten liefert nur ein Bauteil, der Sensor BME280. Dieser Sensor muss an ein Board angeschlossen werden. Die neuen Bords haben auch schon USB-C Anschlüsse. Es gehen aber auch sehr kleine Nano oder Micro Boards. Je nachdem was man in der Bastelkiste hat.

Ich beschreibe hier die Inbetriebnahme eines ESP32-Wroom32 mit dem Sensor BME280 und ein Display ST7735.

Als erstes müssen die Komponente verkabelt werden. Ein Steckbrett hilft hier enorm.

Die Kabel habe ich entsprechend der Tabelle zusammengesteckt. Die PIN Daten (GPIO) werden dann im Code benötigt. Im Fall des ESP32 stimmen die GPIO Ziffern mit der Beschriftung überein.

Anders als bei der Arduino Programmierung wird im Home Assistant das Tool ESPHome Builder eingebunden und dort wird das Programm im YAML Format geschrieben.

i2c:
# GPIO Pins wo der BME280 angeschlossen wird, 3,3 Volt und GND
sda: GPIO5
scl: GPIO18

Der Sensor BME280 wird wie folgt eingerichtet.


sensor:
- platform: bme280_i2c
address: 0x76
# temperatur
temperature:
name: "BME280-temp"
id: temperatur # die Daten werden der ID zugewiesen
oversampling: 16x # vergleicht 16 Werte und bildet daraus korrekte Werte
filters:
- lambda: return x - 3.0; # Wertkorrektur Minus 3 Grad. Mein verwendeter BME280 hat eine Ungenauigkeit.

# Luftdruck
pressure:
name: "BME280-pressure"
id: druck
oversampling: 16x

# Luftfeuchtigkeit
humidity:
name: "BME280-humidity"
id: feuchtigkeit
oversampling: 16x
update_interval: 60s # Alle Minute wird das Display aktualisieren

Die Werte werden einer ID zugewiesen. Es ist dann möglich die ID zu nutzen und der Code kann leichter gelesen werden.

Der ESP32 hat auch Sensoren. In diesem Fall liefert das WLAN die Signalstärke. So kann man den Zahlenwert und die Prozente anzeigen lassen.

  # Sendesignal WLAN
- platform: wifi_signal # WiFi signal strength/RSSI in dB
name: "WiFi Signal dB"
id: wifi_signal_db
update_interval: 60s
entity_category: "diagnostic"

- platform: copy # WiFi signal strength in % wird berechnet
source_id: wifi_signal_db
name: "WiFi Signal Percent"
filters:
- lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); # Prozentrechnung
unit_of_measurement: "Signal %"
entity_category: "diagnostic"
device_class: ""

Ein weiteres Merkmal in der Home Assistant ist die Reaktion auf Werte. Wenn jetzt die Wunschtemperatur erreicht wird, kann das Heizungsventil geschlossen werden oder andere Meldungen ausgegeben werden. Dies wird mit einer Schleife (Wann-dann-Sonst) realisiert. Der lambda Ausdruck prüft ob die Raumtemeratur größer als 20 grad ist, dann liefert er ein Wahrzeitswert. Wahrzeitswerte sind Ja/Nein oder True/False.

#sensor auswerten, wenn der Wert größer 20 Grad ist dann gibt den Wert "Wahr" zurück, ansonsten Falsch.
binary_sensor:
- platform: template
name: "Raumtemperatur"
lambda: |-
if ((id(temperatur).state >= 20.0) ) {

return true;
} else {
return false;
}

Und jetzt kann man selbst entscheiden was passieren soll wenn Wahr (True) geliefert wird. Sollen jetzt die Sonnenrollos runterfahren?

#Schriftart liegt im Ordner Fonts im Unterordner von esphome
font:
- file: "/config/esphome/fonts/roboto.ttf"
id: roboto
size: 30 # Schriftgröße

Das Display benötigt eine Schriftart. Diese kann man ebenfalls Downloaden. Die TTF Schriftart muss im Ordner liegen. Zum navigieren ist ein File editor notwendig. Auch dieser muss in Home Assistant implementiert werden. Hier muss auch die Schriftgröße eingetragen werden.

Nun wird das Display ST7735 eingerichtet. Bei anderen Displays können die Daten durchaus anders lauten, aber das Prinzip ist gleich.

# Bus fürs Display ST7553
spi:
clk_pin: GPIO22 # PINs (CLK MISO)
mosi_pin: GPIO21 # PINs (SDA MOSI)

# configuration des Display
display:
- platform: ili9xxx
model: "ST7735"
cs_pin: GPIO15 # Pins (Chip Select)
dc_pin: GPIO4 # PINs (A0 DC)
reset_pin: GPIO23 # PINs (Reset)
rotation: 90 # Rotation, Null Grad, 90 Grad und 180 Grad (auf dem Kopf), je nach Einbau des Display
update_interval: 5s
id: st7735_Display
invert_colors: false # False = weiße Schrift auf schwarzem Hintergrund. True = schwarze Schrift auf weißem Hintergrund.
show_test_card: false # zum Test des Display wird bei true drei farbige Balken und die Buchstaben RGB angezeigt. Nicht vergessen diese wieder ausschalten :-).
lambda: |-
it.printf(0, 10, id(roboto), "%.1f°C", id(temperatur).state);
it.printf(0, 40, id(roboto), "%.1fhPa", id(druck).state);
it.printf(0, 70, id(roboto), "%.1f%%", id(feuchtigkeit).state);
# Ausgabe der Werte .1f (eine Ziffer hinter dem Komma) und Gradzeichen. Die einzelnen Werte werden von der ID geholt.
# die Position Null = linker Rand und 10 ist vom oberen Rand nach unten

Die Lambda Daten werden auf dem Display mit „it.printf“ angezeigt.

Die Zahlen können mit %.1f formatiert werden. Eine Stelle hinter dem Punkt und dann noch die °C Maßeinheit. Bei einem Prozentzeichen müssen zwei Prozentzeichen eingetragen werden, sonnst wird das nicht erkannt.

Mit den vorderen Ziffern wird die Position gesteuert. Null ist der linke Rand. Die zweite Ziffer beginnt von oberen Rand an zu zählen. Die Schriftart wird mit der ID (roboto) bezeichnet. Hat man mehrere Schriftarten können diese hier angegeben werden.

Die gleichen Werte im Dashboard.

Die Werte im Dashboard und im Display ändern sich natürlich. Zum Beispiel steigt der Luftdruck – es kommt schönes Wetter. Durch Klick auf die Kachel kann man weitere Daten anzeigen lassen. Hier kann man auch den Zeitraum ändern. Der Raspi speichert denn diese Daten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert