Update 19.03.2016 Bitte beachtet auch den Teil 2 dieses Blog-Beitrages!
Was 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:
- ESP 8266 mit mindestens 1 GPIO (also z. B. den ESP8266 01 (amazon: Demarkt ESP8266 Serial WIFI Wireless Transceive Modul Send Receive LWIP AP+STA
), andere gehen aber auch, siehe Foto) - Temperatursensor DS18B20, s. Amazon: 10 × DS18B20 Digital Temperature Sensor Thermperatursensor TO92 – 55°C – +125°C
- 4,7 K-Ohm Widerstand, s. Amazon: Leistungs-Widerstand 4K7, Kohleschicht 1W, Set 10-fach
- 3,3V , (optional!) z. B. geregelt mit einem LM1117 3.3 (amazon: 5pcs LM1117T-3.3 LM1117T LD1117 3.3V TO-220 oder so eine Platine: DC-DC Step-down Einstellbare Power Supply Module w / Draht
- Optional: USART zum Flashen der ESP-LUA Firmware
- Breadboard zum Ausprobieren: Steckbrett Breadboard Experimentierboard Steckplatine 400 Kontakte
- Spaß am Basteln, Zeit und Geduld
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
Ergebnis in Fhem:
Hallo Christian,
danke für die Hinweis, habe ich angepasst!
Sonst läuft alles?
LG
/robin
Hallo Robin,
kann es sein, dass der Link zu „diese Tabelle“ im Abschnitt „Vorbereitende Maßnahmen) nicht mehr auf die Tabelle zeigt?
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
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.
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
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
Hallo Heinz-Rolf,
ich habe die Änderungen rückgängig gemacht, weil die Fhem Scripte weiter unten stehen.
LG
/robin
Hallo Robin,
in welchem Blog hast Du die Änderungen eingetragen?
Schönen Tag
Heinz-Rolf
Hallo Robin,
vielen Dank für die schnelle Antwort. Aber ich finde noch nichts.
LG
Heinz-Rolf
Hallo Heinz-Rolf,
danke für den Hinweis. Ich habe die notwendigen Fhem-Zeilen im Blog nachgetragen.
LG
/robin
Nachtrag: FHEM Version 5.7 da erst vor ein paar Tagen damit angefangen.
Gruß
Heinz-Rolf
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
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
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
Zusatz:
hier geht das ganze über 1-Wire. Man kann somit auch andere 1-Wire Geräte ansprechen….
Gruß,
Heiko
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
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
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
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.
Hallo PeMue,
gute Frage, die ich nicht beantworten kann. Bei mir im Intranet ist Fhem ohne Login erreichbar.
LG
/robin
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
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
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
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
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
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
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
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