Fhem: Temperaturmessung mit dem ESP 8266 und DS18B20 OHNE Arduino – Datenübertragung per WLAN (Teil 1)

Update 19.03.2016 Bitte beachtet auch den Teil 2 dieses Blog-Beitrages!

Update 21.05.2015 Programm korrigiert

fhemWas für eine Überschrift! Die reicht eigentlich als Titel für eine Diplom-Arbeit :-). Viele von Euch verwenden zum Basteln den kostengünstigen WLAN-Baustein ESP 8266 von der Firma Espressif. Meistens benutzt man ihn aber mit der Standard-Firmware und einem Arduino – Nano oder ProMini. Die Macher von NodeMCI haben eine Library herausgebracht, welche Standard-Sensoren von den kostengünstigen 18B20 oder den DTH-22 auch ohne Arduino unterstützt. Siehe hier die Auflistung der bestehenden Module.

Ich wollte Euch heute mal kurz skizzieren, wie man den DS18B20 Temperatursensor unter ESP 8266 zum Rennen bekommt um die Temperatur-Daten dann in Fhem zu katapultieren. Der Trick geht hierbei über Telnet. Das nachfolgende Script ist nicht auf meinem Mist gewachsen, sondern vom Fhem-Forum Leser Kroonen.

Die Zutaten:

Vorbereitende Maßnahmen:

Zunächst muss die Standard-Firmware vom ESP8266 runter, am Besten mit dem ESP8266-Flasher. Vorgehensweise wie immer: GPIO0 auf Masse, Kurz den RST Pin gegen Masse setzen, Flashen und danach den GPIO0 wieder von der Masse entfernen. Die aktuelle Version von NodeMCI befindet sich hier.
Wichtig: Den richtigen GPIO-Pin für den ESP8266-X Chip nehmen, dafür diese Grafik nehmen!

Nach dem Flashen wieder den RST Pin gegen Masse setzen und das wars auch schon.

LUA-Software
Jetzt kann man mit einem geeigneten Lua-Programm den ESP 8266 mit LUA-Software bespielen. Hierzu sich mal die Videos von Hari Wiguna ansehen. Beim Übertragen der Daten GPIO0  NICHT wieder  auf Masse setzen!
Jetzt die Dateien noch für Euer System anpassen und dann auf dem ESP-Chip übertragen. Anschließend kurz resetten.
Anpassungen: Falls beim Testen eine Fehlermeldung wie

PANIC: unprotected error in call to Lua API (fhem.lua:7: attempt to concatenate a nil value)
PANIC: unprotected error in call to Lua API (attempt to concatenate a lightfunction value)
PANIC: unprotected error in call to Lua API (attempt to call a string value)

kommt, habt ihr einen falschen GPIO-Pin gewählt oder das DS18B20 liefert keine Daten.

init.Lua

--init.lua
wifi.setmode(wifi.STATION)
wifi.sta.config("ssidname","password")
wifi.sta.connect()
tmr.alarm(1, 1000, 1, function()
if wifi.sta.getip()== nil then
print("IP unavaiable, Waiting...")
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())
dofile ("fhem.lua")
end
end)

fhem.lua


--fhem.lua
require('ds18b20')
-- ESP-01 GPIO Mapping
gpio0 =3
gpio2 =4
ds18b20.setup(gpio2)
t=ds18b20.read()
print("Temp:" .. ds18b20.read() .. " C\n")
if(t==nil) then
t=0
end
tmr.alarm(0,30000, 1, function()
t=ds18b20.read()
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end )
conn:connect(8083,"192.168.178.6")
conn:send('GET /fhem?cmd=setreading%20esp8266temp%20state%20T:%20' ..t.. '\r\n HTTP/1.1\r\nHost: www.local.lan\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n"')
end)

notwendiges LUA DS18b20-Script

https://github.com/nodemcu/nodemcu-firmware/tree/master/lua_modules/ds18b20

Fhem


define esp8266temp CUL_WS 4
attr esp8266temp event-min-interval state:600
attr esp8266temp room Plots
define FileLog_esp8266temp FileLog ./log/esp8266temp-%Y.log esp8266temp:T:.*
define SVG_FileLog_esp8266temp_1 SVG FileLog_esp8266temp:SVG_FileLog_esp8266temp_1:CURRENT
define SVG_FileLog_esp8266temp_2 SVG FileLog_esp8266temp:SVG_FileLog_esp8266temp_2:CURRENT
attr SVG_FileLog_esp8266temp_2 room Plots

Schaltung und Kurzerklärung

esp8266-18b20-fhem

Ergebnis in Fhem:

Screenshot 2015-03-08 09.37.04

Screenshot 2015-03-08 09.39.51

 

Dieser Beitrag wurde unter Fhem-Hausautomation abgelegt und mit verschlagwortet. Setze ein Lesezeichen auf den Permalink.

28 Antworten zu Fhem: Temperaturmessung mit dem ESP 8266 und DS18B20 OHNE Arduino – Datenübertragung per WLAN (Teil 1)

  1. Robin sagt:

    Hallo Christian,
    danke für die Hinweis, habe ich angepasst!
    Sonst läuft alles?

    LG
    /robin

  2. Christian sagt:

    Hallo Robin,

    kann es sein, dass der Link zu „diese Tabelle“ im Abschnitt „Vorbereitende Maßnahmen) nicht mehr auf die Tabelle zeigt?

  3. Heinz-Rolf sagt:

    Hallo Robin,
    habe es zwischenzeitlich geschafft Daten vom DS18B20 via ESP8266-12 Modul an FHEM zu senden und im Plot darzustellen. Dazu habe ich aber im Fhem.lua den Teil der Internetverbindung komplett ausgetauscht gegen eine funktionierende Verbindung mit Thingspeak. Änderungen an den entsprechenden Stellen wurden natürlich vorgenommen. Nun bin ich dabei einen BMP180-Sensor zu integrieren. Funktioniert soweit auch gut was die Verbindung und einen Wert betrifft. Nur fehlt mir jetzt der entscheidene Tip wie ich in dem „conn:send(‚GET /fhem?cmd=setreading“ zwei Werte in eine Logfile senden kann. In Google habe ich bis jetzt erfolglos gesucht, vielleicht habe ich aber auch meine Frage falsch gestellt. Hast Du eine Tip für mich?

    Schönen Sonntag aus dem Rheinland
    Heinz-Rolf

  4. Heinz-Rolf sagt:

    Hallo Robin,
    ich glaube jetzt haben wir uns falsch verstanden. Bei mir gibt es auch keine Fehlermeldungen im Systemlog, es werden nur keine Daten in das Filelog geschrieben. Ich habe genau nach den Vorgaben meinen Nodemcu geflasht. Ich habe zusätzlich noch eine Webserver aufgesetzt, um zu kontrollieren ob ich via Web eine Verbindung zum Nodemcu habe und der Temperatursensor auch richtige Daten Liefert. Das Filelog wird auf dem Raspi erzeugt bleibt aber leer sodass im Plot auch keine Daten angezeigt werden. Die einzige Änderung die ich neben der IP-Adresse meinens Raspi gemacht habe, ist die „define“-Anweisung im FHEM-Script :“define esp8266temp dummy“. Alle nachfolgenden Anweisungen sind im original geblieben.

  5. Robin sagt:

    Hallo Heinz-Rolf,
    ich habe einen Cul bei mir eingebaut, aber ich glaube nicht, das mach dafür einen benötigt. Ich kann es auch derzeitig hier nicht testen, weil ich gerade kein NodeMcu flashen kann. Jedoch habe ich das Fhem-Script im Blog mal auf einem jungfräulichen Raspi gebeamt, und es gab keine error-Meldung.

    LG
    /robin

  6. Heinz-Rolf sagt:

    Hallo Robin,

    jetzt verstehe ich nur noch Bahnhof. Hier noch malmeine Frage: Kann ich so ein ESP8266 Modul nur mit einem CUL-WS betreiben wie in Deinem FHEM-Script beschrieben oder gibt es auch noch eine Möglichkeit per Dummy eintrag. Wenn ja, was muss an dem bestehenden Script geändert werden? Nur der erste „define“ Eintrag oder noch mehr.

    LG Heinz-Rolf

  7. Robin sagt:

    Hallo Heinz-Rolf,
    ich habe die Änderungen rückgängig gemacht, weil die Fhem Scripte weiter unten stehen.

    LG
    /robin

  8. Heinz-Rolf sagt:

    Hallo Robin,
    in welchem Blog hast Du die Änderungen eingetragen?
    Schönen Tag
    Heinz-Rolf

  9. Heinz-Rolf sagt:

    Hallo Robin,

    vielen Dank für die schnelle Antwort. Aber ich finde noch nichts.
    LG
    Heinz-Rolf

  10. Robin sagt:

    Hallo Heinz-Rolf,

    danke für den Hinweis. Ich habe die notwendigen Fhem-Zeilen im Blog nachgetragen.

    LG
    /robin

  11. Heinz-Rolf sagt:

    Nachtrag: FHEM Version 5.7 da erst vor ein paar Tagen damit angefangen.
    Gruß
    Heinz-Rolf

  12. Heinz-Rolf sagt:

    Hallo zusammen,
    ich beschäftige mich schon einige Tage mit dem Tutorial. Ist ja alles gut beschrieben, aber leider gelingt es mir nicht die Daten in FHEM anzuzeigen. Frage an Wolfgang: wie sieht denn Deine Definition in FHEM aus mit einer Dummy-Definition. Ich habe auch kein CUL. Im Logfile stehen keine Fehler, die LUA-Scripts sind ok und liefern als Webserver auch die Temperatur. Dennoch ist das Logfile leer.
    Eingesetzte Hardware:
    Raspberry B+
    ESP8266-12 bzw Nodemcu mit entsprechender Software
    DS18B20

  13. Robin sagt:

    Hallo Wolfgang,
    ich bin da aus dem Projekt raus. Ganzzahlig.. hm. hast du mal den Float lua aufgespielt? Es gibt ja die integer und die float Version, zumindest beim NodeMCU.
    Mir war die ganze Verkabelei und Flasherei zu nervig, ich bin dann hierzu übergegangen: https://blog.moneybag.de/wlan-thermometer-fuer-fhem-ohne-loeten/

    LG
    /robin

  14. Wolfgang sagt:

    Hi Robin,
    deiner Anleitung bin ich exakt gefolgt (Danke dafür). Ein Dummy zeigt mir die Temperatur auch, allerdings ganzzahlig. Ein CUL_WS zu definieren, wie es in der Beschreibung steht, gelingt mir nicht, weil ich kein CUL habe. Ist dieses irgendwo als notwendig beschrieben?
    In dem Fhem-Bild ist die Temperatur als Kommazahl zu sehen und Daniel fragte im September schon nach einer Lösung. Das Script von Heiko hilft mir nicht, er benutzt einen 201 und ich bin nicht in der Lage, die notwendigen Anpassungen selbst zu machen.
    Viele Grüße
    Wolfgang

  15. Heiko sagt:

    Zusatz:

    hier geht das ganze über 1-Wire. Man kann somit auch andere 1-Wire Geräte ansprechen….

    Gruß,

    Heiko

  16. Heiko sagt:

    Hallo,

    danke für die Idee. Habe das ganze in ein LUA-Script gegossen und kann nun auf 4 Stellen nach dem Komma die Temp lesen. Setze ein esp8266 201 ein.
    das ds1820.lua sieht dann so aus:

    —pin 1 gpio5 nodemcu

    — Get temperature from DS18B20
    function getTemp()

    pin = 1
    ow.setup(pin)
    count = 0
    repeat
    count = count + 1
    addr = ow.reset_search(pin)
    addr = ow.search(pin)
    tmr.wdclr()
    until((addr ~= nil) or (count > 100))
    if (addr == nil) then
    print(„No more addresses.“)
    else
    print(addr:byte(1,8))
    crc = ow.crc8(string.sub(addr,1,7))
    if (crc == addr:byte(8)) then
    if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
    print(„Device is a DS18S20 family device.“)
    — repeat
    ow.reset(pin)
    ow.select(pin, addr)
    ow.write(pin, 0x44, 1)
    tmr.delay(1000000)
    present = ow.reset(pin)
    ow.select(pin, addr)
    ow.write(pin,0xBE,1)
    print(„P=“..present)
    data = nil
    data = string.char(ow.read(pin))
    for i = 1, 8 do
    data = data .. string.char(ow.read(pin))
    end
    print(data:byte(1,9))
    crc = ow.crc8(string.sub(data,1,8))
    print(„CRC=“..crc)
    if (crc == data:byte(9)) then
    t = (data:byte(1) + data:byte(2) * 256) * 625
    t1 = t / 10000
    print(„Temperature=“..t1..“°C“)
    lasttemp=t
    end
    tmr.wdclr()
    — until false
    else
    print(„Device family is not recognized.“)
    end
    else
    print(„CRC is not valid!“)
    end
    end
    end

    function sendData()
    getTemp()
    t1 = lasttemp / 10000
    t2 = (lasttemp >= 0 and lasttemp % 10000) or (10000 – lasttemp % 10000)
    print(„Temp:“..t1..“ C\n“)
    — conection to fhem
    print(„Sending data to fhem“)
    conn=net.createConnection(net.TCP, 0)
    conn:on(„receive“, function(conn, payload) print(payload) end)
    — fhem Port und ip
    conn:connect(8083,’192.168.178.47′)
    conn:send(‚GET /fhem?cmd=setreading%20esp8266temp%20state%20T:%20‘ ..t1.. ‚\r\n HTTP/1.1\r\nHost: http://www.local.lan\r\n“..“Connection: keep-alive\r\nAccept: */*\r\n\r\n“‚)
    conn:on(„sent“,function(conn)
    print(„Closing connection“)
    conn:close()
    end)
    conn:on(„disconnection“, function(conn)
    print(„Got disconnection…“)
    end)
    end

    tmr.alarm(0, 60000, 1, function() sendData() end )

    Die init.lua sieht dann so aus:
    –init.lua
    print(„Setting up WIFI…“)
    wifi.setmode(wifi.STATION)
    –modify according your wireless router settings
    wifi.sta.config(„Deine SSID“,“Dein Kennwort“)
    wifi.sta.connect()
    tmr.alarm(1, 1000, 1, function()
    if wifi.sta.getip()== nil then
    print(„IP unavaiable, Waiting…“)
    else
    tmr.stop(1)
    print(„Config done, IP is „..wifi.sta.getip())
    dofile(„ds1820.lua“)
    end
    end)

    Mit deime FHEM-Code hat es sofort funktioniert.

    Gruß,
    Heiko

  17. Daniel sagt:

    Hallo,
    bei mir klappt nun auch alles. Bis auf eine Sache. Ich bekomme leider nur ganzzahlige Temperaturen ausgelesen. Hab schon versucht durch Änderungen im Code auch Kommazahlen auslesen zu können, aber leider ohne Erfolg. Da bei dir jedoch in FHEM T:20.5 steht, muss ja auch ohne Änderung funktionieren. Eine Idee wieso es bei mir nicht klappt?
    Gruß Daniel

  18. Robin sagt:

    Hallo Michael,

    danke für die Info.
    Meine LED-Stripes steuere ich seit einem halben Jahr auch mit fhem und dem ESP8266 (auch ohne Arduino).
    http://blog.moneybag.de/fhem-smd-rgb-led-stripes-mit-esp-8266-12-ueber-wlan-steuern/

    LG
    /robin

  19. Michael sagt:

    Danke für Ihre Artikel.
    Ich habe Arduino für ESP8266 entdeckt und Programm direkt für ESP8266 Controller in Arduino IDE geschrieben. Da braucht man kein zusätzlicher Arduino-Board. Hier sind meine ersten Sketche http://esp8266-server.de/ .
    Fhem ist für mich neu, werde mich da umschauen. Besonders gut hat mir Ihre Temperaturgrafik gefallen.

  20. Robin sagt:

    Hallo PeMue,
    gute Frage, die ich nicht beantworten kann. Bei mir im Intranet ist Fhem ohne Login erreichbar.

    LG
    /robin

  21. PeMue sagt:

    Hallo Robin,

    vielen Dank. Ich meinte aber nicht das Passwort für das WLAN Netzwerk. Wenn ich das lua Skript richtig verstanden habe, baut es eine telnet Verbindung zu fhem auf (auf dem Port 8083) und übergibt die Daten an fhem.
    Die Frage war: Wie öffne ich im fhem Skript die Verbindung (bzw. übergebe der lua Funktion das Passwort), wenn fhem mit Passwort gesichert ist. Ich werde am Wochenene mal probieren …

    Gruß PeMue

  22. Robin sagt:

    Hallo PeMue,

    a) yep, wird auch so sein. Ich habe die mal aus dem Beispiel rausgeworfen. Steht bei mir in meiner Produktivumgebung auch nicht mehr drin.
    b) gar nicht in LUA, das machst du mit sowas http://www.electrodragon.com/w/Wi07c und legst ein SSID und Passwort fest. Danach flashst du die LUA-Firmware drauf. Passwort und SSID bleibt da drin erhalten. War zumindest bei mir so.

    LG
    /robin

  23. PeMue sagt:

    Hallo Robin,

    die fhem Zeile
    attr Testtemp IODev CUL
    müsste doch eigentlich eine Fehlermeldung genierieren, da Testtemp noch gar nicht definiert ist, oder?
    Und die nächste Frage (wurde aber schon gestellt): Wie übergebe ich dem LUA Skript ein Passwort, wenn die fhem Oberfläche mit Passwort abgesichert ist?

    Danke + Gruß

    PeMue

  24. Robin sagt:

    Hallo Christof,

    ich habe es mal groß geschrieben, mich wundert das aber, ich habe damals einfach nur copy&paste gemacht. Ich prüfe das mal nach, wenn ich wieder mit den esp 8266 – Modulen arbeite.

    LG
    /robin

  25. chk_bln sagt:

    Hallo Robin,

    kannst du auf der Seite hier, in der init.lua folgenden Eintrag:
    „wifi.setmode(wifi.station)“ in „wifi.setmode(wifi.STATION“) ändern?
    Die Buchstaben von STATION müssen groß geschrieben werden. Ich bekomme sonst eine Fehlermeldung.
    Beste Grüße

  26. Klausi sagt:

    Hallo Robin,
    wo und wie gebe ich im File „fhem.lua“ mein Passwort, das ich in FHEM in „attr WEB basicAuth xxxxxxxxxxxx“ definiert habe, ein?

    Danke für deine Scripts

    Klausi

  27. Robin sagt:

    Hallo Aim,
    ja, ich habe 3 Eneloop genommen für diesen Test-Aufbau.
    Die halten nicht so lange durch, weil, wie Du schon beschrieben hast, noch kein vernünftiger Sleep-Mode im LUA drin ist. Kommt aber alles später.

    LG
    /robin

  28. Aim sagt:

    Moin Robin,

    was mich nun noch interessiert ist, was für eine Stromquelle verwendest du?
    Batteriepack? Wenn ja, wie lang würdest du einschätzen hält deine Variante?

    Wie sieht es denn mit einem .lua Script aus, was den ESP in Sleep versetzt. Gibt es dazu auch schon was bzw kannst du da was empfehlen. Ich hab bisher nichts gescheites ehrlich gesagt finden können.

    Beste Grüße
    Aim

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

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