FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: mfeske am 19 Oktober 2015, 21:20:46

Titel: DOIF für Heizungssteuerung
Beitrag von: mfeske am 19 Oktober 2015, 21:20:46
Hallo zusammen,

ich habe mir ein DOIF für die Heizungssteuerung angelegt. Von der Sache her funktioniert es sogar auf Anhieb. Ich befürchte mir nur mit der Programmsteuerung ein kleines Eigentor geschossen zu haben:
DOIF
define Heizung_Janic_doif DOIF ([location_janic] eq "absent") ({SetTempList_Janic_Heizung_absent}) DOELSEIF ([location_janic] eq "home" and [Ferientag_Berlin] eq "NEIN" and [Hauptschalter_Heizung_Kinder] eq "an") ({SetTempList_Janic_Heizung_present}) DOELSEIF ([location_janic] eq "home" and [Ferientag_Berlin] eq "JA"and [Hauptschalter_Heizung_Kinder] eq "an") ({SetTempList_Janic_Heizung_Ferien}) DOELSE ({SetTempList_Janic_Heizung_absent})
attr Heizung_Janic_doif room Janic

99_myUtils.pm
sub
SetTempList_Janic_Heizung_normal()
{
{ fhem ("set Heizung_Janic weekProfile Mon 18,6:00,21,7:00,18,15:00,21.5,17:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Tue 18,6:00,21,7:00,18,15:00,21.5,17:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Wed 18,6:00,21,7:00,18,15:00,21.5,17:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Thu 18,6:00,21,7:00,18,15:00,21.5,17:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Fri 18,6:00,21,7:00,18,14:00,21.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Sat 18,6:00,21,7:00,20.5,14:00,20,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Sun 18,6:00,21,7:00,20.5,14:00,20,18:15,18,23:59,18")};
{ fhem ("set Heizung_Janic boostDuration 5")};
{ fhem ("set Heizung_Janic boostValveposition 99")};
}
sub
SetTempList_Janic_Heizung_off()
{
{ fhem ("set Heizung_Janic weekProfile Mon 16,6:00,16,7:00,16,15:00,16,17:00,16,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Tue 16,6:00,16,7:00,16,15:00,16,17:00,16,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Wed 16,6:00,16,7:00,16,15:00,16,17:00,16,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Thu 16,6:00,16,7:00,16,15:00,16,17:00,16,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Fri 16,6:00,16,7:00,16,14:00,16,19:00,16,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Sat 16,6:00,16,7:00,16,14:00,16,19:00,16,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Sun 16,6:00,16,7:00,16,14:00,16,18:15,16,23:59,18")};
{ fhem ("set Heizung_Janic boostDuration 5")};
{ fhem ("set Heizung_Janic boostValveposition 99")};
}
sub
SetTempList_Janic_Heizung_Ferien()
{
{ fhem ("set Heizung_Janic weekProfile Mon 18,6:00,20,8:00,20.5,15:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Tue 18,6:00,20,8:00,20.5,15:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Wed 18,6:00,20,8:00,20.5,15:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Thu 18,6:00,20,8:00,20.5,15:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Fri 18,6:00,20,8:00,20.5,14:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Sat 18,6:00,20,8:00,20.5,14:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic weekProfile Sun 18,6:00,20,8:00,20.5,14:00,20.5,17:00,18.5,19:00,18,23:59,18")};
{ fhem ("set Heizung_Janic boostDuration 5")};
{ fhem ("set Heizung_Janic boostValveposition 99")};
}
sub
SetTempList_Janic_Heizung_absent()
{
{ fhem ("attr Heizung_Janic scanTemp 0")};
{ fhem ("set Heizung_Janic desiredTemperature 15")};
}
sub
SetTempList_Janic_Heizung_present()
{
{ fhem ("attr Heizung_Janic scanTemp 1")};
{ fhem ("set Heizung_Janic desiredTemperature auto")};
}


Wenn Janic da ist und es sind Ferien wird ja in den Ferienmodus geschaltet. Wenn die Ferien zu Ende sind wird ja dann das normale SetTempList_Janic_Heizung_present aufgerufen und damit bleibt aber das Ferienprogramm. Sollte ich diese Frage bzw. das Schreiben Ferien ja --> SetTempList_Janic_Heizung_Ferien() Ferien nein --> SetTempList_Janic_Heizung_normal() in ein gesondertes DOIF auslagern ? Meine Sorge ist dann allerdings, das Janic absent ist und es kommen die Ferien und die Heizung ist an, owohl niemand da ist.

Gruß
Micha
Titel: Antw:DOIF für Heizungssteuerung
Beitrag von: Ellert am 20 Oktober 2015, 14:31:08
Du könntest für jede wichtige Kombination der Zustände deiner Eingangsgrößen Anwesend (A) Ja/Nein Ferien (F) Ja/Nein den Zustand deiner Ausgangsgrößen  Heizung (H) off, normal, ferien gegenüberstellen.

A F H
0 0 off
0 1 off
1 0 normal
1 1 ferien

Daraus machst du das DOIF

DOIF      ![A] and ![F] set H off
DOELSEIF  ![A] and  [F] set H off
DOELSEIF   [A] and ![F] set H normal
...

Der letzte Zweig ist für dich.


Titel: Antw:DOIF für Heizungssteuerung
Beitrag von: mfeske am 20 Oktober 2015, 21:01:27
Hallo Ellert,

danke für den Tipp mit der grafischen Darstellung, eine gute Idee für die Veranschaulichung, so wird auch ein anfangs unübersichtliches DOIF überschaubar.
Der letzte Zweig ? Ich denke die richtige Lösung wäre:
DOELSEIF   ![A] and ![F] set H normal
Ich habe ja noch den Schalter als zusätzliche Komponente. Ich habe mir Dein Schema genommen und das sieht den bei mir so aus:
A=Anwesenheit F=Ferien S=Schalter H=Heizung
A F S H
0 0 0 off
0 1 0 off
1 0 0 off
1 1 0 off
0 0 1 off
0 1 1 off
1 0 1 on normal !
1 1 1 on Ferien !


Ich sehe jetzt noch das Problem, das das richtige Wochenprogramm geladen werden muss, wenn es einen Wechsel Ferien / nicht Ferien oder nicht Ferien / Ferien gibt da ja die Kombinationen oben nur ein Wechsel zwischen {SetTempList_Janic_Heizung_present} und {SetTempList_Janic_Heizung_absent} sind. Das Wochenprogramm soll ja auch nicht bei jedem Wechsel der Kombinationen geändert werden sondern nur wenn es einen Wechsel bei [Ferientag_Berlin] gibt.

Mein momentanes DOIF wechsel dies noch nicht berücksichtigt sieht so aus:
define Heizung_Janic_doif DOIF
([location_janic] eq "absent" and [Ferientag_Berlin] eq "NEIN" and [Hauptschalter_Heizung_Kinder] eq "aus") ({SetTempList_Janic_Heizung_absent}) DOELSEIF
([location_janic] eq "absent" and [Ferientag_Berlin] eq "JA" and [Hauptschalter_Heizung_Kinder] eq "aus") ({SetTempList_Janic_Heizung_absent}) DOELSEIF
([location_janic] eq "home" and  [Ferientag_Berlin] eq "NEIN" and [Hauptschalter_Heizung_Kinder] eq "aus") ({SetTempList_Janic_Heizung_absent}) DOELSEIF 
([location_janic] eq "home" and  [Ferientag_Berlin] eq "JA" and [Hauptschalter_Heizung_Kinder] eq "aus") ({SetTempList_Janic_Heizung_absent}) DOELSEIF
([location_janic] eq "absent" and [Ferientag_Berlin] eq "NEIN" and [Hauptschalter_Heizung_Kinder] eq "an") ({SetTempList_Janic_Heizung_absent}) DOELSEIF 
([location_janic] eq "absent" and [Ferientag_Berlin] eq "JA" and [Hauptschalter_Heizung_Kinder] eq "an") ({SetTempList_Janic_Heizung_absent}) DOELSEIF
([location_janic] eq "home" and  [Ferientag_Berlin] eq "NEIN" and [Hauptschalter_Heizung_Kinder] eq "an") ({SetTempList_Janic_Heizung_present}) DOELSEIF
([location_janic] eq "home" and  [Ferientag_Berlin] eq "JA" and [Hauptschalter_Heizung_Kinder] eq "an") ({SetTempList_Janic_Heizung_present})


Gruß
Micha
Titel: Antw:DOIF für Heizungssteuerung
Beitrag von: Ellert am 21 Oktober 2015, 00:54:18
Leider falsch. Was du schreibst, steht schon in der 1. Zeile. Richtig wäre [A] and [F] set H ...

Bei deiner Tabelle könntes Du die ersten vier Möglichkeiten zusammenfassen. Wenn S off ist, dann hat A und F keinen Einfluss auf das Ergebnis.

S  eq "aus" ==> F off

Du kannst dann die Vereinfachung, Zeile 5 und 6 "or" verknüpfen. Dann hast du für jedes unterschiedliche Ergebnis eine Zeile.
S  == 0 or A == 0 and F == 0  and S == 1 or A == 0 and F == 1  and S == 1  set H off


Mit einem Fragezeichen vor dem Reading kannst du festlegen, ob es aktiv schaltet oder nur abgefragt wird.
Schau doch bitte mal in die deutsche Commandref, wie die genaue Syntax lautet.