Ein kleines Update zur Heizkörperthermostatsteuerung
Ich habe die Schaltung vereinfacht und die Transistoren weggelassen und das ganze für den ESP8266-01, also die kleine „Classic“-Platine, die nur 2 GPIOs hat, angepasst.
Das Serverscript hat nun eine Abfragemöglichkeit über den Parameter …?a=gt, mit dem man die zuletzt eingestellte Temperatur – also den Ist-Zustand – abfragen kann.
Die beiden aktuell verwendeten lua – Scripte sind auch noch einmal angefügt.
Es muss mit ESP8266Flasher.exe NodeMCU geflasht werden, um luaScript zu verwenden. Hier meine Settings beim Flashen:

Esp8266Flasher.exe settings für ESP8266-01
Das aktuelle Layout ohne Transistoren:
Hier die beiden Scripte, die auf dem ESP8266 werkeln:
init.lua
print('Hello! init.lua started.') wifi.setmode(wifi.STATION) wifi.sta.config("MY_AP_NAME", "MY_WIFI_PASSWORD") wifi.sta.connect() tmr.alarm(0, 1000, 1, function() if wifi.sta.getip()==nil then print("connecting to AP...") else print("AP successfully connected.") print ("ip: ", wifi.sta.getip()) tmr.stop(0) dofile("server_v4.lua") end end)
server_v4.lua
p1=3 -- 1 p2=4 -- 2 gpio.mode(p1, gpio.OUTPUT); gpio.mode(p2, gpio.OUTPUT); wt=21 gt=0 srv=net.createServer(net.TCP) print ("WEBSERVER started.") srv:listen(80,function(conn) conn:on("receive", function(client,request) local c = "" local buf = ""; local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP"); if(method == nil)then _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP"); end local _GET = {} if (vars ~= nil)then for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do _GET[k] = v end if(_GET.t ~= nil)then wt = _GET.t gt = wt if _GET.p == "on" then gt=wt + 0.5 c = " checked" end if wt == "off" then wt = 0 gt = 0 c = "" end print("Argument 't' was "..gt); settemp(gt) end end if(_GET.a == nil)then if(_GET.a == nil)then buf = buf.."HTTP/1.1 200 OK\n\n" buf = buf.."<html><head><title>Schlafzimmer Thermostat</title>"; buf = buf.."<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">" buf = buf.."<!--[if lt IE 9]>http://html5shim.googlecode.com/svn/trunk/html5.js<![endif]-->" buf = buf.."<link rel=\"shortcut icon\" href=\"http://SOME_URL/favicon.ico\"></head>" buf = buf.."<body bgcolor=\"#D0D0D0\"><font face=\"arial\"><center><h1>SCHLAFZIMMER</h1><p>Temperature is set to " buf = buf..gt buf = buf.."º</p><form action=\"?\">" buf = buf.."<input type=\"button\" style=\"height:70px;width:120px;font-size:40px;\" value=\"+\" onClick=\"javascript:document.getElementsByName('t')[0].value++;\"><br>" buf = buf.."Temp: <input style=\"height:50px;width:60px;font-size:40px;margin-top:8px;margin-bottom:8px;\" type=\"text\" name=\"t\" value=\"" buf = buf..wt buf = buf.."\"> " buf = buf.."<input style=\"transform: scale(4); -webkit-transform: scale(4);\" type=\"checkbox\" name=\"p\" value=\"on\"" buf = buf..c buf = buf.."> + 0.5º" buf = buf.."<br><input type=\"button\" style=\"height:70px;width:120px;font-size:40px;\" value=\"-\" onClick=\"javascript:document.getElementsByName('t')[0].value--;\">" buf = buf.."<br><input type=\"button\" style=\"height:40px;width:120px;font-size:28px;margin-top:8px;color:red;\" value=\"OFF\" onClick=\"javascript:location.href='?t=off'\"><br><br>" buf = buf.."<input style=\"height:60px;width:120px;font-size:32px;\" type=\"submit\" value=\"Set\"></form></p>" buf = buf.."</center></font></body></html>" if(_GET.a ~= nil)then if(_GET.a ~= nil)then action = _GET.a; if action == "gt" then buf = buf.."HTTP/1.1 200 OK\n\n" buf = buf..gt end end function pulse(dir, anz) z=gpio.read(p1) for i=1, anz*2, 1 do if z == 0 then z=1 else z=0 end if dir == "+" then gpio.write(p1, z); tmr.delay(10000); -- 10ms gpio.write(p2, z); tmr.delay(10000); else gpio.write(p2, z); tmr.delay(10000); gpio.write(p1, z); tmr.delay(10000); end end end function settemp(temp) print("Setting Temp to "..temp..".") tt = (temp*2)-9; pulse("-", 60) --init pulse("+", tt) end
Hi,
erstmal vorweg cooles Projekt!
hab gleich mal versucht das auf meinem ESP zum laufen zu bekommen. Allerdings bekomme ich einige Fehlermeldungen 😦 als erstes beschwert er sich über den . bei 0.5. Kann es sein das in dem Code ein paar end bzw Klammern fehlen?
srv:listen(80,function(conn)
conn:on(„receive“, function(client,request)
wenn ich das richtig sehe werden die nicht geschlossen.
Danke für die Unterstützung
Ja, es scheinen ein paar „End“ zu fehlen.
Wäre das mit einem Sonoff SV nicht sinnvoller bzw einfacher?
Klasse!! Hab letzte Woche erst erfahren, dass es die Heizkörperthermostate bei Hornbach für unter 10€ gibt. Sofort dachte ich an eine Vernetzung per ESP8266. Vielen Dank für die Publikation, das spart mir ne Menge Zeit.
Hallo vielen Dank für deine tolle Anleitung. Um der Community auch etwas zurückzugeben habe ich Code mit Wifimanager für den ESP sowie eine Webapp + Server mit konfigurierbaren Räumen und Heizplänen erstellt. Die Webapp ist responsiv und läuft auf PC, Tablet, Handy. Das ganze kann man zB. auf einem Homeserver oder Raspi hosten und mit Authentifizierzung übers Internet erreichen. Das Repo findet ihr unter https://github.com/coolibre/thermomat . Die Anleitung werde ich noch verbessern und Screenshots einfügen. Als Ergänzung habe ich noch einen Schiebeschalter eingefügt um in den „manuellen“ Modus zurückwechseln zu können, da man sonst das Rad – z.B. zum Einstellen des Offset – nicht drehen kann. Der Thermostat fragt alle 15 min die aktuell geltende Temperatur vom Server ab und geht dann in den DeepSleep um Enegie zu sparen. Konfigurierbar sind beim Erstbetirieb direkt am Thermostat (agiert als Access Point) Raumname, ServerIP und Feste Thermostat IP (funktioniert zuverlässiger als DHCP). Danach agiert der Thermostat solange als client im Wifi bis die Verbindung mal schiefgeht. Dann hat man aber auch nur 3 min Zeit um evtl. rezukonfigurieren. Um einen temporären Netzausfall zu überbrücken versucht er es danach im normalen Modus weiter. Reset ist auch über einen speziellen PIN möglich.
Ich habe damit 7 Thermostate seit Januar laufen und steuere damit gruppiert 4 Räume.
Hallo!
Ich habe eine MQTT-Variante probiert aber Probleme mit dem deepSleep-Modus.
Da beim ESP.deepSleep die GPIO-Level nicht gehalten werden interpretiert der EQ-3 die Signale und verändert manchmal die Temperatur beim Einschlafen/Aufwachen.
Mit „LIGHT_SLEEP_T“ gibts keine Probleme.
Warum funktioniert das bei Dir?
Robert
Bis auf den Stromverbrauch finde ich diese Idee sehr interessant.
Eigentlich wollte ich ’nur‘ über weitere Kommentare dieses Beitrag informiert werden – ohne eigenen Text geht Das aber wohl nicht.
Bin selber noch gaaanz am Anfang mit dem ESP8266, die Projekte wachsen aber gerade rasant, bei den neuen Möglichkeiten …
Wie lang halten denn bei euch die batterien so im schnitt?