Lüftungssteuerung nach Außentemperatur

Begonnen von drcliff, 20 Mai 2020, 07:54:53

Vorheriges Thema - Nächstes Thema

drcliff

Hallo zusammen,

ich lese schon einige Zeit mit und versuche mein Problem zu lösen, aber ich bekomme es leider nicht hin.

Hier kurz zu meiner Ausgangssituation:
Ich habe eine Stiebel Eltron LWZ403 (Heizung mit integrierter Lüftungsanlage).
Diese hängt an einem RASPI mit FHEM. Über FHEM kann ich alle Daten der Anlage auslesen und einen Großteil auch einstellen (Was ich aber eigentlich nicht nutze).
Was ich nutze ist die Steuerung der Lüftungsstufe. Diese kann in drei Stufen eingestellt werden und unterscheidet Tag und Nacht.

Was habe ich aktuell:
Die Außentemperatur wird in einem langen Datenfeld das "sGlobal" heißt geliefert, das so aussieht: (Die Außentemperatur habe ich mal Fett markiert)


outsideTemp: 14.3 flowTemp: 28.5 returnTemp: 23.8 hotGasTemp: 36 dhwTemp: 47.1 flowTempHC2: -60 evaporatorTemp: 21.9 condenserTemp: 22.6 mixerOpen: 0 mixerClosed: 0 heatPipeValve: 0 diverterValve: 0 dhwPump: 0 heatingCircuitPump: 0 solarPump: 0 compressor: 0 boosterStage3: 0 boosterStage2: 0

Diese Temperatur frage ich bereits erfolgreich über ein Readingsval ab:
AussenTemp:sGlobal.* {(split ' ',ReadingsVal("LWZ403","sGlobal",0))[1]}

Die Lüftungsstufe kann ich z.B. via folgendem FHEM Befehl setzen (in diesem Fall Stufe 0, also deaktiviert:
set LWZ403 p07FanStageDay 0

Was ist mein Ziel:
Ich würde gerne abhängig von der Außentemperatur die Lüftung steuern, so dass diese z.B. ab einer Außentemp. von > 20°C ausgeschaltet wird,
um nicht den Tag über warme Luft ins Haus zu blasen. Die Überprüfung soll alle 5 Minuten stattfinden.
Ich habe einen Ansatz via "if" probiert aber scheitere vermutlich an der Syntax oder ggfs. auch am falschen Ansatz.
if ({(split ' ',ReadingsVal("LWZ403","sGlobal",0))[1]} <= 20) {fhem('set LWZ403 p07FanStageDay 3')}

Im Moment komme ich hier nicht weiter, und würde mich über ein paar Hinweise sehr freuen.

Gruß
Christian

rabehd

Zitat von: drcliff am 20 Mai 2020, 07:54:53
Diese Temperatur frage ich bereits erfolgreich über ein Readingsval ab:
AussenTemp:sGlobal.* {(split ' ',ReadingsVal("LWZ403","sGlobal",0))[1]}
Was machst Du damit? Einem Dummy zuweisen oder ein Userreading? Gibt es ein Event, wenn Du den abspeicherst?

Zitat von: drcliff am 20 Mai 2020, 07:54:53
Was ist mein Ziel:
.. Die Überprüfung soll alle 5 Minuten stattfinden.
Ich habe einen Ansatz via "if" probiert aber scheitere vermutlich an der Syntax oder ggfs. auch am falschen Ansatz.
if ({(split ' ',ReadingsVal("LWZ403","sGlobal",0))[1]} <= 20) {fhem('set LWZ403 p07FanStageDay 3')}
Für regelmäßige Prüfung fällt mit at und DOIF ein.
Sinnvoll wäre wohl eher die Reaktion auf Änderung (deshalb die Frage nach dem Event) dann notify oder DOIF.
(Es gibt sicher noch andere Möglichkeiten).

Das mal als Hinweise, mehr bei mehr Info und mehr Bedarf.

PS: Eigentlich eine Anfängerfrage, deshalb hier falsch.
Auch funktionierende Lösungen kann man hinterfragen.

drcliff

Zitat von: rabehd am 20 Mai 2020, 11:17:35
Was machst Du damit? Einem Dummy zuweisen oder ein Userreading? Gibt es ein Event, wenn Du den abspeicherst?
In einem Userreading wird der Wert (mit drei anderen zusammen) ausgelesen. Ein Event wird nicht erzeugt.
Die vier ausgelesenen Werte werden dann in einem Dashboard dargestellt.

Zitat von: rabehd am 20 Mai 2020, 11:17:35
Sinnvoll wäre wohl eher die Reaktion auf Änderung (deshalb die Frage nach dem Event) dann notify oder DOIF.
(Es gibt sicher noch andere Möglichkeiten).
Ich bin für jede Möglichkeit offen, gerne auch über Zustandsänderung. Allerdings habe ich da noch nicht die Erfahrung mit.

Zitat von: rabehd am 20 Mai 2020, 11:17:35
PS: Eigentlich eine Anfängerfrage, deshalb hier falsch.
Habs mal einem Mod geschickt, dass es verschoben wird. Danke.

Gruß
Christian

rabehd

#3
ZitatIch bin für jede Möglichkeit offen, gerne auch über Zustandsänderung. Allerdings habe ich da noch nicht die Erfahrung mit.
Deine Erfahrungen kenne ich nicht und für eine Lösung musst Du Dich entscheiden. Die kann man dann hier diskutieren.
Mein Favorit wäre DIOF, für einen Anfänger ist ein notify besser zum üben.
Dafür brauchst Du auf jeden Fall ein Event, alles andere finde ich nicht sinnvoll.
Auch funktionierende Lösungen kann man hinterfragen.

krikan

Zitat von: drcliff am 20 Mai 2020, 12:33:35
Habs mal einem Mod geschickt, dass es verschoben wird. Danke.
Als Themeneröffner kannst Du selbst verschieben. Den Button "Thema verschieben" findest Du ganz links unterhalb des Themas.
Siehe auch: https://forum.fhem.de/index.php/topic,107904.0.html

drcliff

Hallo zusammen,

aktuell teste ich immer noch am "Vergleichen" der Außentemperatur herum (sorry, weiß nicht wie ich es anders nennen sollte.)

Zum Testen tue ich dies auf Bais eines "einfachen" if, wenn da die Auswertung funktioniert werde ich mir die Automatisierung via Notify anschauen,
aber zunächst muss ja erst mal die Bedingung richtig erkannt werden.

Hier meine aktuelle Bedinung:
define Lueftungssteuerung at +*00:01:00 { if ({round(ReadingsNum("LWZ403","sGlobal",0),0)} < 21) { fhem("set LWZ403 p07FanStageDay 3") } else { fhem("set LWZ403 p07FanStageDay 1") } }

In diesem Beispiel sollte quasi die Lüftungsstufe bei einer Außentemperatur < 21 Grad auf Stufe drei geschaltet werden, andernfalls auf Stufe 1.
Jedoch ist es egal welcher Wert für die Außentemperatur ausgelesen wird, es wird immer nur die Stufe 1 geschaltet.

Die Ausgabe von {round(ReadingsNum("LWZ403","sGlobal",0),0)} ergibt aktuell:
20

Somit müsste doch auf jeden Fall Stufe 3 geschaltet werden.

Habt ihr noch einen Tipp für mich?

Gruß
Christian

Damian

if ({round(ReadingsNum("LWZ403","sGlobal",0),0)} < 21)

rot ist zuviel.

Wenn die Syntax stimmt, wird dir auffallen, dass bei dir im Minutentakt geschaltet wird - das willst du nicht wirklich ;)

Alternativ :

define di_lueftung DOIF ([LWZ403:sGlobal:d] <21]) (set LWZ403 p07FanStageDay 3) DOELSE (set LWZ403 p07FanStageDay 1)

hier wird nur geschaltet, wenn es nötig ist.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Wernieman

Ich kann mich nur anschließen: Du willst entscheiden, ob geschaltet wird, wenn neue Werte reinkommen. Warum soll er also alle X Minuten nachgucken, wenn er bei Änderung gucken kann?
Also nischd at sondern ein notify ..
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

drcliff

Hallo,

vielen Dank für die Tipps, ich habe das nun mit DOIF umgesetzt wie du es vorgeschlagen hast. (Nur ein "]" war zu viel, hab ich aber hingekriegt)
(Die Version oben mit dem "IF" ging eher darum, die Bedingung richtig zu verstehen und den Befehl auszuführen.)

Ich versuche nun noch eine zusätzliche DOELSEIF Bedingung hinzufügen, um insgesamt drei Stufen schalten zu können sowie das ganze für Tag UND Nacht
Ich habe hier aktuell diese DEF:
([LWZ403:sGlobal:d] <19) (set LWZ403 p07FanStageDay 2,set LWZ403 p08FanStageNight 2,{log 1, "Aussentemperatur < 19°C, Lüfterstufen auf 2 geschaltet."}) DOELSEIF ([LWZ403:sGlobal:d] <22) (set LWZ403 p07FanStageDay 1,set LWZ403 p08FanStageNight 1,{log 1, "Aussentemperatur zw. 19-22°C, Lüfterstufen auf 1 geschaltet."}) DOELSE (set LWZ403 p07FanStageDay 0,set LWZ403 p08FanStageNight 0,{log 1, "Aussentemperatur > 22°C, Lüfterstufen auf 0 geschaltet."})

Die Lüfterstufen werden auf jeden Fall korrekt geschaltet und es erfolgt auch eine Ausgabe im Log.

Diese sieht beim manuell durchschalten der drei CMD wie folgt aus:
2020.05.22 07:57:32 2: Lueftung_Steuerung_Sommer: set LWZ403 p07FanStageDay 2: 2
2020.05.22 07:57:33 2: Lueftung_Steuerung_Sommer: set LWZ403 p08FanStageNight 2: 2
2020.05.22 07:57:33 2: Lueftung_Steuerung_Sommer: {log 1, "Aussentemperatur < 19°C, Lüfterstufen auf 2 geschaltet."}: Aussentemperatur < 19°C, Lüfterstufen auf 2 geschaltet.
2020.05.22 07:57:41 2: Lueftung_Steuerung_Sommer: set LWZ403 p07FanStageDay 1: 1
2020.05.22 07:57:41 2: Lueftung_Steuerung_Sommer: set LWZ403 p08FanStageNight 1: 1
2020.05.22 07:57:41 2: Lueftung_Steuerung_Sommer: {log 1, "Aussentemperatur zw. 19-22°C, Lüfterstufen auf 1 geschaltet."}: Aussentemperatur zw. 19-22°C, Lüfterstufen auf 1 geschaltet.
2020.05.22 07:57:49 2: Lueftung_Steuerung_Sommer: {log 1, "Aussentemperatur > 22°C, Lüfterstufen auf 0 geschaltet."}: Aussentemperatur > 22°C, Lüfterstufen auf 0 geschaltet.


Für CMD1 und CMD2 werde somit die set Befehl im LOG angezeigt, für CMD3 komischerweise nicht.
Außerdem wird der "LOG Text" auch komisch dargestellt.
Ich habe schon unterscheidlichste Versionen mit Klammern und Anführungszeichen probiert, aber alle ohne Erfolg.
Hat noch jemand einen Tipp dazu?

Danke und Gruß
Christian