Verständnisfrage zur Rangfolge von Ereignissen

Begonnen von romarira, 22 Oktober 2015, 20:15:25

Vorheriges Thema - Nächstes Thema

romarira

Hallo,

ich wende mich heute mit einer Verständnisfrage an euch. Es geht um die Steuerung von Heizkörperventilen.
Ich steuer über FHEM vier Heizkörperventile. Dabei schalte ich die Ventile über FHT80b3-Einheiten.
Die unterschiedlichen Zeiten unter der Woche und am Wochenende steuere ich über die DOIF-Funktion.
Für Feiertage nutze ich eine NRW.holiday-Datei im Zusammenspiel mit holiday2we.

Das klappt soweit alles ganz gut.

Jetzt möchte ich aber gerne die Steuerung im Zusammenspiel mit einem Google-Kalender auf Ferien, Urlaube und Sommer-/Winterheizperiode ausbauen. Da steige ich jetzt gerade aus, wie ich das umsetzen kann.
Habe dazu auch schon Beiträge mit dummy und Abfrage von Google-Kalender gefunden.

Ferien sind für mich Zeiträume, in denen die Kinder frei haben und die Heizkörper später hochfahren müssen. Die Erwachsenen müssen aber ggf. früher raus und das Badezimmer soll früher starten.
Urlaube sind Zeiten, in denen wir verreist sind und die Heizungen nur auf Frostschutz laufen sollen.

Jetzt gibt es Situationen, in denen ein Sachverhalt mehrfach vorliegen kann.
Z.B. können Feiertage auch im Urlaub sein oder in der Sommerperiode sein, da sollte die Heizung also nicht anspringen.

Muss ich um diese ganzen Ausschlüsse einzeln programmieren oder gibt es da "Programmiertricks"?

Ich habe wenig Programmiererfahrung und lese mich in alles ein und versuche es dann umzusetzen.
Unter Basic auf dem C64, hätte ich früher versucht das über den Sprung in Unterprogramme zu regeln.
Muss man das bei FHEM auch so machen?

Vielleicht kann mir jemand bei diesem Verständnisproblem helfen, wäre schön.

Mein FHEM läuft auf einem BananaPi mit einem CUL.


Ellert

Für komplexe Aufgaben bietet sich ein Zustandsdiagram an oder ein Flussdiagram. Manchmal reicht auch eine Wahrheitstabelle.

Im Grunde musst Du das Problem nicht so allgemein formulieren, sondern detailiert analysieren. Also darstellen, welche Komponenten und deren Zustände bewirken was für Abläufe zu welcher Zeit oder Bedingungen mit bestimmten Ergebnissen.

romarira

Hallo, gerne nachfolgend einmal eine Darstellung, wie ich mir den Ablauf vorstelle:

Anforderungen Heizungssteuerung

1.   Regelbetrieb
a.   Jeder Raum kann separat angesprochen werden
b.   Zeiten und Temperaturen werden über FHEM gesteuert
c.   Fenster offen und zu  wird über das Raumthermostat gesteuert

2.   Wochenende
a.   Wie vor, aber andere Zeiten werden geschaltet

3.   Sommer/Winter
a.   Schalter für Sommer und Winter
b.   Wenn Schalter Sommer = Ja, dann Temperaturen durchgängig für alle Thermostate auf 12 Grad stellen
c.   Wenn Schalter Sommer = Nein, dann Regelbetrieb

4.   Urlaub mit Abwesenheit
a.   Wert aus Googlekalender ziehen, wenn Eintrag dort = ,,Urlaub" anwenden
b.   Wenn Sommer = Ja, keine Auswirkungen
c.   Wenn Sommer = Nein, dann Temperatur = 12 Grad, wieder auf Regelbetrieb, wenn letzter Urlaubstag = Rückkehr

5.   Ferien ohne Abwesenheit
a.   Wert aus Googlekalender ziehen, wenn Eintrag dort = ,,Ferien" anwenden
b.   Für jeden Tag Wochenendprogramm laufen lassen

6.   Sylvester
a.   Heizung bis 01.01. – 3 Uhr durchlaufen lassen,
b.   am 1.1. = Feiertagsregel

7.   Feiertag
a.   An Feiertagen = Wochenendprogramm laufen lassen
b.   Steuerung über NRW.holiday

Ich hoffe, ihr könnt damit was anfangen.

An Komponenten gibt es bei mir einen CUL, der an einen Banana Pi angeschlossen ist.
Außerdem in jedem Raum ein FHT80b3 und an jedem Heizkörper die FHT-Heizkörperstellmotoren.
In jedem Raum einen Fensterkontakt.

Die Steuerung der FHT läuft über die FHT80b3.


Ellert

ZitatFerien sind für mich Zeiträume, in denen die Kinder frei haben und die Heizkörper später hochfahren müssen. Die Erwachsenen müssen aber ggf. früher raus und das Badezimmer soll früher starten.
Urlaube sind Zeiten, in denen wir verreist sind und die Heizungen nur auf Frostschutz laufen sollen.

Jetzt gibt es Situationen, in denen ein Sachverhalt mehrfach vorliegen kann.
Z.B. können Feiertage auch im Urlaub sein oder in der Sommerperiode sein, da sollte die Heizung also nicht anspringen.
Hier könntest Du diese Herangehensweise nutzen: http://forum.fhem.de/index.php/topic,42567.msg347267.html#msg347267

ZitatMuss ich um diese ganzen Ausschlüsse einzeln programmieren oder gibt es da "Programmiertricks"?
Du könntest für jedes der 7 Kalenderereigniskategorien einen DOIF Bedingungszweig formulieren und für jeden Bedingungszweig ein weiteres DOIF mit je einem Befehlszweig für die Nebenbedingungen.
define di1 DOIF [Kalenderereignisse] eq "Ereignis1"
DOELSEIF ...
...

define di1_1 DOIF [di1] eq "cmd_1" and [NebenbedingungA] eq "xyz1" and/or [NebenbedingungB] eq "xyz2" set Ventil1 15.0 ...
DOELSEIF [di1] eq "cmd_2" ...
DOELSEIF ...
...

define di1_2 DOIF ...
...


Oder Du versuchst vorhandene Module zu nutzen. RESIDENTS, HCS, PRESENCE WEEKDAYTIMER...
Lies mal die Commandref quer da gibt es einige Module die Teil deiner Lösung sein könnten.

Du kannst auch im Kalender Befehlssequenzeneintragen und ausführen lassen.
im Kalender: set Ventil1 15.0; set Ventil2 18.0
in FHEM: DOIF ([Kalendereintrag]) ({fhem "[Kalendereintrag]"})


Du wirst nicht drum' herumkommen, für jede relevante Ereigniskombination eine Bedingungskette und eine Befehlskette zu finden und die in einem DOIF, notify oder at zu konfigurieren.

ZitatUnter Basic auf dem C64, hätte ich früher versucht das über den Sprung in Unterprogramme zu regeln.
Muss man das bei FHEM auch so machen?
Muss nicht, kann. Perl-Subroutinen werden in der 99_myUtils.pm definiert.

Wenn Dir eine Wahrheitstabelle zu Umfangreich wird, kannst Du die Ereignisse auch nach dem Gewicht Ihres Einflusses betrachten.

Beispiel Winter/Sommer
Im Sommer sind alle anderen Ereignisse/Zustände nicht relevant, also für Dummy Heizperiode = 0 gibt es nur einen Bedingungszweig --> Ventile = 12.0. Heizperiode  muss in jedem Bedingungszweig abgefragt werden.
"Urlaub mit Abwesendheit" ist nicht detailiert genug, es verbergen sich zwei Zustände Urlaub und Anwesend

DOIF !Heizperiode  set Ventile 12.0
DOELSEIF Heizperiode and Urlaub and !Anwesend set Ventile 12.0
DOELSEIF Heizperiode and !Urlaub and Anwesend set Ventile Regelbetrieb
...

Hierbei kann man schnell den Überblick verlieren eine Bedingung vergessen.

moonsorrox

#4
ich glaube die "Anforderungen Heizungssteuerung" sieht hier schlimmer aus als es wirklich ist.
Ich würde als 1. ein Dummy nehmen welches auf Sommer/Winter gestellt wird

dann würde ich "4. Urlaub mit Abwesenheit" und "5.Ferien ohne Abwesenheit" in einem weiteren Dummy zusammenfassen, denn diese Konstellation wird es sicher nicht zusammen geben.

Der Rest "1.Regelbetrieb, 2.Wochenende, 6.Sylvester, 7.Feiertag, geht in einem DOIF sicher über die Tage.

Das heißt zwei Dummys und 2 DOIF .. 1.DOIF Sommer, 2.DOIF Winter, wenn dies Geschichte so akzeptiert würde, kann man sich über den Code Gedanken machen, wobei Sommer ja relativ einfach ist.

Wenn gewünscht, könnte man bei Regelbetrieb ein extra Dummy nehmen welches die Zeiten manuell vorgibt..!
So z.B. ich möchte das die Heizung morgens um 6 Uhr an geht und Abends ebenso.

Hier mal die dummy Beispiele für WochenTag
define du_HeizungZeit_Ein dummy
attr du_HeizungZeit_Ein alias Heizung-Ein WoTag
attr du_HeizungZeit_Ein devStateIcon .*:rc_BLANK
attr du_HeizungZeit_Ein group Heizung
attr du_HeizungZeit_Ein icon icoUhr
attr du_HeizungZeit_Ein room Heizung
attr du_HeizungZeit_Ein sortby 01
attr du_HeizungZeit_Ein setList state:time
attr du_HeizungZeit_Ein webCmd state


und WochenEnde
define du_HeizungZeit_Ein _WoE dummy
attr du_HeizungZeit_Ein_Ein_WoE alias Heizung-Ein WoE
attr du_HeizungZeit_Ein_WoE devStateIcon *:rc_BLANK
attr du_HeizungZeit_Ein_WoE group Heizung
attr du_HeizungZeit_Ein_WoE icon icoUhr
attr du_HeizungZeit_Ein_WoE room Heizung
attr du_HeizungZeit_Ein_WoE setList state:time
attr du_HeizungZeit_Ein_WoE sortby 02
attr du_HeizungZeit_Ein_WoE webCmd state


Abends lass ich hier jetzt mal weg und dummy für die Urlaubs und Ferienzeit ebenfalls, weil wäre angepasst wie das für Sommer und Winter

Sommer Winter
define du_Modus_Heizung dummy
attr du_Modus_Heizung alias Sommer-Winter Betrieb
attr du_Modus_Heizung devStateIcon Sommer:general_an_fuer_zeit@lightgreen Winter:general_an_fuer_zeit@Crimson Aus:general_aus_fuer_zeit@yellow
attr du_Modus_Heizung eventMap Sommer Winter
attr du_Modus_Heizung group Heizung
attr du_Modus_Heizung icon time_clock@LightSlateGray
attr du_Modus_Heizung room Heizung
attr du_Modus_Heizung setList state:Sommer,Winter,Aus
attr du_Modus_Heizung sortby 03
attr du_Modus_Heizung webCmd state


Wenn das so OK wäre kann man sich an die DOIF machen
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

bergadler

#5
Hallo,

hier mal meine FHT-"Steuerungen":

zu 1: Regelbetrieb
Man kann bei den FHTs zwei Zeiten programmieren, z.B. eine frühs - alle da, eine abends, - alle wieder da.
(Oder eine frühs (Eltern) und eine frühs (Kinder) und dann eben abends per FHEM.)

zu 2: Wochenende
Andere Zeiten, die werden aber auch direkt in den FHTs programmiert

Diese beiden Punkte sind die Grundfunktion und laufen FHEM-unabhängig.


zu 3: Sommer/Winter
Wozu extra unterscheiden, brauchst Du nicht.
Wenn die Temperatur über die eingestellten z.B. 19/21 Grad ist, bleiben die Ventile ja sowieso komplett zu.
Also ignorieren und einfach weg lassen.

zu 4: Urlaub mit Abwesenheit
Dafür gibt es beim FHT die Urlaubsfunktion.
Gut, das Datum muß man bei Bedarf erst manuell setzen, aber wie oft im Jahr macht man schon Urlaub. ;)
Dann, bei Verlassen des Hauses, ein aktivieren per Dummyschalter mit z.B.
set TYPE=FHT mode holiday desired-temp 16

zu 5: Ferien/Urlaub ohne Abwesenheit
Einfach ein Eintrag in die *.holiday -> ergibt die Settings wie an Wochenenden

zu 6: Sylvester
Ist einmal pro Jahr, das kann man mE. doch schon mal manuell setzen.

zu 7: Feiertag
Wie genannt, wird über die *.holiday automatisch gesteuert.


Weiterhin habe ich noch zwei Dummies ("habe ich morgen Frühschicht", "jetzt mal schnell duschen"),
die dann spontan den FHT Mode auf manuell setzen und die Temp in Bad und Küche außer der Reihe regeln.
(und auch noch diverse Handtuch-Heizer, Radio, Lichter ... entsprechend schalten.)

Gruß
aktuelles FHEM auf Raspberry B+, FHEM von fhem.de V.5.7, CUL868 V1.57, (6x FHT80B+ FHTTK, div. IT,div. FS20,Harmony Hub)

Ellert

ZitatWozu extra unterscheiden, brauchst Du nicht.

Homatic empfiehlt ausserhalb der Heizperiode die Ventile in di "on" Position zufahren, damit die Mechanik entlastet wird.

bergadler

#7
Da müssen die ja ziemlich wenig Vertrauen in ihre eigene Mechanik haben.

Und bei FHT + FHTTK würde bei "permanent on" das Ventil beim Lüften immer zu - und wieder auf fahren.
siehe auch hier:
http://forum.fhem.de/index.php/topic,24546.0.html
aktuelles FHEM auf Raspberry B+, FHEM von fhem.de V.5.7, CUL868 V1.57, (6x FHT80B+ FHTTK, div. IT,div. FS20,Harmony Hub)

moonsorrox

Ich denke wir warten einfach mal ab was der TE zu unseren Vorschlägen sagt und wie er sich letztendlich entscheidet.... Er wird sicher da noch jung dabei in FHEM einiges an Erfahrung sammeln und sich dann entscheiden was er alles braucht von seiner 1. Anforderung  :D
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

romarira

Wow, herzlichen Dank für die vielen Einträge.

Ich denke, ich werde eine Mischung der verschiedenen Vorschläge versuchen. Insbesondere einen Befehl in einen Kalendereintrag zu übernehmen, finde ich total spannend.

@bergadler:
In die FHT80b werde ich keine Programmierung übernehmen. Davon möchte ich gerne weg, weil ich mir vorgenommen habe, nach und nach auch weitere Dinge über FHEM zu steuern, z.B. Rolladen, Steckdosen und sowas. Dazu will ich verstehen, was ich da programmieren muss. Es hilft mir dann wenig, wenn ich den FHT80b die Steuerung für die Standardfälle übergebe, bei den Rolladen dann aber nicht weiß, was ich tun soll.

Das wird für mich ein Projekt über mehrere Monate werden, daher wollte ich zu Beginn die Verständnisfragen geklärt haben.

Vielen Dank für eure tatkräftige Unterstützung, jetzt geht es daran, mich im Detail mit euren Vorschlägen auseinanderzusetzen. Möglicherweise werde ich noch mal mit der ein oder anderen Spezialfrage kommen, wenn ich nicht weiterkomme oder einen Fehler nicht finden kann.


romarira

#10
Tja, da geht es schon los, dass meine Programmierung nicht das tut, was sie soll  :-[

Aufbauend auf dem Code von moonsorrox habe ich den Dummy angelegt. War sehr hilfreich um auch zu verstehen, was das in der Darstellung auslöst (Farben, Icon ect.).

Ich bekomme im LOG auch keine Fehlermeldung, aber der Code löst auch keinerlei Reaktion aus. Es wäre nett, wenn jemand von euch einmal drauf schauen könnte, wo der Fehler liegt. Wie gesagt, ich bin Newbie was programmieren angeht. Gerne darf die Antwort daher auch etwas erklärender sein.  :o

Der Dummy zeigt auch an, dass state = Winter ist.


################################################################
#Dummy Heizperiode
################################################################
#
define dum_Heizperiode dummy
attr dum_Heizperiode alias Sommer-Winter-Betrieb
attr dum_Heizperiode devStateIcon Sommer:general_an_fuer_zeit@lightgreen Winter:general_an_fuer_zeit@crimson
# gehört zum vorherigen Teil, wenn Aus gewünscht ist -----   Aus:general_aus_fuer_zeit@yellow
attr dum_Heizperiode eventMap Sommer Winter
attr dum_Heizperiode group Schalter
attr dum_Heizperiode icon time_clock@LightSlateGray
attr dum_Heizperiode room Schalter
attr dum_Heizperiode setList state:Sommer,Winter,Aus
attr dum_Heizperiode sortby 03
attr dum_Heizperiode webCmd state
#



################################################################
# Badezimmer oben an Wochentagen zwei Schaltprogramme,
# am Wochenende nur ein Schaltprogramm
#################################################################
define Heizperiode_1 DOIF ([dum_Heizperiode] eq "Winter") \
(define AN_1_BadezimmerOben DOIF ([05:30|8] or [08:00|7]) (set hzg_BZ_oben  desired-temp 22) DOELSEIF ([07:00|8] or [22:00|7]) (set hzg_BZ_oben  desired-temp 17)) \
DOELSEIF (define AN_1_WINTER_BadezimmerOben ([dum_Heizperiode] eq "Sommer") (set hzg_BZ_oben desired-temp 9))
define Heizperiode_2 DOIF ([dum_Heizperiode] eq "Winter") \
(define AN_2_BadezimmerOben DOIF ([13:00|8]) (set hzg_BZ_oben  desired-temp 22) DOELSEIF ([22:00|8]) (set hzg_BZ_oben  desired-temp 17)) \
DOELSEIF (define AN_2_WINTER_BadezimmerOben ([dum_Heizperiode] eq "Sommer") (set hzg_BZ_oben desired-temp 9))
#


Vielen Dank für Eure Hilfe !

moonsorrox

ohne deine Geräte zu kennen würde ich sagen, dass geht so nicht... dieser Teil hier ist gemeint
desired-temp 22
da ich soetwas aber nicht im Einsatz, ist es also nicht sicher ob ich Recht habe...
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

romarira

Zitat
ohne deine Geräte zu kennen würde ich sagen, dass geht so nicht... dieser Teil hier ist gemeint
Code: [Auswählen]

desired-temp 22

da ich soetwas aber nicht im Einsatz, ist es also nicht sicher ob ich Recht habe...

Da sehe ich kein Problem. Der bisherige Code hatte das auch drin und das funktionierte einwandfrei. Hier mal das Beispiel für einen anderen Raum, dessen Schaltung einwandfrei funktioniert:


define AN_1_Ricci_AZ DOIF ([05:45|8] or [09:00|7]) (set hzg_Ricci_AZ desired-temp 22) DOELSEIF ([07:00|8] or [22:00|7]) (set hzg_Ricci_AZ desired-temp 17)
define AN_2_Ricci_AZ DOIF ([13:00|8]) (set hzg_Ricci_AZ desired-temp 22) DOELSEIF ([22:00|8]) (set hzg_Ricci_AZ desired-temp 17)

Ellert

Zitat################################################################
# Badezimmer oben an Wochentagen zwei Schaltprogramme,
# am Wochenende nur ein Schaltprogramm
#################################################################
define Heizperiode_1 DOIF ([dum_Heizperiode] eq "Winter") \
   (define AN_1_BadezimmerOben DOIF ([05:30|8] or [08:00|7]) (set hzg_BZ_oben  desired-temp 22) DOELSEIF ([07:00|8] or [22:00|7]) (set hzg_BZ_oben  desired-temp 17)) \
   DOELSEIF (define AN_1_WINTER_BadezimmerOben ([dum_Heizperiode] eq "Sommer") (set hzg_BZ_oben desired-temp 9))
define Heizperiode_2 DOIF ([dum_Heizperiode] eq "Winter") \
   (define AN_2_BadezimmerOben DOIF ([13:00|8]) (set hzg_BZ_oben  desired-temp 22) DOELSEIF ([22:00|8]) (set hzg_BZ_oben  desired-temp 17)) \
   DOELSEIF (define AN_2_WINTER_BadezimmerOben ([dum_Heizperiode] eq "Sommer") (set hzg_BZ_oben desired-temp 9))
#

Das "define" hat im Bedingungsteil des DOIF nichts zu suchen.

moonsorrox

Zitat von: Ellert am 27 Oktober 2015, 22:44:29
Das "define" hat im Bedingungsteil des DOIF nichts zu suchen.
das habe ich gar nicht gesehen  ;) blind...! :-\
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM