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
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.
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
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.