Aussentermometer mit NodeMCU, DHT22 und Homeassistant

Eigentlich schwebt mir das schon lange vor – zumindest seit ich mich mit Homeautomation (im aktuellen Fall mit Homeassistant) beschäftige: Eine eigene kleine Wetterstation, die sich relativ simpel in meine homeassistant Installation integrieren lässt. Leider hat mich lange Zeit der Preis abgeschreckt, denn relativ offene Systeme, d.h. Hardware die solche netten goodies wie MQTT oder RESTApi unterstützt, da kann man schon ein paar hundert Euro los werden.

Da ich mir auch ein bisschen Geld beim Thema “Bewegungssensor” sparen wollte (auch hier fangen die Preise bei ~35€ an), bin ich auf die NodeMCU-Plattform gestoßen. Eine kleine Platine, mit WLAN und USB als Netzanschluss… Und das Ganze für 5-8€. Dafür gibt es nahezu keine Sensoren, die man nicht anschließen kann. Ich hab mir hier z.B. 3 Bewegungssensoren für ca. 3€ bestellt, aber das wird Teil eines nächsten Artikels, die sind nämlich noch auf dem Weg aus China hier her.

Zurück zum Thema “Wetterstation”… Da ich auch noch auf meinen Kabelpack aus China warte, habe ich mir kurzerhand ein “Komplettpaket” bei amazon bestellt:

  • NodeMCU (z.B. das Lolin V3 Modul) ~ 7,49€
  • DHT22 Board inkl. Kabel ( hier ) 9,99€
  • Usb Ladekabel hatte ich noch von den etlichen Handys oder anderen Geräten, kosten aber so ca. 6

Wenn man weiss, wie es geht, ist das Ganze super simpel:

Verkabeln

Mein DHT-Modul hat 3 Pins… Bei Modellen mit 4 Pins. lässt man einfach Pin 3 leer… Verkabelung wie folgt:

PIN DHT22 -> PIN NodeMCU

1 -> 3V

2 -> D4

3 -> G

Die Firmware

Am Besten lässt man sich eine bauen unter https://nodemcu-build.com/ – einfach Email Adresse angeben, benötigte Module auswählen und man bekommt nach ein paar Minuten eine Mail mit den Links zum Downloaden.

In meinem Fall brauchte ich folgende Module:

  • DHT
  • file
  • MQTT (für später)
  • HTTP
  • net
  • node
  • timer
  • UART
  • WIFI

Firmware flashen

Man braucht dazu das esptool und dessen Abghängigkeit PySerial. Wie dies zu installieren ist, entnimmt man der Seite.

Danach schließen wir unseren NodeMCU per USB-Kabel an den Rechner an und flashen die erstellte Firmware:

esptool.py --port /dev/ttyUSB0 write_flash 0x00000 ~/Downloads/nodemcu-firmware.bin

Den Port müsst ihr natürlich anpassen, ebenso den Pfad/Namen der Firmware…

Das Skript

Am Einfachsten kann man das Skript mit dem Tool ESPlorer erstellen und hochladen.

1.) Rechts oben auf “Open” klicken, die Voreinstellungen sind perfekt, evtl. oben im Dropdown den Port auswählen.

2.) Links im Editor das Skript erstellen:

local SSID = "HIER_EURE_SSID"
local SSID_PASSWORD = "HIER_EUER_WIFI_PASSWORD"
local SIGNAL_MODE = wifi.PHYMODE_N
DHT_PIN = 4
INTERVAL = 30 -- seconds
RASPBERRY_PI_URL = "http://IPADRESSE_DER_HOMEASSISTANT_INSTALLATION:8123/api/states/sensor.nodemcu"
 
 
function wait_for_wifi_conn ( )
   tmr.alarm (1, 1000, 1, function ( )
      if wifi.sta.getip ( ) == nil then
         print ("Waiting for Wifi connection")
      else
         tmr.stop (1)
         print ("ESP8266 mode is: " .. wifi.getmode ( ))
         print ("The module MAC address is: " .. wifi.ap.getmac ( ))
         print ("Config done, IP is " .. wifi.sta.getip ( ))
      end
   end)
end
 
function transmit_msg(data)
    -- send http request to Raspberry Pi
    ok, json = pcall(sjson.encode, data)
    if ok then        
        http.post(RASPBERRY_PI_URL .. '_temperature', 
            'Content-Type: application/json\r\nx-ha-access: API_PASSWORD_HOMEASSISTANT\r\n',
            '{"state": "' .. data.temperature .. '"}',
            function(code, data)
                if (code < 0) then
                    print("HTTP request failed")
                --else
                --    print(code, data)
                end
        end)
        http.post(RASPBERRY_PI_URL .. '_humidity', 
            'Content-Type: application/json\r\nx-ha-access: API_PASSWORD_HOMEASSISTANT\r\n',
            '{"state": "' .. data.humidity .. '"}',
            function(code, data)
                if (code < 0) then
                    print("HTTP request failed")
                --else
                --    print(code, data)
                end
        end)
    else
        return false
    end
end
 
function readDHTValues()
    status, temp, humi, temp_dec, humi_dec = dht.read(DHT_PIN)
    if status == dht.OK then
        return {temperature= temp, humidity= humi}    
    else
        return false
    end
end
 
function main()
    for i=1,10 do
        data = readDHTValues()
        print('Data sent...')
        if data ~= false then
            
            data["sender_id"] = wifi.ap.getmac()
            data["password"] = SERVER_PASSWORD
        
            transmit_msg(data)
            break
        end
    end
end
 
-- Configure the ESP as a station (client)
wifi.setmode(wifi.STATION)
wifi.setphymode(SIGNAL_MODE)
--wifi.sta.config(SSID, SSID_PASSWORD)
wifi.sta.config {ssid=SSID, pwd=SSID_PASSWORD}
wifi.sta.autoconnect(1)
 
-- Hang out until we get a wifi connection before the httpd server is started.
wait_for_wifi_conn ( )
 
 
tmr.alarm(2, INTERVAL * 1000, tmr.ALARM_AUTO, function ()
    main()
end)

3.) Die Datei als “init.lua” speichern und unten links auf “Upload” klicken…

Wenn alles gut geht, habt ihr nun 2 neue Sensoren in eurer Homeassistant-Instanz

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.