Home Automation: Temperatur und Feuchtesensor mit DHT22 und Wemos D1 Mini

Die Integration einer Home Automation verleitet dazu alle Möglichen Sensoren und Aktoren aus zu probieren und die unterschiedlichsten Daten zu sammeln. Mein erster Temperatur und Feuchtigkeits Sensor war ein DHT22 den ich in den Wifi Led Strip Selbstbau integriert hatte. Dieses Konstrukt ist heute noch in Betrieb, ich musste lediglich die Werte etwas korrigieren aufgrund der Abwärme des ESP8266.

Später habe ich einen Xiaomi Mijia Temperatur und Feuchtigkeits Sensor in Homeassistant eingebunden. Dieser hat jedoch den Nachteil, dass die Reichweite sehr beschränkt ist weil die Werte über Bluetooth Low Energy BLE abgefragt werden. Durch die Reichweiten Beschränkung ist es ebenfalls nicht möglich Sensoren in verschiedenen Zimmer zu deponieren.

Da mein WLAN flächendeckend jede Ecke erreicht, war für mich klar, dass der Sensor WLAN basierend sein muss. Und so habe ich den ersten Prototypen basierend auf einem Wemos D1 Mini mit einem DHT22 Shield gebaut. Das Ergebnis war ernüchternd, weil der DHT keine Daten lieferte. Ein paar Messungen mit dem Multimeter, das Überprüfen der Lötpunkte und ein zweiter Shield deuteten auf keinen Produktionsfehler hin. Beim genaueren Betrachten des Shields fiel mir auf, dass der Data Pin des DHT mit Pin 4 des Wemos verbunden ist. Pin 4 wird unter anderem für die Status LED des Wemos verwendet was erklären würde weshalb der DHT nicht sauber über das 1-Wire Protokoll abgefragt werden kann. Die Lösung war schlussendlich die Leiterbahn zu Pin 4 auf dem Shield zu durchtrennen und eine Brücke zu Pin 2 zu löten.

Gleichzeitig habe ich auf dem Shield eine Brücke vom RST Pin zum D0 Pin gelötet, damit der Wemos aus dem Deep Sleep via RTC aufwachen kann. Dazu später mehr.

Den Sketch für den Sensor habe ich mit Esphome erstellt und sieht aktuell folgendermassen aus

substitutions:
  devicename: temp02

esphome:
  name: $devicename
  platform: ESP8266
  board: d1_mini
      
wifi:
  ssid: !secret WIFI_SSID
  password: !secret WIFI_PSK
  fast_connect: true

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "$devicename Fallback Hotspot"
    password: !secret AP_PASSWORD

captive_portal:

# Enable logging
logger:

ota:
  password: !secret API_PASSWORD

mqtt:
  broker: !secret MQTT_BROKER
  username: !secret MQTT_USER
  password: !secret MQTT_PASSWORD
  will_message:
  on_message:
    - topic: "${devicename}/ota"
      payload: 'ON'
      then:
        - mqtt.publish:
            topic: "${devicename}/ota"
            payload: 'OFF'
            retain: true
        - delay: 100ms
        - deep_sleep.prevent: sleeper
        
    - topic: "${devicename}/sleep"
      payload: 'ON'
      then:
        - mqtt.publish:
            topic: "${devicename}/sleep"
            payload: 'OFF'
            retain: true
        - delay: 100ms
        - deep_sleep.enter: sleeper
   
deep_sleep:
  id: sleeper
  run_duration: 5s
  sleep_duration: 5min

sensor:
  - platform: dht
    pin: D2
    model: dht22
    temperature:
      name: "${devicename} Temperature"
      filters:
        - multiply: 0.95
    humidity:
      name: "${devicename} Humidity"
      filters:
        - multiply: 1.34
    update_interval: 60s
    

Anschliessend habe ich in FreeCAD ein Gehäuse gezeichnet und mit meinem 3D Drucker ausgedruckt. Durch das Gehäuse musste ich einige Änderungen am Sketch vornehmen weil durch die Wärme des Wemos die Messwerte verfälscht wurden.

Als erstes habe ich für die Kommunikation zwischen Homeassistant und dem Sensor vom Native API auf MQTT gewechselt. Dadurch kann ich den Sensor eine Messung durchführen lassen, via MQTT (Zeile 27) an Homeassistant schicken, in den Deep Sleep Mode versetzten (Zeile 53) und nach 5 Minuten wieder aufwecken (Zeile 56) um das Ganze zu wiederholen. Mit dem angepassten Sketch sah ich bereits plausiblere Messwerte. Um die Feinabstimmung vorzunehmen habe ich über einen Zeitraum einen DHT22 Sensor ohne Gehäuse neben diesem Sensor laufen lassen und die Abweichung mittels Filter im Sketch (Zeile 65 und 69) angepasst.

Durch den Deep Sleep und die Sketch Laufzeit von 5 Sekunden (Zeile 55) braucht es ein sehr genaues Timing um ein Over the Air (OTA) Update durchführen zu können bzw. ist fast unmöglich. Um OTA Updates zu ermöglichen habe ich in Homeassistant 2 Switches erstellt, welche auf dem MQTT Broker ein Topic setzten, das der Wemos beim Start abfragt und damit den Deep Sleep verhindert (ab Zeile 32). Gleichzeitig habe ich ein Topic erstellt, welches den Wemos sofort in den Deep Sleep versetzt um den regulären Betrieb fortzusetzten. Die Homeassistant Konfiguration sieht folgendermassen aus

- platform: mqtt
  unique_id: "temp02_ota"
  name: "Temp02 OTA"
  retain: true
  state_topic: "temp02/ota"
  command_topic: "temp02/ota"
  
- platform: mqtt
  unique_id: "temp02_sleep"
  name: "Temp02 Sleep"
  state_topic: "temp02/sleep"
  command_topic: "temp02/sleep"
Homeassistant Switches für OTA und Sleep Mode

Damit ist der Sensor fertig.

Schreiben Sie einen Kommentar

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