Hauptmenü

DOIF für Heizungssteuerung

Begonnen von mfeske, 19 Oktober 2015, 21:20:46

Vorheriges Thema - Nächstes Thema

mfeske

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
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

Ellert

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.



mfeske

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
Hardware:
1 x Raspberry Pi Mod. B 512 MB
eq-3 2 x MAX! eTRV Heizungssteller, 1 x MAX! Fensterkontakt, 1 x MAX! Cube - LAN Gateway (ausser Betrieb)
Intertechno 1x ITZ-500, 3x ITT-1500, 9x ITR-1500, 3 x ITDL-1000, 2 x ITL-500
1 x CC1101-USB-Lite 433MHz (CUL433)  V3 1 x CC1101-USB-Lite 868MHz (CUL868)

Ellert

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.