Hallo, ich habe mal eine Beregnung gebastelt die in der Dauer einstellbar und in Abhängigkeit des Sonnenstandes schaltet. Da immer nur bestimmte Kreise gleichzeitig von der Pumpe bedient werden können, aktivieren sich diese zT nacheinander oder gleichzeitig. Jeder Kreis ist in die Automatik integrierbar oder auch nicht. Jeder Kreis ist einzeln an- und auszuschalten. Der Start- und Endmonat ist auswählbar. Die Beregnung spricht über Squeezebox mit mir. Kombiniert ist die Beregnung (die über eine Zisterne versorgt wird) mit einer Tiefenpumpe um den Nachschub zu sichern. Siehe https://forum.fhem.de/index.php/topic,69466.0.html (https://forum.fhem.de/index.php/topic,69466.0.html) (danke an Per)
Der Code ist meines Erachtens ausgesprochen häßlich (und laaaang .... aber funktioniert) und ich würde mich über eure Inputs freuen. Wie kann man die selbe (oder ausgeweitete Funktionalität) in schöner hinbekommen?
Schlecht gelöst ist im Moment auch noch das Verhindern des direkten Loslaufens der Automatik bei Aktivierung und nicht erst am nächsten Tag (BeregnungHystereseDOIF).
das kommt direkt aus der fhem.cfg:
######################################## BEREGNUNG ############################################
define myTwilight Twilight 42.xxxx 11.xxxx x yyyyyy
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#----------------------------------------------------------------#
define Beregnung_Zitronen dummy
attr Beregnung_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Zitronen group Beregnung
attr Beregnung_Zitronen room Beregnung
attr Beregnung_Zitronen webCmd auto:on:off
#attr Beregnung_Zitronen devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_Zitronen setList auto on off
define Beregnung_CampeggioOben dummy
attr Beregnung_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_CampeggioOben group Beregnung
attr Beregnung_CampeggioOben room Beregnung
attr Beregnung_CampeggioOben webCmd auto:on:off
#attr Beregnung_CampeggioOben devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_CampeggioOben setList auto on off
define Beregnung_CampeggioUnten dummy
attr Beregnung_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_CampeggioUnten group Beregnung
attr Beregnung_CampeggioUnten room Beregnung
attr Beregnung_CampeggioUnten webCmd auto:on:off
#attr Beregnung_CampeggioUnten devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_CampeggioUnten setList auto on off
define Beregnung_Blauregen dummy
attr Beregnung_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Blauregen group Beregnung
attr Beregnung_Blauregen room Beregnung
attr Beregnung_Blauregen webCmd auto:on:off
#attr Beregnung_Blauregen devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_Blauregen setList auto on off
define Beregnung_HinterKueche dummy
attr Beregnung_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_HinterKueche group Beregnung
attr Beregnung_HinterKueche room Beregnung
attr Beregnung_HinterKueche webCmd auto:on:off
#attr Beregnung_HinterKueche devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_HinterKueche setList auto on off
define Beregnung_Waschhaus dummy
attr Beregnung_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Waschhaus group Beregnung
attr Beregnung_Waschhaus room Beregnung
attr Beregnung_Waschhaus webCmd auto:on:off
#attr Beregnung_Waschhaus devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_Waschhaus setList auto on off
define Beregnung_Startmonat dummy
attr Beregnung_Startmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr Beregnung_Startmonat group Beregnung
attr Beregnung_Startmonat room Beregnung
attr Beregnung_Startmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr Beregnung_Startmonat sortby 5
attr Beregnung_Startmonat webCmd state
define Beregnung_Endmonat dummy
attr Beregnung_Endmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr Beregnung_Endmonat group Beregnung
attr Beregnung_Endmonat room Beregnung
attr Beregnung_Endmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr Beregnung_Endmonat sortby 6
attr Beregnung_Endmonat webCmd state
define Beregnung_Standarddauer dummy
attr Beregnung_Standarddauer group Beregnung
attr Beregnung_Standarddauer room Beregnung
attr Beregnung_Standarddauer setList state:slider,1,1,60
attr Beregnung_Standarddauer sortby 4
attr Beregnung_Standarddauer webCmd state
define Beregnung_Startelevation dummy
attr Beregnung_Startelevation group Beregnung
attr Beregnung_Startelevation room Beregnung
attr Beregnung_Startelevation setList state:slider,1,1,30
attr Beregnung_Startelevation sortby 3
attr Beregnung_Startelevation webCmd state
#-----------------------------------------------------------------------#
define Beregnung_Durchlauf_AN_AUS_AUTO dummy
attr Beregnung_Durchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Durchlauf_AN_AUS_AUTO group Beregnung
attr Beregnung_Durchlauf_AN_AUS_AUTO room Beregnung
attr Beregnung_Durchlauf_AN_AUS_AUTO sortby 2
attr Beregnung_Durchlauf_AN_AUS_AUTO webCmd auto:on:off
define BeregnungNachSonneDOIF DOIF ([myTwilight:elevation] > [Beregnung_Startelevation] and ($month >= [Beregnung_Startmonat] and $month <= [Beregnung_Endmonat])) (set Beregnung_TRIGGER_Ablauf on)
attr BeregnungNachSonneDOIF group Beregnung
attr BeregnungNachSonneDOIF room Beregnung
define BeregnungHystereseDOIF DOIF ([Beregnung_Durchlauf_AN_AUS_AUTO] eq "on") (set Beregnung_TRIGGER_Ablauf on,set BeregnungNachSonneDOIF disable) \
DOELSEIF ([Beregnung_Durchlauf_AN_AUS_AUTO] eq "off") (set Beregnung_TRIGGER_Ablauf off,set BeregnungNachSonneDOIF disable) \
DOELSEIF ([01:00] and [Beregnung_Durchlauf_AN_AUS_AUTO] eq "auto")(set BeregnungNachSonneDOIF initialize)
attr BeregnungHystereseDOIF do always
attr BeregnungHystereseDOIF group Beregnung
attr BeregnungHystereseDOIF room Beregnung
#---------------------------------------------------------------------#
define Beregnung_TRIGGER_Ablauf dummy
attr Beregnung_TRIGGER_Ablauf group Beregnung
define Beregnung_TRIGGER_Blauregen dummy
attr Beregnung_TRIGGER_Blauregen group Beregnung
define Beregnung_TRIGGER_HinterKueche dummy
attr Beregnung_TRIGGER_HinterKueche group Beregnung
define Beregnung_TRIGGER_CampeggioOben dummy
attr Beregnung_TRIGGER_CampeggioOben group Beregnung
define Beregnung_TRIGGER_Waschhaus dummy
attr Beregnung_TRIGGER_Waschhaus group Beregnung
define Beregnung_TRIGGER_CampeggioUnten dummy
attr Beregnung_TRIGGER_CampeggioUnten group Beregnung
#-----------------------------------------------------------------------#
define BeregnungZitronenDOIF DOIF ([Beregnung_TRIGGER_Ablauf] eq "on" and [?Beregnung_Zitronen] eq "auto") (set BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on, set Beregnung_TRIGGER_Blauregen on,set Beregnung_TRIGGER_CampeggioUnten on,set SqueezeBoxPlayer.* talk Beregnung Zitronen gestartet) (set BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "on" and [?Beregnung_Zitronen] eq "off") (set Beregnung_TRIGGER_Blauregen on) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off") (set BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off) \
DOELSEIF ([Beregnung_Zitronen] eq "on") (set BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on,set SqueezeBoxPlayer.* talk Beregnung Zitronen gestartet) \
DOELSEIF ([Beregnung_Zitronen] eq "off") (set BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off)
attr BeregnungZitronenDOIF do always
attr BeregnungZitronenDOIF group Beregnung
attr BeregnungZitronenDOIF wait 0,[Beregnung_Standarddauer:state]*60:0:0:0:0
define BeregnungCampeggioUntenDOIF DOIF ([Beregnung_TRIGGER_CampeggioUnten] eq "on" and [?Beregnung_CampeggioUnten] eq "auto") (set BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on,set SqueezeBoxPlayer.* talk Beregnung Campingplatz Unten gestartet) (set BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off) \
DOELSEIF ([Beregnung_TRIGGER_CampeggioUnten] eq "on" and [?Beregnung_CampeggioUnten] eq "off") (set SqueezeBoxPlayer.* talk test) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off") (set BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off) \
DOELSEIF ([Beregnung_CampeggioUnten] eq "on") (set BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on,set SqueezeBoxPlayer.* talk Beregnung Campingplatz Unten gestartet) \
DOELSEIF ([Beregnung_CampeggioUnten] eq "off") (set BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off)
attr BeregnungCampeggioUntenDOIF do always
attr BeregnungCampeggioUntenDOIF group Beregnung
attr BeregnungCampeggioUntenDOIF wait 0,[Beregnung_Standarddauer:state]*60:0:0:0:0
define BeregnungBlauregenDOIF DOIF ([Beregnung_TRIGGER_Blauregen] eq "on" and [?Beregnung_Blauregen] eq "auto") (set BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 on,set SqueezeBoxPlayer.* talk Beregnung Blauregen gestartet) (set BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off,set Beregnung_TRIGGER_HinterKueche on) \
DOELSEIF ([Beregnung_TRIGGER_Blauregen] eq "on" and [?Beregnung_Blauregen] eq "off") (set Beregnung_TRIGGER_HinterKueche on) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off") (set BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off) \
DOELSEIF ([Beregnung_Blauregen] eq "on") (set BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 on,set SqueezeBoxPlayer.* talk Beregnung Blauregen gestartet) \
DOELSEIF ([Beregnung_Blauregen] eq "off") (set BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off)
attr BeregnungBlauregenDOIF do always
attr BeregnungBlauregenDOIF group Beregnung
attr BeregnungBlauregenDOIF wait 0,[Beregnung_Standarddauer:state]*60:0:0:0:0
define BeregnungHinterKuecheDOIF DOIF ([Beregnung_TRIGGER_HinterKueche] eq "on" and [?Beregnung_HinterKueche] eq "auto") (set BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 on,set SqueezeBoxPlayer.* talk Beregnung Kueche gestartet) (set BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 off,set Beregnung_TRIGGER_CampeggioOben on) \
DOELSEIF ([Beregnung_TRIGGER_HinterKueche] eq "on" and [?Beregnung_HinterKueche] eq "off") (set Beregnung_TRIGGER_CampeggioOben on) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off") (set BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 off) \
DOELSEIF ([Beregnung_HinterKueche] eq "on") (set BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 on,set SqueezeBoxPlayer.* talk Beregnung Kueche gestartet) \
DOELSEIF ([Beregnung_HinterKueche] eq "off") (set BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 off)
attr BeregnungHinterKuecheDOIF do always
attr BeregnungHinterKuecheDOIF group Beregnung
attr BeregnungHinterKuecheDOIF wait 0,[Beregnung_Standarddauer:state]*60:0:0:0:0
define BeregnungCampeggioObenDOIF DOIF ([Beregnung_TRIGGER_CampeggioOben] eq "on" and [?Beregnung_CampeggioOben] eq "auto") (set BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 on,set SqueezeBoxPlayer.* talk Beregnung Campingplatz Oben gestartet) (set BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 off,set Beregnung_TRIGGER_Waschhaus on) \
DOELSEIF ([Beregnung_TRIGGER_CampeggioOben] eq "on" and [?Beregnung_CampeggioOben] eq "off") (set Beregnung_TRIGGER_Waschhaus on) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off") (set BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 off) \
DOELSEIF ([Beregnung_CampeggioOben] eq "on") (set BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 on,set SqueezeBoxPlayer.* talk Beregnung Campingplatz Oben gestartet) \
DOELSEIF ([Beregnung_CampeggioOben] eq "off") (set BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 off)
attr BeregnungCampeggioObenDOIF do always
attr BeregnungCampeggioObenDOIF group Beregnung
attr BeregnungCampeggioObenDOIF wait 0,[Beregnung_Standarddauer:state]*60:0:0:0:0
define BeregnungWaschhausDOIF DOIF ([Beregnung_TRIGGER_Waschhaus] eq "on" and [?Beregnung_Waschhaus] eq "auto") (set BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 on,set SqueezeBoxPlayer.* talk Beregnung Waschhaus gestartet) (set BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 off,set SqueezeBoxPlayer.* talk Beregnung beendet) \
DOELSEIF ([Beregnung_TRIGGER_Waschhaus] eq "on" and [?Beregnung_Waschhaus] eq "off") (set SqueezeBoxPlayer.* talk Beregnung beendet) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off") (set BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 off) \
DOELSEIF ([Beregnung_Waschhaus] eq "on") (set BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 on,set SqueezeBoxPlayer.* talk Beregnung Waschhaus gestartet) \
DOELSEIF ([Beregnung_Waschhaus] eq "off") (set BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 off)
attr BeregnungWaschhausDOIF do always
attr BeregnungWaschhausDOIF group Beregnung
attr BeregnungWaschhausDOIF wait 0,[Beregnung_Standarddauer:state]*60:0:0:0:0
#---------------------------------------------------------------------------#
define FileLog_Beregnung FileLog ./log/Beregnung-%Y-%m.log BEREGNUNG.*:(on|off)|PozzoHauptOben_PUMPE_Pozzo:(on|off)
attr FileLog_Beregnung group Beregnung
attr FileLog_Beregnung logtype text
define SVG_FileLog_Beregnung_1 SVG FileLog_Beregnung:SVG_FileLog_Beregnung_1:CURRENT
attr SVG_FileLog_Beregnung_1 group Beregnung
attr SVG_FileLog_Beregnung_1 room Beregnung
attr SVG_FileLog_Beregnung_1 sortby 1
########################################################################
########################### Neue Beregnung #################################
########################################################################
Das ist jetzt der Erguss aus diesem Thread. Der Code entstammt primär Pers Hirn und Fingern und ich habe als Ideengeber und Tester fungiert. ;) ... nochmal Danke dafür, Per!
Die Funktionalität entspricht der ursprünglichen, plus einer Zisternenpumpe die sich bei Beginn der Automatik anschaltet (nur wenn sie vorher aus war) und nach Beendigung der Beregnung wieder ausschaltet. Zusätzlich wird noch eine Brunnenpumpe entsprechend der Laufzeit der Beregnung aktiviert. Insgesamt soll diese 30 Minuten am Tag laufen und da in meinem Falle Solarstrom Mittags am meisten vorhanden ist, die fehlende Zeit dann substituieren.
Weiterhin schaltet die Brunnenpumpe bei sonstigem übermäßigen Strombezug ab und macht weiter (bis 30 min) wenn der Strombedarf wieder gesunken ist.
Ach so, und jetzt kann man Beregner per Dropdown in Kreisen kombinieren (zeitgleich laufen lassen) und dadurch auch die Reihenfolge der einzelnen Beregner frei wählen.
Habt Spaß. Ich hoffe es ist ausreichend kommentiert, dass man sich zurechtfindet. (Sowohl die Ansagen, das Filelog, der Plot, als auch die Pumpen können einfach bei Nichtbedarf eliminiert werden, der Rest sollte trotzdem funktionieren)
H.
PS: viele recht verschwurbelt und komplex anmutende Bedingungen in den DOIF´s resultieren aus den von Homematic generierten Zwischenstands-Events beim Schalten und der dadurch nötigen Eingrenzung der zu triggernden Events. Das ist aber kein Nachteil, egal welche Schalter ihr für eure Ventile habt .... liest sich nur anstrengender.
######################################## BEREGNUNG ############################################
define myTwilight Twilight 43.5976 12.8648 0 712129
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#--------------------------- FAKE DUMMIES ---------------------------------#
define BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 dummy
attr BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 room Beregnung
attr BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 webCmd on:off
define BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 dummy
attr BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 room Beregnung
attr BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 webCmd on:off
define BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 dummy
attr BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 room Beregnung
attr BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 webCmd on:off
define BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 dummy
attr BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 room Beregnung
attr BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 webCmd on:off
define BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 dummy
attr BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 room Beregnung
attr BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 webCmd on:off
define BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 dummy
attr BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 room Beregnung
attr BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 webCmd on:off
define PozzoHauptOben_PUMPE_Cisterna dummy
attr PozzoHauptOben_PUMPE_Cisterna room Beregnung
attr PozzoHauptOben_PUMPE_Cisterna webCmd on:off
define PozzoHauptOben_PUMPE_Pozzo dummy
attr PozzoHauptOben_PUMPE_Pozzo room Beregnung
attr PozzoHauptOben_PUMPE_Pozzo webCmd on:off
define Xtender_AC_out dummy
attr Xtender_AC_out room Beregnung
attr Xtender_AC_out setList state:slider,0,200,2400
attr Xtender_AC_out webCmd state
#------------------------ Beregner Dummys ---------------------------#
define Beregner_01_Zitronen dummy
attr Beregner_01_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_01_Zitronen group Beregnung
attr Beregner_01_Zitronen readingList talktext,switch,Kreis
attr Beregner_01_Zitronen room Beregnung
attr Beregner_01_Zitronen setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_01_Zitronen webCmd Kreis:auto:on:off
#set Beregner_01_Zitronen talktext Beregnung Zitronen
#set Beregner_01_Zitronen switch BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
define Beregner_02_CampeggioUnten dummy
attr Beregner_02_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_02_CampeggioUnten group Beregnung
attr Beregner_02_CampeggioUnten readingList talktext,switch,Kreis
attr Beregner_02_CampeggioUnten room Beregnung
attr Beregner_02_CampeggioUnten setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_02_CampeggioUnten webCmd Kreis:auto:on:off
#set Beregner_02_CampeggioUnten talktext Beregnung Camping unten
#set Beregner_02_CampeggioUnten switch BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_03_Blauregen dummy
attr Beregner_03_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_03_Blauregen group Beregnung
attr Beregner_03_Blauregen readingList talktext,switch,Kreis
attr Beregner_03_Blauregen room Beregnung
attr Beregner_03_Blauregen setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_03_Blauregen webCmd Kreis:auto:on:off
#set Beregner_03_Blauregen talktext Beregnung Blauregen
#set Beregner_03_Blauregen switch BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
define Beregner_04_HinterKueche dummy
attr Beregner_04_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_04_HinterKueche group Beregnung
attr Beregner_04_HinterKueche readingList talktext,switch,Kreis
attr Beregner_04_HinterKueche room Beregnung
attr Beregner_04_HinterKueche setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_04_HinterKueche webCmd Kreis:auto:on:off
#set Beregner_04_HinterKueche talktext Beregnung Hinter Kueche
#set Beregner_04_HinterKueche switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
define Beregner_05_CampeggioOben dummy
attr Beregner_05_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_05_CampeggioOben group Beregnung
attr Beregner_05_CampeggioOben readingList talktext,switch,Kreis
attr Beregner_05_CampeggioOben room Beregnung
attr Beregner_05_CampeggioOben setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_05_CampeggioOben webCmd Kreis:auto:on:off
#set Beregner_05_CampeggioOben talktext Beregnung Camping oben
#set Beregner_05_CampeggioOben switch BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13
define Beregner_06_Waschhaus dummy
attr Beregner_06_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_06_Waschhaus group Beregnung
attr Beregner_06_Waschhaus readingList talktext,switch,Kreis
attr Beregner_06_Waschhaus room Beregnung
attr Beregner_06_Waschhaus setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_06_Waschhaus webCmd Kreis:auto:on:off
#set Beregner_06_Waschhaus talktext Beregnung Waschhaus
#set Beregner_06_Waschhaus switch BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16
#------------------------ Beregnung Einstellung Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat group Beregnung
attr BeregnungStartmonat room Beregnung
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat group Beregnung
attr BeregnungEndmonat room Beregnung
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer group Beregnung
attr BeregnungStandarddauer room Beregnung
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation group Beregnung
attr BeregnungStartelevation room Beregnung
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO group Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO room Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnung Logik -----------------------------#
define BeregnungDOIF_NachSonne DOIF ([myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungDOIF_NachSonne group Beregnung
attr BeregnungDOIF_NachSonne room Beregnung
define BeregnungDummy_Helper dummy
attr BeregnungDummy_Helper group Beregnung
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
() \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off)
attr BeregnungDOIF_Mapping cmdState [$SELF]|[$SELF]|[$SELF]|60*[BeregnungStandarddauer]|[$SELF]|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_3) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_4) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_5) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_6) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_7) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set SqueezeBoxPlayer.* talk Automatik Beregnung beendet, IF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on") (set BeregnungDurchlauf_AN_AUS_AUTO off )) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
({foreach (AggrDoIf('@','^Beregner_')) {fhem("set BeregnungDummy_Helper $_")}}, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
#------------------------- Beregnung Pumpe Cisterna bei Bedarf on -----------------------------#
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] ne "4") \
(set $SELF manu off) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] ne "1") \
(set $SELF manu on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0") \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna devStateIcon disabled:general_aus@red:initialize initialize|initialized|cmd_2|cmd_4:general_an@yellow:disable cmd_1|cmd_3:general_an@green:disable
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna room Beregnung
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
#----------------------------- Pozzo Pumpe ------------------------------#
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([13:00-16:00] and [Xtender_AC_out] < 1200 and [?$SELF:Laufzeit] < 1800) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [Xtender_AC_out] < 1200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out] > 2100 and ([$SELF:cmd_seqnr] eq "1" or [$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])},set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF devStateIcon disabled:general_aus@red:initialize initialize|initialized|cmd_1|cmd_1_2|cmd_3|cmd_4|cmd_5:general_an@yellow:disable cmd_1_1|cmd_2:general_an@green:disable
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit
attr PozzoHauptOben_PUMPE_PozzoDOIF room Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,1800-[$SELF:Laufzeit]:0:10:0:0
#set PozzoHauptOben_PUMPE_PozzoDOIF Laufzeit 0
#------------------------- Beregnung Filelog und plot -----------------------------#
define FileLog_Beregnung FileLog ./log/Beregnung-%Y-%m.log BEREGNUNG_SCHALTER_.*:(on|off)|PozzoHauptOben_PUMPE_Pozzo:(on|off)|PozzoHauptOben_PUMPE_Cisterna:(on|off)
attr FileLog_Beregnung group Beregnung
attr FileLog_Beregnung logtype text
define SVG_FileLog_Beregnung_1 SVG FileLog_Beregnung:SVG_FileLog_Beregnung_1:CURRENT
attr SVG_FileLog_Beregnung_1 group Beregnung
attr SVG_FileLog_Beregnung_1 room Beregnung
attr SVG_FileLog_Beregnung_1 sortby 1
Erste Frage zur Vereinfachung: könnte man BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14, Beregnung_TRIGGER_Blauregen und Beregnung_TRIGGER_CampeggioUnten auch nacheinander schalten (evtl. mit geänderten Zeiten)?
Vorab ein kleiner Codeschnipsel zur kleinen Vereinfachung:
Dazu ein jeweils ins DOIF
define BeregnungHinterKuecheDOIF DOIF ([Beregnung_TRIGGER_HinterKueche] eq "on" and [?Beregnung_HinterKueche] eq "auto") (set [$SELF:switch] on,set SqueezeBoxPlayer.* talk [$SELF:talktext]) (set [$SELF:switch] off,set [$SELF:next] on) \
DOELSEIF ([Beregnung_TRIGGER_HinterKueche] eq "on" and [?Beregnung_HinterKueche] eq "off") (set [$SELF:next] on) \
DOELSEIF ([Beregnung_HinterKueche] eq "on") (set [$SELF:switch] on,set SqueezeBoxPlayer.* talk [$SELF:talktext]) \
DOELSEIF ([Beregnung_TRIGGER_Ablauf] eq "off" or [Beregnung_HinterKueche] eq "off") (set [$SELF:switch] off)
attr BeregnungHinterKuecheDOIF userReadings talktext, switch, next
set BeregnungHinterKuecheDOIF talktext Beregnung Kueche gestartet
set BeregnungHinterKuecheDOIF switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
set BeregnungHinterKuecheDOIF next Beregnung_TRIGGER_CampeggioOben
Ne Idee gehabt, deshalb nicht einschlafen können, also gleich aufgeschrieben:
Pro Beregner ein DOIF, ich habe sie mal mit _A bis _F bezeichnet, kannst aber deine Bezeichnungen beibehalten.
define Beregner_DOIF_F DOIF (0)
DOELSEIF (0) ({Beregner_Auswahl F on})
DOELSEIF (0) ({Beregner_Auswahl F off})
attr Beregner_DOIF_F userReadings talktext, switch
attr Beregner_DOIF_F cmdState auto|on|off
attr Beregner_DOIF_F devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_DOIF_F group Beregnung
attr Beregner_DOIF_F room Beregnung
set Beregner_DOIF_F talktext Beregnung Kueche gestartet
set Beregner_DOIF_F switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
Diese DOIF werden direkt im Frontend angezeigt und geschaltet.
Dazu die "Automatik", welche täglich um 8 Uhr startet:
define BeregnerTrigger DOIF ([08:00]) (
IF ([Beregner_DOIF_A] != "auto" and [Beregner_DOIF_B] != "auto" and [Beregner_DOIF_F] != "auto")(set $SELF cmd_2),
IF ([Beregner_DOIF_A] == "auto") ({Beregner_Auswahl A on}),
IF ([Beregner_DOIF_B] == "auto") ({Beregner_Auswahl B on}),
IF ([Beregner_DOIF_F] == "auto") ({Beregner_Auswahl F on})
)(
IF ([Beregner_DOIF_A] == "auto") ({Beregner_Auswahl A off}),
IF ([Beregner_DOIF_B] == "auto") ({Beregner_Auswahl B off}),
IF ([Beregner_F_DOIF] == "auto") ({Beregner_Auswahl F off}),
set $SELF cmd_2
)
DOELSEIF (0) (
IF ([Beregner_DOIF_B] != "auto") (set $SELF cmd_3),{Beregner_Auswahl B on}
)(
IF ([Beregner_DOIF_F] == "auto") ({Beregner_Auswahl B off}),
set $SELF cmd_3
)
DOELSEIF (0) (
IF ([Beregner_DOIF_C] != "auto") (set $SELF cmd_4), {Beregner_Auswahl C on}
)(
IF ([Beregner_DOIF_C] == "auto") ({Beregner_Auswahl C off}),
set $SELF cmd_4
)
... usw...
attr BeregnerTrigger wait 0,[Beregnung_Standarddauer:state]*60:0,[Beregnung_Standarddauer:state]*60:0,[Beregnung_Standarddauer:state]*60:0,[Beregnung_Standarddauer:state]*60....
dazu ein Mini-Script in die 99_myUtils
sub Beregner_Auswahl ($$)
{
my ($myDev,$myEvent);
fhem ("set " . readingsVal("Beregner_DOIF_".$myDev,"switch","") ." ". $myEvent);
if ($MyEvent eq "on")
{fhem ("set SqueezeBoxPlayer.* talk " . readingsVal("Beregner_DOIF_".$myDev,"talktext",""));
}
Das lässt sich bestimmt auch mittels DOIF abbilden, dafür ist es mir aber jetzt eindeutig zu spät.
Und wie immer gilt: Syntax nochmal prüfen, alles nur Theorie!
Und: einen Fehler (?) in BeregnungZitronenDOIF habe ich von dir übernommen: je nachdem, welche Regner auf Automatik stehen, gibt es für Blauregen und CampeggioUnten doppelte Zeiten oder einfache.
Noch eine Idee wären at mit automatisch erzeugten Namen statt der wait-Attribute, diese müssten halt beim manuellen Ausschalten gelöscht werden. Ist halt ein anderer Weg.
Sch... war die Nacht kurz.
Also die ersten DOIF können natürlich Dummies bleiben. Ist zwar etwas aufwendiger, die Befehle zu mappen, aber auch kein Teufelswerk.
Oder man lässt das mappen und macht ein DOIF dafür:
define Beregner_Mapping DOIF (["Beregner_DOIF_:on"]) (set [$DEVICE:switch] on,set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
DOELSEIF (["Beregner_DOIF_:off"]) (set [$DEVICE:switch] off)
und weil wir gerade dabei sind, ergänzen wir das DOIF "etwas":
DOELSEIF (["Beregner_Dummy"])
(IF ([Beregner_DOIF_[$EVENT] eq "auto"])
(IF ([BeregnerTrigger] eq "on")
(set [$EVENT:switch] on,
set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
ELSE
(set $EVENT:switch] off)
)
)
Die IF kann man bestimmt mit in den DOELSE-Bedingungen unterbringen, aber ich kann wie gesagt nicht wirklich testen.
Und können damit a: das Scriptchen in 99_myUtils weglassen und b: den BeregnerTrigger vereinfachen:
define BeregnerTrigger DOIF (["Beregnung_Durchlauf_AN_AUS_AUTO:on"] or
[BeregnungNachSonneDOIF] eq "cmd_1")
(IF ([Beregner_DOIF_A] != "auto" and [Beregner_DOIF_B] != "auto" and [Beregner_DOIF_F] != "auto")(set $SELF cmd_2))
(set Beregner_Dummy Beregner_DOIF_A,set Beregner_Dummy Beregner_DOIF_B,set Beregner_Dummy Beregner_DOIF_F)
(set Beregner_Dummy Beregner_DOIF_A,set Beregner_Dummy Beregner_DOIF_B,set Beregner_Dummy Beregner_DOIF_F,set $SELF cmd_2)
DOELSEIF (0)
(IF ([Beregner_DOIF_B] != "auto") (set $SELF cmd_3))
(set Beregner_Dummy Beregner_DOIF_B)
(set Beregner_Dummy Beregner_DOIF_B,set $SELF cmd_3)
DOELSEIF (0)
(IF ([Beregner_DOIF_C] != "auto") (set $SELF cmd_4))
(set Beregner_Dummy Beregner_DOIF_C)
(set Beregner_Dummy Beregner_DOIF_C,set $SELF cmd_4)
)
... usw...
DOELSEIF ([Beregnung_Durchlauf_AN_AUS_AUTO] eq "off")
()
(set Beregner_Dummy Beregner_DOIF_A,set Beregner_Dummy Beregner_DOIF_B,set Beregner_Dummy Beregner_DOIF_C,...)
attr BeregnerTrigger wait 0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60....:0,0
Dazu kommen aber folgende Zeilen:
attr BeregnerTrigger cmdState on,off,off|on,off,off|on,off,off|...|off,off
und
define Beregner_Dummy Dummy
Ob ich das mit dem Sonnenstand jetzt richtig verstanden habe, weiss ich aber nicht. Evtl. könnte man das alte BeregnungNachSonneDOIF beibehalten und nur um einen ELSE-Zweig ergängen. Dann meldet es sich nur, wenn die Werte unter-/überschritten oder passend geändert werden und nicht alle x min.
define BeregnungNachSonneDOIF DOIF ([?Beregnung_Durchlauf_AN_AUS_AUTO] eq "auto" and [?myTwilight:elevation] > [Beregnung_Startelevation] and ($month >= [?Beregnung_Startmonat] and $month <= [?Beregnung_Endmonat]))
DOELSE
Da kann man auch noch mit den Fragezeichen etwas spielen. Wenn du nur einmal am Tag "Nach Sonne" starten willst, könntest du noch ein Dummy/Userreading mit dem letztem Laufdatum vorsehen. Die Initialisierung nach einer Änderung fest auf 1 Uhr zu stellen, halte ich zwar für machbar, aber kontraproduktiv.
Uiuiui Per, da muß ich mir heute Abend mal ein bißchen Zeit nehmen deinen Wahnsinn zu verstehen. Schonmal Danke fürs denken!
bis gleich
H.
Zitat von: holle75 am 04 April 2017, 11:52:39Schonmal Danke fürs denken!
Und ich hoffe, dass ich diese Nacht den Kopf wieder frei zum Schlafen habe ;D ;D ;D
Hallo Per, entschuldige die Verzögerung, aber meine Solaranlage hat mir die letzten zwei Tage einige Herausforderungen gestellt :(
Aaaaalso, ich sitz jetzt seit ner Stunde vor deinen Beiträgen und versuche zu verstehen was du dir da ausgedacht hast. Ich erfasse nicht, was aus welchem Beitrag wie zusammengehört ?!
Und wenn ich mir das nicht "einmal in Ganz" in einen Editor packe kann ich deine Gedankengänge nicht nachvollziehen. Was nicht automatisch heißt, dass ich ich es dann auch wirklich kann ;)
Könntest du mir vielleicht nochmal deine "finale Version" aus den Beiträgen zusammenkopieren?
sorry und Grüße
H.
######################################## BEREGNUNG ############################################
define myTwilight Twilight 42.xxxx 11.xxxx x yyyyyy
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#----------------------------------------------------------------#
define Beregnung_Zitronen dummy
attr Beregnung_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Zitronen group Beregnung
attr Beregnung_Zitronen room Beregnung
attr Beregnung_Zitronen webCmd auto:on:off
#attr Beregnung_Zitronen devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_Zitronen setList auto on off
define Beregnung_CampeggioOben dummy
attr Beregnung_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_CampeggioOben group Beregnung
attr Beregnung_CampeggioOben room Beregnung
attr Beregnung_CampeggioOben webCmd auto:on:off
#attr Beregnung_CampeggioOben devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_CampeggioOben setList auto on off
define Beregnung_CampeggioUnten dummy
attr Beregnung_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_CampeggioUnten group Beregnung
attr Beregnung_CampeggioUnten room Beregnung
attr Beregnung_CampeggioUnten webCmd auto:on:off
#attr Beregnung_CampeggioUnten devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_CampeggioUnten setList auto on off
define Beregnung_Blauregen dummy
attr Beregnung_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Blauregen group Beregnung
attr Beregnung_Blauregen room Beregnung
attr Beregnung_Blauregen webCmd auto:on:off
#attr Beregnung_Blauregen devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_Blauregen setList auto on off
define Beregnung_HinterKueche dummy
attr Beregnung_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_HinterKueche group Beregnung
attr Beregnung_HinterKueche room Beregnung
attr Beregnung_HinterKueche webCmd auto:on:off
#attr Beregnung_HinterKueche devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_HinterKueche setList auto on off
define Beregnung_Waschhaus dummy
attr Beregnung_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Waschhaus group Beregnung
attr Beregnung_Waschhaus room Beregnung
attr Beregnung_Waschhaus webCmd auto:on:off
#attr Beregnung_Waschhaus devStateIcon on:rc_GREEN:off off:rc_RED:auto auto:rc_BLUE:on
#attr Beregnung_Waschhaus setList auto on off
define Beregnung_Startmonat dummy
attr Beregnung_Startmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr Beregnung_Startmonat group Beregnung
attr Beregnung_Startmonat room Beregnung
attr Beregnung_Startmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr Beregnung_Startmonat sortby 5
attr Beregnung_Startmonat webCmd state
define Beregnung_Endmonat dummy
attr Beregnung_Endmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr Beregnung_Endmonat group Beregnung
attr Beregnung_Endmonat room Beregnung
attr Beregnung_Endmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr Beregnung_Endmonat sortby 6
attr Beregnung_Endmonat webCmd state
define Beregnung_Standarddauer dummy
attr Beregnung_Standarddauer group Beregnung
attr Beregnung_Standarddauer room Beregnung
attr Beregnung_Standarddauer setList state:slider,1,1,60
attr Beregnung_Standarddauer sortby 4
attr Beregnung_Standarddauer webCmd state
define Beregnung_Startelevation dummy
attr Beregnung_Startelevation group Beregnung
attr Beregnung_Startelevation room Beregnung
attr Beregnung_Startelevation setList state:slider,1,1,30
attr Beregnung_Startelevation sortby 3
attr Beregnung_Startelevation webCmd state
#-----------------------------------------------------------------------#
define Beregnung_Durchlauf_AN_AUS_AUTO dummy
attr Beregnung_Durchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Durchlauf_AN_AUS_AUTO group Beregnung
attr Beregnung_Durchlauf_AN_AUS_AUTO room Beregnung
attr Beregnung_Durchlauf_AN_AUS_AUTO sortby 2
attr Beregnung_Durchlauf_AN_AUS_AUTO webCmd auto:on:off
#---------------------------------------------------------------------------#
define FileLog_Beregnung FileLog ./log/Beregnung-%Y-%m.log BEREGNUNG.*:(on|off)|PozzoHauptOben_PUMPE_Pozzo:(on|off)
attr FileLog_Beregnung group Beregnung
attr FileLog_Beregnung logtype text
define SVG_FileLog_Beregnung_1 SVG FileLog_Beregnung:SVG_FileLog_Beregnung_1:CURRENT
attr SVG_FileLog_Beregnung_1 group Beregnung
attr SVG_FileLog_Beregnung_1 room Beregnung
attr SVG_FileLog_Beregnung_1 sortby 1
define Beregner_Mapping DOIF (["Beregner_DOIF_:on"]) (set [$DEVICE:switch] on,set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
DOELSEIF (["Beregner_DOIF_:off"]) (set [$DEVICE:switch] off)
DOELSEIF (["Beregner_Dummy"])
(IF ([Beregner_DOIF_[$EVENT] eq "auto"])
(IF ([BeregnerTrigger] eq "on")
(set [$EVENT:switch] on,
set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
ELSE
(set $EVENT:switch] off)
)
)
define BeregnerTrigger DOIF (["Beregnung_Durchlauf_AN_AUS_AUTO:on"] or
[BeregnungNachSonneDOIF] eq "cmd_1")
(IF ([Beregnung_Zitronen] != "auto" and [Beregnung_CampeggioOben] != "auto" and [Beregner_DOIF_F] != "auto")(set $SELF cmd_2))
(set Beregner_Dummy Beregnung_Zitronen,set Beregner_Dummy Beregnung_CampeggioOben,set Beregner_Dummy Beregnung_Waschhaus)
(set Beregner_Dummy Beregnung_Zitronen,set Beregner_Dummy Beregnung_CampeggioOben,set Beregner_Dummy Beregnung_Waschhaus,set $SELF cmd_2)
DOELSEIF (0)
(IF ([Beregnung_CampeggioOben] != "auto") (set $SELF cmd_3))
(set Beregner_Dummy Beregnung_CampeggioOben)
(set Beregner_Dummy Beregnung_CampeggioOben,set $SELF cmd_3)
DOELSEIF (0)
(IF ([Beregner_DOIF_C] != "auto") (set $SELF cmd_4))
(set Beregner_Dummy Beregnung_CampeggioUnten)
(set Beregner_Dummy Beregnung_CampeggioUnten,set $SELF cmd_4)
)
... usw...
DOELSEIF ([Beregnung_Durchlauf_AN_AUS_AUTO] eq "off")
()
(set Beregner_Dummy Beregnung_Zitronen,set Beregner_Dummy Beregnung_CampeggioOben,set Beregner_Dummy Beregnung_CampeggioUnten,...)
attr BeregnerTrigger wait 0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60....:0,0
attr BeregnerTrigger cmdState on,off,off|on,off,off|on,off,off|...|off,off
define Beregner_Dummy Dummy
define BeregnungNachSonneDOIF DOIF ([?Beregnung_Durchlauf_AN_AUS_AUTO] eq "auto" and [?myTwilight:elevation] > [Beregnung_Startelevation] and ($month >= [?Beregnung_Startmonat] and $month <= [?Beregnung_Endmonat]))
DOELSE
attr BeregnungNachSonneDOIF group Beregnung
attr BeregnungNachSonneDOIF room Beregnung
So, hoffentlich ist mir beim Kopieren kein Fehler unterlaufen...
Danke Per. Ich denk mich da jetzt mal ein "paar Stunden" rein.
... Mein lieber Scholli ....
erstmal Danke nochmals für deine Mühen!
Ich muß das erstmal auseinanderklabüstern:
Wenn die Kopierung so passt, hat sich ja vom Vorbau (die ganzen Dummys mit der Möglichkeit auto,on,off zu wählen, plus Startelevation, Standardzeit) erstmal nichts geändert.
define Beregnung_Zitronen dummy
attr Beregnung_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Zitronen group Beregnung
attr Beregnung_Zitronen room Beregnung
attr Beregnung_Zitronen webCmd auto:on:off
define Beregnung_CampeggioOben dummy
attr Beregnung_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_CampeggioOben group Beregnung
attr Beregnung_CampeggioOben room Beregnung
attr Beregnung_CampeggioOben webCmd auto:on:off
define Beregnung_CampeggioUnten dummy
attr Beregnung_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_CampeggioUnten group Beregnung
attr Beregnung_CampeggioUnten room Beregnung
attr Beregnung_CampeggioUnten webCmd auto:on:off
define Beregnung_Blauregen dummy
attr Beregnung_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Blauregen group Beregnung
attr Beregnung_Blauregen room Beregnung
attr Beregnung_Blauregen webCmd auto:on:off
define Beregnung_HinterKueche dummy
attr Beregnung_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_HinterKueche group Beregnung
attr Beregnung_HinterKueche room Beregnung
attr Beregnung_HinterKueche webCmd auto:on:off
define Beregnung_Waschhaus dummy
attr Beregnung_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Waschhaus group Beregnung
attr Beregnung_Waschhaus room Beregnung
attr Beregnung_Waschhaus webCmd auto:on:off
define Beregnung_Startmonat dummy
attr Beregnung_Startmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr Beregnung_Startmonat group Beregnung
attr Beregnung_Startmonat room Beregnung
attr Beregnung_Startmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr Beregnung_Startmonat sortby 5
attr Beregnung_Startmonat webCmd state
define Beregnung_Endmonat dummy
attr Beregnung_Endmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr Beregnung_Endmonat group Beregnung
attr Beregnung_Endmonat room Beregnung
attr Beregnung_Endmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr Beregnung_Endmonat sortby 6
attr Beregnung_Endmonat webCmd state
define Beregnung_Standarddauer dummy
attr Beregnung_Standarddauer group Beregnung
attr Beregnung_Standarddauer room Beregnung
attr Beregnung_Standarddauer setList state:slider,1,1,60
attr Beregnung_Standarddauer sortby 4
attr Beregnung_Standarddauer webCmd state
define Beregnung_Startelevation dummy
attr Beregnung_Startelevation group Beregnung
attr Beregnung_Startelevation room Beregnung
attr Beregnung_Startelevation setList state:slider,1,1,30
attr Beregnung_Startelevation sortby 3
attr Beregnung_Startelevation webCmd state
#-----------------------------------------------------------------------#
define Beregnung_Durchlauf_AN_AUS_AUTO dummy
attr Beregnung_Durchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_Durchlauf_AN_AUS_AUTO group Beregnung
attr Beregnung_Durchlauf_AN_AUS_AUTO room Beregnung
attr Beregnung_Durchlauf_AN_AUS_AUTO sortby 2
attr Beregnung_Durchlauf_AN_AUS_AUTO webCmd auto:on:off
"Nur" die Automatik. Also dieser Teil
define Beregner_Mapping DOIF (["Beregner_DOIF_:on"]) (set [$DEVICE:switch] on,set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
DOELSEIF (["Beregner_DOIF_:off"]) (set [$DEVICE:switch] off)
DOELSEIF (["Beregner_Dummy"])
(IF ([Beregner_DOIF_[$EVENT] eq "auto"])
(IF ([BeregnerTrigger] eq "on")
(set [$EVENT:switch] on,
set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
ELSE
(set $EVENT:switch] off)
)
)
define BeregnerTrigger DOIF (["Beregnung_Durchlauf_AN_AUS_AUTO:on"] or [BeregnungNachSonneDOIF] eq "cmd_1")
(IF ([Beregnung_Zitronen] != "auto" and [Beregnung_CampeggioOben] != "auto" and [Beregner_DOIF_F] != "auto")(set $SELF cmd_2))
(set Beregner_Dummy Beregnung_Zitronen,set Beregner_Dummy Beregnung_CampeggioOben,set Beregner_Dummy Beregnung_Waschhaus)
(set Beregner_Dummy Beregnung_Zitronen,set Beregner_Dummy Beregnung_CampeggioOben,set Beregner_Dummy Beregnung_Waschhaus,set $SELF cmd_2)
DOELSEIF (0)
(IF ([Beregnung_CampeggioOben] != "auto") (set $SELF cmd_3))
(set Beregner_Dummy Beregnung_CampeggioOben)
(set Beregner_Dummy Beregnung_CampeggioOben,set $SELF cmd_3)
DOELSEIF (0)
(IF ([Beregner_DOIF_C] != "auto") (set $SELF cmd_4))
(set Beregner_Dummy Beregnung_CampeggioUnten)
(set Beregner_Dummy Beregnung_CampeggioUnten,set $SELF cmd_4)
)
... usw...
DOELSEIF ([Beregnung_Durchlauf_AN_AUS_AUTO] eq "off")
()
(set Beregner_Dummy Beregnung_Zitronen,set Beregner_Dummy Beregnung_CampeggioOben,set Beregner_Dummy Beregnung_CampeggioUnten,...)
attr BeregnerTrigger wait 0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60:0,0,[Beregnung_Standarddauer:state]*60....:0,0
attr BeregnerTrigger cmdState on,off,off|on,off,off|on,off,off|...|off,off
define Beregner_Dummy Dummy
define BeregnungNachSonneDOIF DOIF ([?Beregnung_Durchlauf_AN_AUS_AUTO] eq "auto" and [?myTwilight:elevation] > [Beregnung_Startelevation] and ($month >= [?Beregnung_Startmonat] and $month <= [?Beregnung_Endmonat]))
DOELSE
attr BeregnungNachSonneDOIF group Beregnung
attr BeregnungNachSonneDOIF room Beregnung
... um mich langsam ranzutasten:
define Beregner_Mapping DOIF (["Beregner_DOIF_:on"]) (set [$DEVICE:switch] on,set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
DOELSEIF (["Beregner_DOIF_:off"]) (set [$DEVICE:switch] off)
DOELSEIF (["Beregner_Dummy"])
(IF ([Beregner_DOIF_[$EVENT] eq "auto"])
(IF ([BeregnerTrigger] eq "on")
(set [$EVENT:switch] on,
set SqueezeBoxPlayer.* talk [$DEVICE:talktext])
ELSE
(set $EVENT:switch] off)
)
)
["Beregner_DOIF_:on"] muss, wenn ich meine alten Bezeichnungen beibehalten möchte (Beregnung_Zitronen, Beregnung_Blauregen, etc.) ["Beregnung_:on"] heißen, richtig?
talktext und switch müßte zu den entsprechenden dummys eigentlich dazu, richtig? zB
define Beregnung_HinterKueche dummy
attr Beregnung_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregnung_HinterKueche group Beregnung
attr Beregnung_HinterKueche room Beregnung
attr Beregnung_HinterKueche userReadings talktext, switch
attr Beregnung_HinterKueche webCmd auto:on:off
set Beregnung_HinterKueche talktext Beregnung Kueche gestartet
set Beregnung_HinterKueche switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
falls das stimmt, kann ich weiterdenken ;) .... wenn nicht, führen deine Gedankenergüsse für mich zweifelsfrei zu weit :D
Zitat von: holle75 am 09 April 2017, 20:45:36richtig?
ja
Zitat von: holle75 am 09 April 2017, 20:45:36richtig?
ja
Durch das mehrfache Hinundherkopieren und die fortgeschrittene Stunde gab es doch einige "Altlasten".
Hallo Per, ich habs jetzt mal "ins Reine" geschrieben.
Wenn das so von dir gemeint war ..... kann ich weiterdenken. Denn noch blick ich nur die Hälfte und es macht keine Freude falls der Code einfach falsch ist. Da denkts sich lange ....
könntest du nochmal drüberschauen, bitte ?
######################################## BEREGNUNG ############################################
define myTwilight Twilight xxxxx yyyyy
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#------------------------ Beregner Dummys ---------------------------#
define Beregner_Zitronen dummy
attr Beregner_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_Zitronen group Beregnung
attr Beregner_Zitronen room Beregnung
attr Beregner_Zitronen webCmd auto:on:off
attr Beregner_Zitronen userReadings talktext, switch
set Beregner_Zitronen talktext Beregnung Zitronen
set Beregner_Zitronen switch BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
define Beregner_CampeggioOben dummy
attr Beregner_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_CampeggioOben group Beregnung
attr Beregner_CampeggioOben room Beregnung
attr Beregner_CampeggioOben webCmd auto:on:off
attr Beregner_CampeggioOben userReadings talktext, switch
set Beregner_CampeggioOben talktext Beregnung Camping oben
set Beregner_CampeggioOben switch BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13
define Beregner_CampeggioUnten dummy
attr Beregner_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_CampeggioUnten group Beregnung
attr Beregner_CampeggioUnten room Beregnung
attr Beregner_CampeggioUnten webCmd auto:on:off
attr Beregner_CampeggioUnten userReadings talktext, switch
set Beregner_CampeggioUnten talktext Beregnung Camping unten
set Beregner_CampeggioUnten switch BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_Blauregen dummy
attr Beregner_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_Blauregen group Beregnung
attr Beregner_Blauregen room Beregnung
attr Beregner_Blauregen webCmd auto:on:off
attr Beregner_Blauregen userReadings talktext, switch
set Beregner_Blauregen talktext Beregnung Blauregen
set Beregner_Blauregen switch BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
define Beregner_HinterKueche dummy
attr Beregner_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_HinterKueche group Beregnung
attr Beregner_HinterKueche room Beregnung
attr Beregner_HinterKueche webCmd auto:on:off
attr Beregner_HinterKueche userReadings talktext, switch
set Beregner_HinterKueche talktext Beregnung Hinter Kueche
set Beregner_HinterKueche switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
define Beregner_Waschhaus dummy
attr Beregner_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_Waschhaus group Beregnung
attr Beregner_Waschhaus room Beregnung
attr Beregner_Waschhaus webCmd auto:on:off
attr Beregner_Waschhaus userReadings talktext, switch
set Beregner_Waschhaus talktext Beregnung Waschhaus
set Beregner_Waschhaus switch BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16
#------------------------ Einstellungs Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat group Beregnung
attr BeregnungStartmonat room Beregnung
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat group Beregnung
attr BeregnungEndmonat room Beregnung
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer group Beregnung
attr BeregnungStandarddauer room Beregnung
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation group Beregnung
attr BeregnungStartelevation room Beregnung
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungHelperDummy dummy
attr BeregnungHelperDummy group Beregnung
attr BeregnungHelperDummy room Beregnung
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO group Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO room Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnungs Logik -----------------------------#
define BeregnungNachSonneDOIF DOIF ([?Wetter_wunderground:statRegenDayMax] < 1.0 and [myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungNachSonneDOIF group Beregnung
attr BeregnungNachSonneDOIF room Beregnung
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([Beregner_[$EVENT] eq "auto"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
) \
)
define BeregnungTriggerDOIF DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or [BeregnungNachSonneDOIF] eq "cmd_1") \
(IF ([Beregner_Zitronen] != "auto") (set $SELF cmd_2)) (set BeregnungHelperDummy Beregner_Zitronen) (set BeregnungHelperDummy Beregner_Zitronen, set $SELF cmd_2) \
DOELSEIF (0) \
(IF ([Beregner_CampeggioUnten] != "auto") (set $SELF cmd_3)) (set BeregnungHelperDummy Beregner_CampeggioUnten) (set BeregnungHelperDummy Beregner_CampeggioUnten, set $SELF cmd_3) \
DOELSEIF (0) \
(IF ([Beregner_Blauregen] != "auto") (set $SELF cmd_4)) (set BeregnungHelperDummy Beregner_Blauregen) (set BeregnungHelperDummy Beregner_Blauregen, set $SELF cmd_4) \
DOELSEIF (0) \
(IF ([Beregner_HinterKueche] != "auto") (set $SELF cmd_5)) (set BeregnungHelperDummy Beregner_HinterKueche) (set BeregnungHelperDummy Beregner_HinterKueche, set $SELF cmd_5) \
DOELSEIF (0) \
(IF ([Beregner_CampeggioOben] != "auto") (set $SELF cmd_6)) (set BeregnungHelperDummy Beregner_CampeggioOben) (set BeregnungHelperDummy Beregner_CampeggioOben, set $SELF cmd_6) \
DOELSEIF (0) \
(IF ([Beregner_Waschhaus] != "auto") (set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)) (set BeregnungHelperDummy Beregner_Waschhaus) (set BeregnungHelperDummy Beregner_Waschhaus, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
() (set BeregnungHelperDummy Beregner_Zitronen, set BeregnungHelperDummy Beregner_CampeggioUnten, set BeregnungHelperDummy Beregner_Blauregen, set BeregnungHelperDummy Beregner_HinterKueche, set BeregnungHelperDummy Beregner_CampeggioOben, set BeregnungHelperDummy Beregner_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)
attr BeregnungTriggerDOIF wait \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0
attr BeregnungTriggerDOIF cmdState \
on,off,off| \
on,off,off| \
on,off,off| \
on,off,off| \
on,off,off| \
on,off,off| \
off,off
Passt so, wobei ich jetzt nicht auf Syntax, Klammern usw. geachtet habe.
Zitat von: holle75 am 11 April 2017, 21:06:57Denn noch blick ich nur die Hälfte und es macht keine Freude falls der Code einfach falsch ist. Da denkts sich lange ....
Wo klemmts denn? Ich kann ja auch den Erklärbär (oder Erklär-Per :D) machen.
@Erklär-Per ;)
nur ganz kurz ....
In der BeregnungMappingDOIF ...
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([Beregner_[$EVENT] eq "auto"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
) \
)
.... macht mir das Verständnis wo das jeweilige on/off herkommt
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
Probleme, weil das BeregnungTriggerDOIF ....
(IF ([Beregner_Zitronen] != "auto") (set $SELF cmd_2)) (set BeregnungHelperDummy Beregner_Zitronen) (set BeregnungHelperDummy Beregner_Zitronen, set $SELF cmd_2) \
ja nirgendwo on/off hat.
Und die Verschachtelung Beregner_/BeregnungTriggerDOIF macht mich noch wuschig.
Also diese Schleife:
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([Beregner_[$EVENT] eq "auto"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
) \
)
wobei auch $EVENT und $DEVICE für mich im DOIF ein bißchen neu sind.... und auch in der commandref zwar für mich die Ahnung von Verstehen da ist, aber im Detail ....
Danke Per
Zitat von: holle75 am 12 April 2017, 10:19:41
In der BeregnungMappingDOIF ...
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([Beregner_[$EVENT] eq "auto"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
) \
)
.... macht mir das Verständnis wo das jeweilige on/off herkommt
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
Probleme, weil das BeregnungTriggerDOIF ....
(IF ([Beregner_Zitronen] != "auto") (set $SELF cmd_2)) (set BeregnungHelperDummy Beregner_Zitronen) (set BeregnungHelperDummy Beregner_Zitronen, set $SELF cmd_2) \
ja nirgendwo on/off hat.
Das kommt aus den extra dafür gesetzten Status (
attr cmdState)
Zitat von: holle75 am 12 April 2017, 10:19:41
Und die Verschachtelung Beregner_/BeregnungTriggerDOIF macht mich noch wuschig.
Also diese Schleife:
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([Beregner_[$EVENT] eq "auto"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
) \
)
Dient nur dazu, innerhalb der DOIF-Zweige nicht jedesmal das gleiche mit anderem Namen zu schreiben. Also sowas wie ein Sub. $EVENT und $DEVICE sind die Parameter, wobei ich glaube, dass hier ein Fehler drin ist. Statt
[$DEVICE:talktext] muss
[$EVENT:talktext], weil $DEVICE hier immer "BeregnungHelperDummy" wäre. Im oberen Zweig passt das aber so.
Zitat von: holle75 am 12 April 2017, 10:19:41
wobei auch $EVENT und $DEVICE für mich im DOIF ein bißchen neu sind.... und auch in der commandref zwar für mich die Ahnung von Verstehen da ist, aber im Detail ....
Das musst du dir leider selbst erarbeiten. Ist aber, zumindest bei den Variablen, nicht schwer.
Moinsen Per, hatte mal wieder ein Stündchen.
....
#------------------------- Beregnungs Logik -----------------------------#
define BeregnungNachSonneDOIF DOIF ([?Wetter_wunderground:statRegenDayMax] < 1.0 and [myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungNachSonneDOIF group Beregnung
attr BeregnungNachSonneDOIF room Beregnung
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$EVENT:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$EVENT:talktext] beendet) \
)
define BeregnungTriggerDOIF DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungNachSonneDOIF] eq "cmd_1")) \
(IF ([Beregner_Zitronen] != "auto") (set $SELF cmd_2)) (set BeregnungHelperDummy Beregner_Zitronen) (set BeregnungHelperDummy Beregner_Zitronen, set $SELF cmd_2) \
DOELSEIF (0) \
(IF ([Beregner_CampeggioUnten] != "auto") (set $SELF cmd_3)) (set BeregnungHelperDummy Beregner_CampeggioUnten) (set BeregnungHelperDummy Beregner_CampeggioUnten, set $SELF cmd_3) \
DOELSEIF (0) \
(IF ([Beregner_Blauregen] != "auto") (set $SELF cmd_4)) (set BeregnungHelperDummy Beregner_Blauregen) (set BeregnungHelperDummy Beregner_Blauregen, set $SELF cmd_4) \
DOELSEIF (0) \
(IF ([Beregner_HinterKueche] != "auto") (set $SELF cmd_5)) (set BeregnungHelperDummy Beregner_HinterKueche) (set BeregnungHelperDummy Beregner_HinterKueche, set $SELF cmd_5) \
DOELSEIF (0) \
(IF ([Beregner_CampeggioOben] != "auto") (set $SELF cmd_6)) (set BeregnungHelperDummy Beregner_CampeggioOben) (set BeregnungHelperDummy Beregner_CampeggioOben, set $SELF cmd_6) \
DOELSEIF (0) \
(IF ([Beregner_Waschhaus] != "auto") (set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)) (set BeregnungHelperDummy Beregner_Waschhaus) (set BeregnungHelperDummy Beregner_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BeregnungHelperDummy Beregner_Zitronen, set BeregnungHelperDummy Beregner_CampeggioUnten, set BeregnungHelperDummy Beregner_Blauregen, set BeregnungHelperDummy Beregner_HinterKueche, set BeregnungHelperDummy Beregner_CampeggioOben, set BeregnungHelperDummy Beregner_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)
attr BeregnungTriggerDOIF wait \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0
attr BeregnungTriggerDOIF cmdState \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
end,on,off| \
off
"BeregnungMappingDOIF" die IF Überprüfung auf "auto" rausgenommen, da das schon in "BeregnungTriggerDOIF" gemacht wird.
in "attr BeregnungTriggerDOIF cmdState" rumgespielt. Ich hoffe, ich habe das Prinzip jetzt richtig verstanden?
Noch eine Frage: In der alten Version hatte ich ja eine Neustart-Sicherung für "BeregnungNachSonneDOIF" eingebaut. Behält sich DOIF nach einem Neustart seinen cmd-status? Ansonsten würde, falls "BeregnungDurchlauf_AN_AUS_AUTO" auf "auto" steht, "BeregnungNachSonneDOIF" dann "BeregnungTriggerDOIF" auslösen.
mhm, schwierig zu erklären.
... und "BeregnungTriggerDOIF" die Auslösung umgebaut. Vorher hat das die Idee von "BeregnungDurchlauf_AN_AUS_AUTO" nicht logisch umgesetzt. Diesen Dummy möchte ich irgendwann auf Auto setzen damit, erst am nächsten Tag, der ganze Kremsel dann entsprechend "BeregnungNachSonneDOIF" losläuft. Aber eben nicht nach Neustart oder beim nächsten Trigger.
Zitat von: holle75 am 15 April 2017, 22:29:41"BeregnungMappingDOIF" die IF Überprüfung auf "auto" rausgenommen, da das schon in "BeregnungTriggerDOIF" gemacht wird.
Beim ok, aber falls zwischendurch der Status in "on" geändert wird, wird es dann ausgeschaltet.
Zitat von: holle75 am 15 April 2017, 22:29:41Behält sich DOIF nach einem Neustart seinen cmd-status?
Ja, inzwischen schon.
mmh, habs vor allem rausgeschmissen, weil ich es nicht ganz verstehe.
(IF ([Beregner_[$EVENT] eq "auto"]) \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$EVENT:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$EVENT:talktext] beendet) \
) \
)
müßte es nicht
(IF ([$EVENT] eq "auto") \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$EVENT:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$EVENT:talktext] beendet) \
) \
)
heißen? Sonst wärs doch "Beregner_Beregner_Zitronen"? ..... und was wird ausgeschaltet wenn was auf "on" geht? Kompliziert.
Zitat von: holle75 am 16 April 2017, 00:27:06müßte es nicht
Ja, muss es. Ich bin erstaunt, wieviele C&P-Fehler man früh um 3 machen kann :D
Zitat von: holle75 am 16 April 2017, 00:27:06..... und was wird ausgeschaltet wenn was auf "on" geht?
Ausgeschaltet wird was, wenn das aufrufende DOIF auf off geht. An nur bei on.
Der Trick ist, dass das "BeregnungMappingDOIF" den Status "on" hat, das "BeregnungTriggerDOIF" aufruft, dort dieser Status abgefragt wird und nach Ablauf der Zeit das Ganze mit "off" wiederholt wird.
Zitat von: holle75 am 16 April 2017, 00:27:06Kompliziert.
;D
Zitat von: Per am 16 April 2017, 10:46:55
Ja, muss es. Ich bin erstaunt, wieviele C&P-Fehler man früh um 3 machen kann :D
es soll dir vergeben sein :)
Zitat von: Per am 16 April 2017, 10:46:55
Der Trick ist, dass das "BeregnungMappingDOIF" den Status "on" hat, das "BeregnungTriggerDOIF" aufruft, dort dieser Status abgefragt wird und nach Ablauf der Zeit das Ganze mit "off" wiederholt wird.
Jo, aber weil du meintest, dass
Zitat von: Per am 15 April 2017, 23:44:41
Beim ok, aber falls zwischendurch der Status in "on" geändert wird, wird es dann ausgeschaltet.
wenn man was auf on stellt wird was ausgeschaltet? Das kann ich noch nicht nachvollziehen. Oder anders gesagt, was könnte sich zwischendurch auf "on" ändern? Immer noch kompliziert ;) ... Vollschlauch. Oder ich habs immer noch nicht verstanden, wer was triggert
attr BeregnungTriggerDOIF cmdState \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
end,on,off| \
off
Das macht Sinn? weil anders als im "Original"
Guten (späten) Morgen!
Zitat von: holle75 am 16 April 2017, 11:23:49Jo, aber weil du meintest, dass
wenn man was auf on stellt wird was ausgeschaltet? Das kann ich noch nicht nachvollziehen. Oder anders gesagt, was könnte sich zwischendurch auf "on" ändern?
Achso, das bezog sich auf die Dummys:
attr Beregnung_Zitronen webCmd auto:on:off
Zitat von: holle75 am 16 April 2017, 11:23:49
attr BeregnungTriggerDOIF cmdState \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
end,on,off| \
off
Das macht Sinn? weil anders als im "Original"
Probiers aus. Wichtig ist nur, dass zum Zeitpunkt der Ausführung des "BeregnungTriggerDOIF" die richtigen Status vorliegen. Falls nicht, entweder cmdState vom "Mapping" oder IF vom "Trigger" anpassen.
Zitat von: Per am 16 April 2017, 11:58:28
Achso, das bezog sich auf die Dummys:
attr Beregnung_Zitronen webCmd auto:on:off
Ah ok ....
Zitat von: Per am 16 April 2017, 11:58:28
Probiers aus.
Jo, werd ich. Wenn verstanden und ich all die Mechanik die da dran hängt dann nur noch 20x und nicht 200x malträtieren muß :D
Kannst ja Dummys ansteuern. Die kosten nix, falls mal eins kaputt geht ;D
das war ein schöner :D
Also jetzt mal
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([$EVENT] eq "auto") \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$EVENT:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$EVENT:talktext] beendet) \
) \
)
ausprobiert. Da wird nichts an oder ausgeschaltet.
Wenn ich manuell einen Beregner starte, sagt mir der Player "gestartet" ohne Variable.
und den Fehler
DOIF BeregnungMappingDOIF error: set on: Please define on first
da fehlt der $DEVICE oder $EVENT
Scheint fhem hat die selben Verständnisprobleme wie ich :D .... woher kommt $DEVICE und $EVENT
wenn ich BeregnungDurchlauf_AN_AUS_AUTO auf "on" stelle bekomme ich das als events:
2017-04-16 13:50:45 dummy Beregner_CampeggioOben auto
2017-04-16 13:50:46 dummy Beregner_CampeggioUnten auto
2017-04-16 13:50:48 dummy Beregner_HinterKueche auto
2017-04-16 13:50:49 dummy Beregner_Waschhaus auto
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd_nr: 1
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd_seqnr: 1
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd: 1.1
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd_event: BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF skip
2017-04-16 13:50:53 dummy BeregnungHelperDummy Beregner_Zitronen
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd_nr: 1
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd_seqnr: 2
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd: 1.2
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF cmd_event: BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF on
2017-04-16 13:50:53 DOIF BeregnungTriggerDOIF wait_timer: 16.04.2017 13:55:53 cmd_1_3 BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 13:50:53 dummy BeregnungDurchlauf_AN_AUS_AUTO on
bei "off":
2017-04-16 13:51:57 DOIF BeregnungTriggerDOIF wait_timer: no timer
2017-04-16 13:51:58 dummy BeregnungHelperDummy Beregner_Zitronen
2017-04-16 13:51:58 dummy BeregnungHelperDummy Beregner_CampeggioUnten
2017-04-16 13:51:58 dummy BeregnungHelperDummy Beregner_Blauregen
2017-04-16 13:51:58 dummy BeregnungHelperDummy Beregner_HinterKueche
2017-04-16 13:51:58 dummy BeregnungHelperDummy Beregner_CampeggioOben
2017-04-16 13:51:58 dummy BeregnungHelperDummy Beregner_Waschhaus
2017-04-16 13:51:58 SB_PLAYER SqueezeBoxPlayer_Raspi_2 talk Durchlauf Beregnung beendet
2017-04-16 13:51:58 SB_PLAYER SqueezeBoxPlayer_ZirkusOben talk Durchlauf Beregnung beendet
2017-04-16 13:51:58 DOIF BeregnungTriggerDOIF cmd_nr: 7
2017-04-16 13:51:58 DOIF BeregnungTriggerDOIF cmd: 7
2017-04-16 13:51:58 DOIF BeregnungTriggerDOIF cmd_event: BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 13:51:58 DOIF BeregnungTriggerDOIF off
2017-04-16 13:51:58 dummy BeregnungDurchlauf_AN_AUS_AUTO off
2017-04-16 13:51:58 SB_PLAYER SqueezeBoxPlayer_NUC currentTitle: http://api.voicerss.org/?&src=Durchlauf+Beregnung+beendet.&hl=de-de&f=48khz_16bit_stereo
vom Gefühl scheint da schon einiges zu funktionieren ... außer dieser verflixten $DEVICE und $EVENT Geschichte. Wie gesagt Kompliziert :D
Zitat von: holle75 am 16 April 2017, 13:58:18außer dieser verflixten $DEVICE und $EVENT Geschichte.
Lass mal die eckigen Klammern drum rum weg!
Ich habs mit und ohne Klammern probiert.
ohne
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set $DEVICE:switch on, set SqueezeBoxPlayer.* talk $DEVICE:talktext gestartet) \
DOELSEIF (["Beregner_:off"]) (set $DEVICE:switch off, set SqueezeBoxPlayer.* talk $DEVICE:talktext beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ($EVENT eq "auto") \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set $EVENT:switch on, set SqueezeBoxPlayer.* talk $EVENT:talktext gestartet) \
ELSE \
(set $EVENT:switch off, set SqueezeBoxPlayer.* talk $EVENT:talktext beendet) \
) \
)
hängts mir fhem nach ein paar Minuten auf.
On/off funktioniert für die Beregner direkt (das lag übrigens an falschen Attr bei den Dummies - shame on me), aber unzuverlässig. Sprich mal ja, mal nicht (seltsam)
und (sehr) häufig sowas im fhem-log
2017.04.16 18:19:53 1: PERL WARNING: Use of uninitialized value in numeric gt (>) at (eval 342) line 1.
2017.04.16 18:20:06 1: PERL WARNING: Use of uninitialized value in numeric gt (>) at (eval 350) line 1.
2017.04.16 18:20:07 1: PERL WARNING: Use of uninitialized value in numeric gt (>) at (eval 359) line 1.
2017.04.16 18:20:21 1: PERL WARNING: Use of uninitialized value in numeric gt (>) at (eval 371) line 1.
BeregnungDurchlauf_AN_AUS_AUTO auf "on" verursacht das im Event-Monitor
2017-04-16 18:36:29 dummy Beregner_Blauregen off
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd_nr: 1
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd_seqnr: 1
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd: 1.1
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd_event: BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF skip
2017-04-16 18:40:03 dummy BeregnungHelperDummy Beregner_Zitronen
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd_nr: 1
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd_seqnr: 2
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd: 1.2
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF cmd_event: BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF on
2017-04-16 18:40:03 DOIF BeregnungTriggerDOIF wait_timer: 16.04.2017 18:44:03 cmd_1_3 BeregnungDurchlauf_AN_AUS_AUTO
2017-04-16 18:40:03 dummy BeregnungDurchlauf_AN_AUS_AUTO on
schaltet aber keinen Beregner an.
DOIF.pm ist aktuell
fhem ist 5.7
daran sollte es nicht liegen?
Mmh, weiß jetzt gerade nicht wo ich ansetzen soll.
######################################## BEREGNUNG ############################################
define myTwilight Twilight
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#------------------------ Beregner Dummys ---------------------------#
define Beregner_Zitronen dummy
attr Beregner_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_Zitronen group Beregnung
attr Beregner_Zitronen room Beregnung
attr Beregner_Zitronen webCmd auto:on:off
attr Beregner_Zitronen readingList talktext,switch
set Beregner_Zitronen talktext Beregnung Zitronen
set Beregner_Zitronen switch BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
define Beregner_CampeggioOben dummy
attr Beregner_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_CampeggioOben group Beregnung
attr Beregner_CampeggioOben room Beregnung
attr Beregner_CampeggioOben webCmd auto:on:off
attr Beregner_CampeggioOben readingList talktext,switch
set Beregner_CampeggioOben talktext Beregnung Camping oben
set Beregner_CampeggioOben switch BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13
define Beregner_CampeggioUnten dummy
attr Beregner_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_CampeggioUnten group Beregnung
attr Beregner_CampeggioUnten room Beregnung
attr Beregner_CampeggioUnten webCmd auto:on:off
attr Beregner_CampeggioUnten readingList talktext,switch
set Beregner_CampeggioUnten talktext Beregnung Camping unten
set Beregner_CampeggioUnten switch BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_Blauregen dummy
attr Beregner_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_Blauregen group Beregnung
attr Beregner_Blauregen room Beregnung
attr Beregner_Blauregen webCmd auto:on:off
attr Beregner_Blauregen readingList talktext,switch
set Beregner_Blauregen talktext Beregnung Blauregen
set Beregner_Blauregen switch BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
define Beregner_HinterKueche dummy
attr Beregner_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_HinterKueche group Beregnung
attr Beregner_HinterKueche room Beregnung
attr Beregner_HinterKueche webCmd auto:on:off
attr Beregner_HinterKueche readingList talktext,switch
set Beregner_HinterKueche talktext Beregnung Hinter Kueche
set Beregner_HinterKueche switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
define Beregner_Waschhaus dummy
attr Beregner_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_Waschhaus group Beregnung
attr Beregner_Waschhaus room Beregnung
attr Beregner_Waschhaus webCmd auto:on:off
attr Beregner_Waschhaus readingList talktext,switch
set Beregner_Waschhaus talktext Beregnung Waschhaus
set Beregner_Waschhaus switch BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16
#------------------------ Einstellungs Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat group Beregnung
attr BeregnungStartmonat room Beregnung
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat group Beregnung
attr BeregnungEndmonat room Beregnung
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer group Beregnung
attr BeregnungStandarddauer room Beregnung
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation group Beregnung
attr BeregnungStartelevation room Beregnung
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungHelperDummy dummy
attr BeregnungHelperDummy group Beregnung
attr BeregnungHelperDummy room Beregnung
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO group Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO room Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnungs Logik -----------------------------#
define BeregnungNachSonneDOIF DOIF ([?Wetter_wunderground:statRegenDayMax] < 1.0 and [myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungNachSonneDOIF group Beregnung
attr BeregnungNachSonneDOIF room Beregnung
define BeregnungMappingDOIF DOIF (["Beregner_:on"]) (set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:off"]) (set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["BeregnungHelperDummy"]) \
(IF ([$EVENT] eq "auto") \
(IF ([BeregnungTriggerDOIF] eq "on") \
(set [$EVENT:switch] on, set SqueezeBoxPlayer.* talk [$EVENT:talktext] gestartet) \
ELSE \
(set [$EVENT:switch] off, set SqueezeBoxPlayer.* talk [$EVENT:talktext] beendet) \
) \
)
attr BeregnungMappingDOIF group Beregnung
attr BeregnungMappingDOIF room Beregnung
define BeregnungTriggerDOIF DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungNachSonneDOIF] eq "cmd_1")) \
(IF ([Beregner_Zitronen] != "auto") (set $SELF cmd_2)) (set BeregnungHelperDummy Beregner_Zitronen) (set BeregnungHelperDummy Beregner_Zitronen, set $SELF cmd_2) \
DOELSEIF (0) \
(IF ([Beregner_CampeggioUnten] != "auto") (set $SELF cmd_3)) (set BeregnungHelperDummy Beregner_CampeggioUnten) (set BeregnungHelperDummy Beregner_CampeggioUnten, set $SELF cmd_3) \
DOELSEIF (0) \
(IF ([Beregner_Blauregen] != "auto") (set $SELF cmd_4)) (set BeregnungHelperDummy Beregner_Blauregen) (set BeregnungHelperDummy Beregner_Blauregen, set $SELF cmd_4) \
DOELSEIF (0) \
(IF ([Beregner_HinterKueche] != "auto") (set $SELF cmd_5)) (set BeregnungHelperDummy Beregner_HinterKueche) (set BeregnungHelperDummy Beregner_HinterKueche, set $SELF cmd_5) \
DOELSEIF (0) \
(IF ([Beregner_CampeggioOben] != "auto") (set $SELF cmd_6)) (set BeregnungHelperDummy Beregner_CampeggioOben) (set BeregnungHelperDummy Beregner_CampeggioOben, set $SELF cmd_6) \
DOELSEIF (0) \
(IF ([Beregner_Waschhaus] != "auto") (set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)) (set BeregnungHelperDummy Beregner_Waschhaus) (set BeregnungHelperDummy Beregner_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BeregnungHelperDummy Beregner_Zitronen, set BeregnungHelperDummy Beregner_CampeggioUnten, set BeregnungHelperDummy Beregner_Blauregen, set BeregnungHelperDummy Beregner_HinterKueche, set BeregnungHelperDummy Beregner_CampeggioOben, set BeregnungHelperDummy Beregner_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)
attr BeregnungTriggerDOIF wait \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0,0,[BeregnungStandarddauer:state]*60: \
0
attr BeregnungTriggerDOIF cmdState \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
skip,on,off| \
end,on,off| \
off
attr BeregnungTriggerDOIF group Beregnung
attr BeregnungTriggerDOIF room Beregnung
Habe es mal mit Dummies zum Laufen gebracht, mache morgen mal nen Diff (sonst schleichen sich wieder viele Fehler rein ;)).
Nur die
IF([xxx] ne "auto")(set $SELF cmd_x)
tuns nicht, teste ich gerade noch.
Habe aufs Diff verzichtet, habe es doch zu sehr umgeschrieben:
######################################## BEREGNUNG ############################################
define myTwilight Twilight
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#------------------------ Beregner Dummys ---------------------------#
define BEREGNUNG_SCHALTER_01_Zitronen_12_7_MEQ0064131_14 dummy
define BEREGNUNG_SCHALTER_05_CampeggioOben_12_7_MEQ0064131_13 dummy
define BEREGNUNG_SCHALTER_02_CampeggioUnten_12_7_MEQ0064131_18 dummy
define BEREGNUNG_SCHALTER_03_Blauregen_12_7_MEQ0064131_17 dummy
define BEREGNUNG_SCHALTER_04_HinterKueche_12_7_MEQ0064131_15 dummy
define BEREGNUNG_SCHALTER_06_Waschhaus_12_7_MEQ0064131_16 dummy
define Beregner_01_Zitronen dummy
attr Beregner_01_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_01_Zitronen webCmd auto:on:off
attr Beregner_01_Zitronen readingList talktext,switch
set Beregner_01_Zitronen talktext Beregnung Zitronen
set Beregner_01_Zitronen switch BEREGNUNG_SCHALTER_01_Zitronen_12_7_MEQ0064131_14
define Beregner_05_CampeggioOben dummy
attr Beregner_05_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_05_CampeggioOben webCmd auto:on:off
attr Beregner_05_CampeggioOben readingList talktext,switch
set Beregner_05_CampeggioOben talktext Beregnung Camping oben
set Beregner_05_CampeggioOben switch BEREGNUNG_SCHALTER_05_CampeggioOben_12_7_MEQ0064131_13
define Beregner_02_CampeggioUnten dummy
attr Beregner_02_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_02_CampeggioUnten webCmd auto:on:off
attr Beregner_02_CampeggioUnten readingList talktext,switch
set Beregner_02_CampeggioUnten talktext Beregnung Camping unten
set Beregner_02_CampeggioUnten switch BEREGNUNG_SCHALTER_02_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_03_Blauregen dummy
attr Beregner_03_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_03_Blauregen webCmd auto:on:off
attr Beregner_03_Blauregen readingList talktext,switch
set Beregner_03_Blauregen talktext Beregnung Blauregen
set Beregner_03_Blauregen switch BEREGNUNG_SCHALTER_03_Blauregen_12_7_MEQ0064131_17
define Beregner_04_HinterKueche dummy
attr Beregner_04_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_04_HinterKueche webCmd auto:on:off
attr Beregner_04_HinterKueche readingList talktext,switch
set Beregner_04_HinterKueche talktext Beregnung Hinter Kueche
set Beregner_04_HinterKueche switch BEREGNUNG_SCHALTER_04_HinterKueche_12_7_MEQ0064131_15
define Beregner_06_Waschhaus dummy
attr Beregner_06_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_06_Waschhaus webCmd auto:on:off
attr Beregner_06_Waschhaus readingList talktext,switch
set Beregner_06_Waschhaus talktext Beregnung Waschhaus
set Beregner_06_Waschhaus switch BEREGNUNG_SCHALTER_06_Waschhaus_12_7_MEQ0064131_16
#------------------------ Einstellungs Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungDummy_Helper dummy
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnungs Logik -----------------------------#
define BeregnungDOIF_NachSonne DOIF ([?Wetter_wunderground:statRegenDayMax] < 1.0 and [myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
define BeregnungDOIF_Mapping DOIF (["Beregner_:on"])
(set [$DEVICE:switch] on)
DOELSEIF (["Beregner_:off"])
(set [$DEVICE:switch] off)
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] == 2) \
(set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|6*[BeregnungStandarddauer]|0|0
defmod BeregnungDOIF_Trigger DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1"))
()
()
(set $SELF cmd_2)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_01_Zitronen)
(set BeregnungDummy_Helper Beregner_01_Zitronen)
(set $SELF cmd_3)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten)
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten)
(set $SELF cmd_4)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_03_Blauregen)
(set BeregnungDummy_Helper Beregner_03_Blauregen)
(set $SELF cmd_5)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_04_HinterKueche)
(set BeregnungDummy_Helper Beregner_04_HinterKueche)
(set $SELF cmd_6)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_05_CampeggioOben)
(set BeregnungDummy_Helper Beregner_05_CampeggioOben)
(set $SELF cmd_7)
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_06_Waschhaus)
(set BeregnungDummy_Helper Beregner_06_Waschhaus)
()
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off")
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus)
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
attr .*Beregnung.* group Beregnung
attr .*BEREGNUNG.* group Beregnung
attr .*Beregner.* group Beregnung
attr .*BEREGNUNG.* room Beregnung
attr .*Beregnung.* room Beregnung
attr .*Beregner.* room Beregnung
Die Sprachausgabe muss wieder rein, die habe ich komplett entfernt, da bei mir nicht vorhanden (ok, ich hätte nen Dummy draus machen können, beim nächsten Mal!).
Die Variablennamen habe ich auch gedreht, sieht im Browser besser aus. Ansonsten habe ich den Code vereinfacht, ich hoffe, du findest dich jetzt besser rein, obwohl manches etwas komisch aussieht (z.B. zwei leere Befehlsgruppen im ersten Zweig von BeregnungDOIF_Trigger), aber das ist dem Call-Konzept (https://forum.fhem.de/index.php/topic,66153.msg621599.html#msg621599) von set $SELF cmd_x geschuldet.
Hello Per, top .... bin ab morgen für 1-2 Wochen unterwegs. Danach werde ich deinen Code am lebenden Objekt probieren und mich natürlich melden.
Danke!
H.
ps. Hauptsache die IF Geschichte ist raus !!!!!!! :D
Hallo Per, gerade ein bißchen Zeit für Trockenübungen.
define BeregnungDOIF_Mapping DOIF (["Beregner_:on"]) \
(set [$DEVICE:switch] on) \
DOELSEIF (["Beregner_:off"]) \
(set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] == 2) \
(set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
müßte es nicht
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "1")
sein? Zum einen Sequenz 1 und eq und Anführungszeichen....... seqnr als numerischer Wert wirft bei mir Fehler im fhem-log (noch nicht probiert, aber in einem anderen DOIF). Bei dir nicht?
Warum 2? Müßte doch die erste Klammer von BeregnungDOIF_Trigger auf on gehen und die zweite auf off?
-------------------------------------------
defmod BeregnungDOIF_Trigger DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1"))
wieso defmod? gibts da was was noch nicht existiert?
------------------------------------------------------
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
und
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|60*[BeregnungStandarddauer]|0|0
erschließt sich mir auf den ersten Blick nicht :D .... also versteh ich das Zusammenspiel nicht.... resp. was ist der Vorteil in BeregnungDOIF_Trigger auf den cmdstate von BeregnungDOIF_Mapping zuzugreifen und nicht direkt anzugeben? Was würde cmdState [$self] ergeben?
Müßte hier dann nicht auch das 60*[BeregnungStandarddauer] an 4ter Stelle anstatt 3ter sein?
Kompliziert! ... was du dir da ausgedacht hast :)
Also mal ohne Zitate:
Die Sub sind Zahlen und durch Tests (nicht Überlegung ;)) ermittelt.
defmod kommt, weil ich den Code aus dem raw-Feld der GUI gezogen habe und mir der eine (oder sind es mehr?) durch die Lappen gegangen ist.
Um nicht jedes Mal [BeregnungStandarddauer]*60 eintragen zu müssen bzw. eigentlich noch ein "wenn auto, dann [BeregnungStandarddauer]*60, sonst 0" in das wait-Attribut eintragen zu müssen, habe ich das in die ohnehin vorhandene Abfrage mit reingebracht. Hatte auch den Vorteil, wenn man testet, schreibt man einfach statt der 60 nur 6 und muss nicht ewig warten.
Und an dritter Stelle past, ist ja das zweite DOELSEIF.
ok, werd ich auch mal mehr Ermitteln bevor ich versuche zu Überlegen :D ... hat nur gerade Lust auf Kopf bewegen.
Ist nur doof, wenn Ermitteltes beim Nachvollziehen wollen nicht mit dem Überlegten übereinstimmt ;)
Also ich schau dann in 1-2 Wochen.
Ach so, cmdState [$self] würd mich jetzt aber doch noch interessieren was man da bekommt?
Zitat von: holle75 am 19 April 2017, 15:50:37cmdState [$self] würd mich jetzt aber doch noch interessieren was man da bekommt?
Wahrscheinlich nur Unfug, muss
attr BeregnungDOIF_Mapping cmdState [$SELF]|[$SELF]|6*[BeregnungStandarddauer]|0|0
heißen und bedeutet nix weiter, als dass der Status beibehalten wird.
Ist aber nur sicherheitshalber, falls der unwahrscheinliche Fall eintritt, dass zwischen der Abfrage und der Ausführung jemand in der 100 Sekunde einen Regner manuell ein- oder ausschaltet.
Zitat von: Per am 19 April 2017, 16:13:02
und bedeutet nix weiter, als dass der Status beibehalten wird.
ho capito
Hallo Per, hab mir jetzt mal unterwegs ein Testsystem aufgebaut. Jungfräulich.
Wir haben ein Phänomen!
Durchlauf on off auto funktioniert ganz gut.
Beregner einzeln schalten on off (direkt nacheinander) funktioniert auch prima.
und jetzt kommts (und da wo man keinerei Probleme vermutet): Schalte mal einen Beregner auf on und dann noch einen Beregner auf on und dann den ersten auf off...... oder einfach mal queerbeet on und off. Da geht dann nichts mehr.
Im Event Monitor kommt der Event, aber BeregnungDOIF_Mapping ignoriert diesen einfach ?????!
Idee? Ich mein, was gibts bei
define BeregnungDOIF_Mapping DOIF (["Beregner_:on"]) \
(set [$DEVICE:switch] on) \
DOELSEIF (["Beregner_:off"]) \
(set [$DEVICE:switch] off) \
fehlzuinterpretieren ? :D ... "merkt" sich fhem den $DEVICE ??
neuester raspi
neuestes fhem
Komisch, bei mir gehts. Sogar im "Live-System". Mit und ohne gleichzeitiger Automatik. Aber halt mit Dummies. Mangels echten Beregnern.
1. BeregnungDOIF_Mapping mit do always versehen.
2. BeregnungDOIF_Mapping teilen.
Ersteres fehlte, zweiteres zum Testen.
noch phänomenaler, weil ich habs ja jetzt eins zu eins mit deinem Code im Testsystem auch ohne Hardware.
mmh, welche DOIF Version hast du?
Meine .... $Id: 98_DOIF.pm 14088 2017-04-23 17:59:06Z Damian $#
und nochmal der Code
define myTwilight Twilight
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#------------------------ Beregner Dummys ---------------------------#
define BEREGNUNG_SCHALTER_01_Zitronen_12_7_MEQ0064131_14 dummy
define BEREGNUNG_SCHALTER_05_CampeggioOben_12_7_MEQ0064131_13 dummy
define BEREGNUNG_SCHALTER_02_CampeggioUnten_12_7_MEQ0064131_18 dummy
define BEREGNUNG_SCHALTER_03_Blauregen_12_7_MEQ0064131_17 dummy
define BEREGNUNG_SCHALTER_04_HinterKueche_12_7_MEQ0064131_15 dummy
define BEREGNUNG_SCHALTER_06_Waschhaus_12_7_MEQ0064131_16 dummy
define Beregner_01_Zitronen dummy
attr Beregner_01_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_01_Zitronen webCmd auto:on:off
attr Beregner_01_Zitronen readingList talktext,switch
set Beregner_01_Zitronen talktext Beregnung Zitronen
set Beregner_01_Zitronen switch BEREGNUNG_SCHALTER_01_Zitronen_12_7_MEQ0064131_14
define Beregner_05_CampeggioOben dummy
attr Beregner_05_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_05_CampeggioOben webCmd auto:on:off
attr Beregner_05_CampeggioOben readingList talktext,switch
set Beregner_05_CampeggioOben talktext Beregnung Camping oben
set Beregner_05_CampeggioOben switch BEREGNUNG_SCHALTER_05_CampeggioOben_12_7_MEQ0064131_13
define Beregner_02_CampeggioUnten dummy
attr Beregner_02_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_02_CampeggioUnten webCmd auto:on:off
attr Beregner_02_CampeggioUnten readingList talktext,switch
set Beregner_02_CampeggioUnten talktext Beregnung Camping unten
set Beregner_02_CampeggioUnten switch BEREGNUNG_SCHALTER_02_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_03_Blauregen dummy
attr Beregner_03_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_03_Blauregen webCmd auto:on:off
attr Beregner_03_Blauregen readingList talktext,switch
set Beregner_03_Blauregen talktext Beregnung Blauregen
set Beregner_03_Blauregen switch BEREGNUNG_SCHALTER_03_Blauregen_12_7_MEQ0064131_17
define Beregner_04_HinterKueche dummy
attr Beregner_04_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_04_HinterKueche webCmd auto:on:off
attr Beregner_04_HinterKueche readingList talktext,switch
set Beregner_04_HinterKueche talktext Beregnung Hinter Kueche
set Beregner_04_HinterKueche switch BEREGNUNG_SCHALTER_04_HinterKueche_12_7_MEQ0064131_15
define Beregner_06_Waschhaus dummy
attr Beregner_06_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_06_Waschhaus webCmd auto:on:off
attr Beregner_06_Waschhaus readingList talktext,switch
set Beregner_06_Waschhaus talktext Beregnung Waschhaus
set Beregner_06_Waschhaus switch BEREGNUNG_SCHALTER_06_Waschhaus_12_7_MEQ0064131_16
#------------------------ Einstellungs Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungDummy_Helper dummy
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnungs Logik -----------------------------#
define BeregnungDOIF_NachSonne DOIF ([?Wetter_wunderground:statRegenDayMax] < 1.0 and [myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
define BeregnungDOIF_Mapping DOIF (["Beregner_:on"]) \
(set [$DEVICE:switch] on) \
DOELSEIF (["Beregner_:off"]) \
(set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] == 2) \
(set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|6*[BeregnungStandarddauer]|0|0
defmod BeregnungDOIF_Trigger DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set $SELF cmd_2) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_01_Zitronen) \
(set BeregnungDummy_Helper Beregner_01_Zitronen) \
(set $SELF cmd_3) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten) \
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten) \
(set $SELF cmd_4) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_03_Blauregen) \
(set BeregnungDummy_Helper Beregner_03_Blauregen) \
(set $SELF cmd_5) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_04_HinterKueche) \
(set BeregnungDummy_Helper Beregner_04_HinterKueche) \
(set $SELF cmd_6) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_05_CampeggioOben) \
(set BeregnungDummy_Helper Beregner_05_CampeggioOben) \
(set $SELF cmd_7) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_06_Waschhaus) \
(set BeregnungDummy_Helper Beregner_06_Waschhaus) \
() \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus)
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
attr .*Beregnung.* group Beregnung
attr .*BEREGNUNG.* group Beregnung
attr .*Beregner.* group Beregnung
attr .*BEREGNUNG.* room Beregnung
attr .*Beregnung.* room Beregnung
attr .*Beregner.* room Beregnung
ok, es war das do always ......
wenn man nachdenkt auch logisch :D
teste weiter
Per, wo du gerade da bist ;)
ich versuche auch noch die ZisternenPumpe sobald irgendein Beregner oder die Automatik läuft an/auszuschalten. Abhängig davon, ob sie manuell an ist.
Im Moment habe ich das hier, aber das will nicht so recht.
define BeregnungDOIF_PumpeCisterna DOIF (([BeregnungDOIF_Mapping:"cmd_1"] or [BeregnungDOIF_Trigger] eq "cmd_1") and [BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on, set $SELF selbstangeschaltet 1) \
DOELSEIF (([BeregnungDOIF_Mapping:"cmd_2"] or [BeregnungDOIF_Trigger:"cmd_7_3|cmd_8"]) and [?$SELF:selbstangeschaltet] == 1) (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off, set $SELF selbstangeschaltet 0)
attr BeregnungDOIF_PumpeCisterna readingList selbstangeschaltet
attr BeregnungDOIF_PumpeCisterna wait 0:10
finde keine andere Abfragelogik und die cmd´s sind komplex. Vor allem da der state bei set $SELF nicht angepast wird.
Bessere Idee?
Bin etwas in Eile, schau ich mir später an.
Aber schön, dass der Rest geht. Zisterne ist easy, zumal mit den neuen Aggregatsfunktionen. Alternativ ne ReadingsGroup (https://fhem.de/commandref.html#readingsGroup).
Ich glaube, ich hatte deine Anfrage falsch verstanden.
Die Zisternenpumpe soll angeschaltet werden, falls sie aus ist, aber an bleiben, falls sie manuell angeschaltet war. Sonst wieder aus gehen.
genau .... das DOIF soll unabhängig vom Zustand davor, falls Beregnung, dafür sorgen, dass die Pumpe an ist. Und danach wieder den Zustand von davor herstellen.
Also wenn aus -> für Beregnung an -> wieder aus
Wenn an -> gar nix tun (anlassen)
Na toll, jetzt hat es mir den Text zerschossen :'(
Also nochmal, aber kürzer:
define BeregnungDOIF_PumpeCisterna DOIF (([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0)
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna wait 0:10
Und dazu ein
define BEREGNUNG_SCHALTER_00_Cisterna dummy
mit den üblichen on/off zum manuellen Einschalten.
Dein Beispiel hätte des selbstangeschaltet nicht bedurft, mangels do always hätte es eh nicht anders gekonnt ;).
Uuuh, da brauch ich jetzt mal wieder ein paar Stunden ..... :D
Ist doch easy: wenn mehr als 0 "BEREGNUNG_SCHALTER_0" an sind, geht auch die Zisternenpumpe an, sonst geht sie mit 10 Sekunden Nachlauf wieder aus.
... und wie könnte ich das ohne Extra Dummy (BEREGNUNG_SCHALTER_00_Cisterna dummy) für den Schalter machen (die Pumpe muß anders heißen)? Die Pumpe müßte ich leider, resp optimalerweise, direkt schalten können ohne Dummy dazwischen. Oder ich mach eine STRUCTURE die dann den state von meiner Pumpe einnimmt.
... aber sonst natürlich völlig logisch auf einen laufenden Beregner abzufragen :D
wieso kommt mir sowas nicht? Hatte einen ähnlichen Ansatz am Anfang, .... verworfen weil ich irgendwie Angst hatte, dass dann die Pumpe wenn es von einem Beregner zum nächsten geht immer kurz (Millisekunden, aber Hardware würde bewegt) ausschaltet. Aber das ist ja mit dem wait abgefangen ..... das ich allerdings aus einem anderen Grund jetzt drin hatte ;)
Ich (!) würde es hiermit (https://forum.fhem.de/index.php?topic=52225.0) machen ;).
Aber für deinen Zweck "oversized". Geht auch mit dem DOIF, hatte ich schonmal gemacht, aber verworfen, weil ich o.a. Modul eh im Einsatz habe. Mal sehen ob ich das wiederfinde.
Wird aber nix in den nächsten Stunden. Evtl. morgen.
ich probier mal weiter, aber/und warte sonst gern auf morgen. Will nicht noch eine syntax für ein Modul lernen. Du forderst mich hier schon genug ;)
.... habs jetzt mal mit einer structure gemacht. Die nennt sich
define BEREGNUNG_SCHALTER_00_PumpeCisternaStructure structure room BEREGNUNG_SCHALTER_DUMMY_PUMPE
attr BEREGNUNG_SCHALTER_00_PumpeCisternaStructure clientstate_behavior last
(BEREGNUNG_SCHALTER_DUMMY_PUMPE wird später der direkte Schalter der Pumpe)
nur jetzt denke ich einen Fehler in der Logik gefunden zu haben.
Wenn
define BeregnungDOIF_PumpeCisterna DOIF (([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0)
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
die Pumpe angeschaltet hat, kann ja der DOELSEIF -Fall nicht eintreten, weil BEREGNUNG_SCHALTER_00_PumpeCisternaStructure (oder auch direkt ein dummy) Fall 1 nicht == 0 werden lassen wird.
Hiermit gehts FAST und löst auch das Pumpen Dummy Problem
define BeregnungDOIF_PumpeCisterna DOIF ([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0 and [BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna wait 0:[BeregnungDOIF_Mapping]+10
aber ...... [BeregnungDOIF_Mapping]+10 brauchts, weil er sonst im Auto-Durchlauf genau die Zeit vor dem letzten Beregner die Pumpe ausmacht.
Das wäre so gelöst, aber wenn man Einzelberegner anschaltet, geht das mit dem Ersten. Sobald man den zweiten dazuschaltet geht die Pumpe nach 10 sekunden aus. Da ich deine Syntax [#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0 nicht im Detail verstehe habe ich so weitergespielt:
define BeregnungDOIF_PumpeCisterna DOIF ([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] != 0 and [BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSEIF ([#:"^BEREGNUNG_SCHALTER_0":state:"on","off"] == 0) (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
Das scheint zu funktionieren, aber so ganz verstehen, naja ......
und ich bekomme das im log
Argument "off" isn't numeric in numeric ne (!=)
Also, ich sitz jetzt seit 2 Stunden vor dieser Zeile:
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna wait 0:6*[BeregnungStandarddauer]+10
und egal was ich mit
[#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0
mache, es funktioniert einfach nicht.
Laut commandref, so habe ich es verstanden, sollte obige Zeile alle Devices die mit BEREGNUNG_SCHALTER_0 anfangen durchzählen und mir einen Zahlenwert zurückgeben über die Anzahl dieser Devices mit state off.... und ich habe jetzt sicherlich 100 Varianten durch. Inkl ohne and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off" und attr do always, Default-Wert, und, und, und. Manchmal funktionierts , bei einer anderen Auto-Auswahl von Beregnern dann aber doch wieder nicht. Hab da noch keine Logik erkennen können.
Ein Wunder, dass der neue Raspi noch lebt im Moment.
Die Syntax ist korrekt.
Du kannst das mal testen mit:
define di_test DOIF(1)(set bla [#"^BEREGNUNG_SCHALTER_0":state:"off"])
mit set di_test cmd_1 wird set bla ausgeführt und liefert einen Fehler da bla normalerweise nicht da ist. In der Fehlermeldung ist aber das Ergebnis, hier die Anzahl der Devices sichtbar.
Mit [@"^BEREGNUNG_SCHALTER_0":state:"off"] kannst du dagegen dir die Devices selbst ausgeben lassen.
Voraussetzung ist natürlich die aktuelle Version von DOIF.
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 or [?$SELF:manu] eq "on")
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on)
DOELSIF ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off" and [?$SELF:cmd] <> 4)
(set $SELF manu off)
DOELSIF ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "on" and [?$SELF:cmd] <> 1)
(set $SELF manu on)
DOELSE
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna myReadings manu
berücksichtigt externes Schalten der Zisternenpumpe. Voraussetzung ist, dass [#"^BEREGNUNG_SCHALTER_0":state:"off"] geht.
! Habe gerade kein FHEM da, nur mit Notepad geschrieben !
Hallo Damian. danke für die Bestätigung der Syntax. Hab deinen Code probiert und es wird die korrekte Anzahl angegeben. Da den Fehler ausgeschlossen zu haben stellt die Frage, wo es denn jetzt hängt. Da die Ergebnisse so willkürlich waren, dachte ich das DOIF verhaspelt sich irgendwo.
Mit einer kleinen Verzögerung in MappingDOIF scheint es jetzt zu funktionieren. Ich bin noch skeptisch :D
define BeregnungDOIF_Mapping DOIF (["Beregner_:on"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 1;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["Beregner_:auto|off"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 1;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] == 2) \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|6*[BeregnungStandarddauer]|0|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
attr BeregnungDOIF_Mapping room Beregnung
Die Abfrage ob ein Beregner läuft scheint geklärt. Löst aber nicht die ursprüngliche Aufgabe.
Wenn ich ein
and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off"
in
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 and [?BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off") (set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSE (set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
einbau, läuft die Pumpe genau bis zum zweiten Beregner, da dann [#"^BEREGNUNG_SCHALTER_0":state:"off"] wieder triggert und da BEREGNUNG_SCHALTER_DUMMY_PUMPE dann nicht mehr off ist, wird DOELSE ausgeführt und die Pumpe abgeschaltet. Pers (Edit: ALTE) Variante stellt da wohl das selbe Problem.
Jemand eine Idee?
Edit: Oh, der Per war schneller! Ich schau gleich drüber. Danke
Zitat von: holle75 am 28 April 2017, 13:12:30Pers (Edit: ALTE) Variante stellt da wohl das selbe Problem.
Einspruch! Meine Alte (also Variante ;)) hat sich um den echten Status der Pumpe nicht gekümmert, nur um einen Dummy. Aber da waren mir die lokalen Gegebenheiten noch nicht bekannt.
Jo, deine Alte hatte auch nur in Bezug auf die eigentliche Aufgabe ein wenig hinterhergehinkt. Wollte ja nicht sagen, dass deine Alte ein generelles Problem gehabt hätte ! :D
ich bin noch an deiner Neuen .... muß aber erstmal was Essen nach all der Aufregung ;)
Meine Alte ist schon ganz ok so, passt halt nur nicht zu dir ;D ;D ;D
Vielleicht die Neue ??! 8)
Also, <> schmeißt mir Fehler und myReadings mag DOIF scheinbar auch nicht.
Habs jetzt so probiert:
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_0":state:"off"] != 0 or [?$SELF:manu] eq "on") \
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE on) \
DOELSEIF ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "off" and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF ([BEREGNUNG_SCHALTER_DUMMY_PUMPE] eq "on" and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set BEREGNUNG_SCHALTER_DUMMY_PUMPE off)
attr BeregnungDOIF_PumpeCisterna readingList manu
dann wird zwar die Pumpe angeschaltet, aber nicht mehr am Ende ausgeschaltet.
Wenn die Pumpe an war, bleibt sie an. Das hätt ich aber auch alleine hinbekommen ;D ;D ;D
und da ich es wie immer nicht verstehe, was du da gebastelt hast ..... Idee?
Edit: [#"^BEREGNUNG_SCHALTER_0":state:"on"] != 0
did the trick. Man beachte das on statt off. Bin ganz aufgeregt. Ich test mal weiter.
Habe ich das mit dem "off" schon wieder gemacht?! :-[ :-[ :-[
<> ist in den meisten anderen Programmiersprachen, != bei Perl. Auf dem Notepad gings aber :P
Und versuch es mit myreadings (https://forum.fhem.de/index.php/topic,71000.0.html).
Zitat von: Per am 28 April 2017, 16:09:39
Und versuch es mit myreadings (https://forum.fhem.de/index.php/topic,71000.0.html).
myreadings gibt es noch nicht, es ist nur ein Ausblick.
was wäre der Vorteil gegenüber readingList ?
geht ja gerade. Ich test jetzt nochmal ein bißchen, pack das vom Testsystem wenn ich zurück bin in meine große Config, teste dann nochmal ein paar Tage und dann schreib ich hier am Anfang des Threads eine Zusammenfassung.
Wobei das ein bißchen dauern kann, weil ich vom Raspi 2 auf den Raspi 3 dann gleich umziehe, fhem von 5.7 auf 5.8 update, dann wahrscheinlich haareraufend ein paar Tage mit Problemen verbringe und dann erst testen kann.
Zitat von: Damian am 28 April 2017, 16:34:08
myreadings gibt es noch nicht, es ist nur ein Ausblick.
Ups, ok, dann halt ein beliebiges Dummy.
Ich bin begeistert! Es funktioniert sogar mit Sonnenstand. Tausend Dank Per!
wie geschrieben fasse ich das später alles nochmal zusammen wenn eingebaut.
Jetzt hatte ich aber gerade noch eine Idee. Sorry ;)
Ursprünglich habe ich ja, wenn es die Pumpe schafft, Kreise zusammengefasst. Das kann man jetzt im Code auch recht luxuriös immer noch machen.
Was wäre aber, wenn man Kreise zusammenfassen könnte über eine SetList?
Hab mal angefangen, aber natürlich ist das unfertig gedacht: erstens kann man nur 2 Kreise zusammenfassen und wie man die setList dann entsprechend bastelt habe ich mir auch noch keine Gedanken gemacht.
define BeregnungDOIF_Trigger DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Durchlauf Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_01_Zitronen, IF ([Beregner_01_Zitronen:verbunden] ne "unlinked") (set BeregnungDummy_Helper [Beregner_01_Zitronen:verbunden], set ([Beregner_01_Zitronen:verbunden]:gelaufen) gelaufen) ) \
(set BeregnungDummy_Helper Beregner_01_Zitronen, IF ([Beregner_01_Zitronen:verbunden] ne "unlinked") set BeregnungDummy_Helper [Beregner_01_Zitronen:verbunden] ) \
(set $SELF cmd_3) \
DOELSEIF (0) \
(IF ([Beregner_02_CampeggioUnten:gelaufen] ne "gelaufen") (set BeregnungDummy_Helper Beregner_02_CampeggioUnten) )\
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten) \
(set $SELF cmd_4) \
usw.....
aber ich bin jetzt schon völlig glücklich wenns dir mit den Gedankenspielen reicht! ....
Unter welchen Bedingungen sind denn zwei Pumpen möglich und wann nur eine?
da bräuchte es dann eine manuelle Logik. Also ich bin verantwortlich wie ich sie kombiniere.
Aber wie man das umsetzen könnte?
Ich dachte an eine Auswahlmöglichkeit pro Beregner-Dummy für einen verknüpften Beregner. Wenn dann der im ersten Dummy ausgewählte zweite Beregner auch eine Verknüpfung hat, läuft eben auch der verknüpfte dritte Beregner an.
Wenn der dritte keine Verknüpfung hat ist da eben Schluß und dann läufts die Auto-Reihe durch (bei der man dann abfragen muß ob schon gelaufen). Nicht Supergalant, aber ansonsten keine Idee wie man das visuell aufbereiten soll/kann. Man kann sozusagen nur den als erstes laufenden Block (die ersten x Minuten) verknüpfen.
Edit: Wobei wenn erstmal unterbrochen könnte der nächste dann auch wieder eine Gruppe bilden ... jetzt mal in Blaue gesprochen ohne groß nachzudenken.
pro Dummy attr setList mit allen Beregnern und einem unlinked.
Für andere, falls mal jemand 10 Kreise hat, wäre eine frei Verknüpfbarkeit klar cool .... wo man dann aber wieder visuell aufwendig wird und obs das wirklich so oft braucht?
Das wäre dann die Klickboxen-Lösung mit Gruppen
Ich kanns easy im Code machen, aber irgendwie nicht hübsch .... wenn vielleicht noch andere den Code nutzen wollen.
Zwei (manuelle) Ansätze meinerseits:
Entweder ein Pulldown-Menü pro Pumpe mit der Position zur Auswahl oder (besser zu händeln, wird aber bei vielen Pumpen zu groß) ein Matrixfeld, wo du pro Pumpe mittels Radio-Button die Position auswählen kannst (dazu noch manuell an und aus).
Jup, Pulldown bei den Beregner Dummies (wie bei den Monaten) dachte ich auch. Hab schon ein bißchen gespielt, da wirds aber mit status:on:off:auto schwierig. Oder es gibt einen Trick den ich nicht kenne.
Matrix (Klickboxen?) hört sich spannend an. Mit Position meinst du wenn zwei/drei auf der selben Position sind laufen sie gleichzeitig?
Pumpe an aus | Runde 1 2 3 4 5 6
1 ( ) ( ) (x) ( ) ( ) ( ) ( ) ( )
2 ( ) ( ) (x) ( ) ( ) ( ) ( ) ( )
3 ( ) ( ) (x) ( ) ( ) ( ) ( ) ( )
4 (x) ( ) ( ) ( ) ( ) ( ) ( ) ( )
5 ( ) (x) ( ) ( ) ( ) ( ) ( ) ( )
6 ( ) ( ) ( ) ( ) ( ) ( ) ( ) (x)
Zitat von: Per am 30 April 2017, 00:36:41
Pumpe an aus auto | Runde 1 2 3 4 5 6
1 ( ) ( ) ( ) (x) ( ) ( ) ( ) ( ) ( )
2 ( ) ( ) ( ) (x) ( ) ( ) ( ) ( ) ( )
3 ( ) ( ) ( ) (x) ( ) ( ) ( ) ( ) ( )
4 (x) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )
5 ( ) (x) ( ) ( ) ( ) ( ) ( ) ( ) ( )
6 ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) (x)
so, oder
icon (an aus auto) wie jetzt plus runden-matrix wär auch lecker...
mhm, wobei so schneller zu Erfassen. Aber nicht so hübsch
X in einer Runde wäre ja automatisch Auto.
verdammt :D right
Hallo Per, so jetzt sitz ich seit Tagen am Fehler lösen nach dem Umstieg Raspi2 -> Raspi3 und fhem 5.7 -> 5.8. Ich weiß schon, warum ich mir den Heckmeck versuche nur alle paar Jahre zu geben.
Wobei das mit dem jetzigen Problem nicht direkt etwas zu tun hat.
Da wir (resp. ich den Teil am Testsystem) die Schaltung der Cisternen Pumpe mit Dummies ausbaldowert haben, kommt jetzt im echen Leben die kleine Überraschung. Homematic Geräte haben ja die Eigenart beim Schalten diesen mir bis anhin sowieso nicht verständlichen Zwischenstand a la
PozzoHauptOben_PUMPE_Cisterna working: off
zu liefern. Dieser working state ist gerne mal das Gegenteil vom state direkt danach der uns interessiert.
Jetzt habe ich in
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"on"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
schon mal cmd_2 und cmd_3 umgearbeitet. Das scheint zu funktionieren. Aber cmd_1 frisst leider auch den working: state.
habs mit [#"^BEREGNUNG_SCHALTER_":state:"^on$"]
versucht zu umgehen, will aber nicht.
Das blöde daran ist, das cmd_1 dadurch falsch getriggert wird.
Idee?
EDIT. scheint so, als bräuchte es die Änderung in cmd_2 und cmd_3 nicht. Habe mich im
matched_event_c1_1 working: off,off
matched_event_c2_1 off
matched_event_c3_1 on
matched event am Anfang verschaut. Die beiden werden sauber getriggert wenn man die Pumpe manuell anschaltet. Denke ich??!
cmd_1 fängt das working ....
Und ganz genau weiß ich jetzt nicht, was diese "working" Geschichte sonst noch so anrichtet im gesamten Code, da es mir die Pumpe immer ausschaltet :D
habe jetzt cmd_2 und cmd_3 zurückgebaut auf Original
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"on"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "off" and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "on" and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
und ein List hätte ich auch noch
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_":state:"on"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "off" and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "on" and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSE
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 612
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_1
TYPE DOIF
Readings:
2017-05-04 15:51:42 Device BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
2017-05-04 15:51:35 cmd 1
2017-05-04 15:51:35 cmd_event BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-04 15:51:35 cmd_nr 1
2017-05-04 15:51:39 e_PozzoHauptOben_PUMPE_Cisterna_STATE on
2017-05-04 15:45:48 manu on
2017-05-04 15:51:42 matched_event_c1_1 working: off,off
2017-05-04 15:31:26 matched_event_c2_1 off
2017-05-04 15:31:16 matched_event_c3_1 on
2017-05-04 15:51:35 state cmd_1
2017-05-04 15:51:42 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"on"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "off" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "on" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
Devices:
1 PozzoHauptOben_PUMPE_Cisterna
2 PozzoHauptOben_PUMPE_Cisterna
all PozzoHauptOben_PUMPE_Cisterna
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
Helper:
event working: off,off
globalinit 1
last_timer 0
sleepdevice PozzoHauptOben_PUMPE_Cisterna
sleepsubtimer 0
sleeptimer -1
timerdev BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
timerevent working: off,off
triggerDev BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
timerevents:
working: off
off
timereventsState:
working: off
state: off
triggerEvents:
working: off
off
triggerEventsState:
working: off
state: off
Internals:
1 PozzoHauptOben_PUMPE_Cisterna:STATE
2 PozzoHauptOben_PUMPE_Cisterna:STATE
all PozzoHauptOben_PUMPE_Cisterna:STATE
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_
1:
2:
All:
0 ^BEREGNUNG_SCHALTER_
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
und ein List nach Neustart und dem aktivieren eines Beregners
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_":state:"on"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "off" and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "on" and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSE
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 612
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_1
TYPE DOIF
Readings:
2017-05-04 16:01:30 Device BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-04 15:58:20 cmd 1
2017-05-04 15:58:20 cmd_event BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
2017-05-04 15:58:20 cmd_nr 1
2017-05-04 15:58:25 e_PozzoHauptOben_PUMPE_Cisterna_STATE on
2017-05-04 15:45:48 manu on
2017-05-04 16:01:30 matched_event_c1_1 on,working: off
2017-05-04 15:31:26 matched_event_c2_1 off
2017-05-04 15:31:16 matched_event_c3_1 on
2017-05-04 15:58:20 state cmd_1
2017-05-04 15:58:27 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"on"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "off" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "on" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
Devices:
1 PozzoHauptOben_PUMPE_Cisterna
2 PozzoHauptOben_PUMPE_Cisterna
all PozzoHauptOben_PUMPE_Cisterna
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
Helper:
event on,working: off
globalinit 1
last_timer 0
sleepdevice PozzoHauptOben_PUMPE_Cisterna
sleepsubtimer 0
sleeptimer -1
timerdev BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
timerevent on,working: off
triggerDev BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
timerevents:
on
working: off
timereventsState:
state: on
working: off
triggerEvents:
on
working: off
triggerEventsState:
state: on
working: off
Internals:
1 PozzoHauptOben_PUMPE_Cisterna:STATE
2 PozzoHauptOben_PUMPE_Cisterna:STATE
all PozzoHauptOben_PUMPE_Cisterna:STATE
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_
1:
2:
All:
0 ^BEREGNUNG_SCHALTER_
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
Hättest du einen Auszug des EventViewers dieses Bereiches?
Evtl. kann man ja eine Abfrage hinzufügen, die speziell das "working" (ich kannte bisher nur "set_on" und "set_off" bei HM) abfängt, aber nix weiter macht.
Hallo Per, mit (.*BEREGNUNG.*|.*Beregner.*|.*BeregnungDOIF.*) im Event Monitor.
Das ist Pumpe (war an) aus, ein Beregner ON
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 04.05.2017 17:08:48 cmd_4 PozzoHauptOben_PUMPE_Cisterna
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna wait_timer: no timer
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna manu: off
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 2
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna cmd: 2
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna cmd_event: PozzoHauptOben_PUMPE_Cisterna
2017-05-04 17:08:38 DOIF BeregnungDOIF_PumpeCisterna cmd_2
2017-05-04 17:09:20 DOIF BeregnungDOIF_Mapping cmd_nr: 1
2017-05-04 17:09:20 DOIF BeregnungDOIF_Mapping cmd: 1
2017-05-04 17:09:20 DOIF BeregnungDOIF_Mapping cmd_event: Beregner_03_Blauregen
2017-05-04 17:09:20 DOIF BeregnungDOIF_Mapping
2017-05-04 17:09:20 dummy Beregner_03_Blauregen on
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 1
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna cmd: 1
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna cmd_event: BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna cmd_1
2017-05-04 17:09:20 HM485 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 set_on
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 04.05.2017 17:09:30 cmd_4 PozzoHauptOben_PUMPE_Cisterna
2017-05-04 17:09:20 HM485 BEREGNUNG_12_7_MEQ0064131 ACK
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna wait_timer: no timer
2017-05-04 17:09:20 HM485 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 on
2017-05-04 17:09:20 HM485 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 working: off
2017-05-04 17:09:20 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 04.05.2017 17:09:30 cmd_4 PozzoHauptOben_PUMPE_Cisterna
2017-05-04 17:09:30 DOIF BeregnungDOIF_PumpeCisterna wait_timer: no timer
2017-05-04 17:09:30 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 4
2017-05-04 17:09:30 DOIF BeregnungDOIF_PumpeCisterna cmd: 4
2017-05-04 17:09:30 DOIF BeregnungDOIF_PumpeCisterna cmd_event: PozzoHauptOben_PUMPE_Cisterna
2017-05-04 17:09:30 DOIF BeregnungDOIF_PumpeCisterna cmd_4
Das ist direkt danach. Beregner OFF. Die Pumpe hat er schon oben nach 10 sek ausgeschaltet.
2017-05-04 17:11:26 DOIF BeregnungDOIF_Mapping cmd_nr: 2
2017-05-04 17:11:26 DOIF BeregnungDOIF_Mapping cmd: 2
2017-05-04 17:11:26 DOIF BeregnungDOIF_Mapping cmd_event: Beregner_03_Blauregen
2017-05-04 17:11:26 DOIF BeregnungDOIF_Mapping
2017-05-04 17:11:26 dummy Beregner_03_Blauregen off
2017-05-04 17:11:26 HM485 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 set_off
2017-05-04 17:11:26 HM485 BEREGNUNG_12_7_MEQ0064131 ACK
2017-05-04 17:11:26 HM485 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 working: off
2017-05-04 17:11:26 HM485 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off
nach diesen beiden Vorgängen das list
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_":state:"on"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "off" and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "on" and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSE
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 612
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_4
TYPE DOIF
Readings:
2017-05-04 17:11:26 Device BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-04 17:09:30 cmd 4
2017-05-04 17:09:30 cmd_event PozzoHauptOben_PUMPE_Cisterna
2017-05-04 17:09:30 cmd_nr 4
2017-05-04 17:10:11 e_PozzoHauptOben_PUMPE_Cisterna_STATE off
2017-05-04 17:08:38 manu off
2017-05-04 17:11:26 matched_event_c1_1 working: off,off
2017-05-04 15:31:26 matched_event_c2_1 off
2017-05-04 15:31:16 matched_event_c3_1 on
2017-05-04 17:09:30 state cmd_4
2017-05-04 17:09:30 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"on"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "off" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "on" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
Devices:
1 PozzoHauptOben_PUMPE_Cisterna
2 PozzoHauptOben_PUMPE_Cisterna
all PozzoHauptOben_PUMPE_Cisterna
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
Helper:
event working: off,off
globalinit 1
last_timer 0
sleepdevice PozzoHauptOben_PUMPE_Cisterna
sleepsubtimer -1
sleeptimer -1
timerdev BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
timerevent working: off,off
triggerDev BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
timerevents:
working: off
off
timereventsState:
working: off
state: off
triggerEvents:
working: off
off
triggerEventsState:
working: off
state: off
Internals:
1 PozzoHauptOben_PUMPE_Cisterna:STATE
2 PozzoHauptOben_PUMPE_Cisterna:STATE
all PozzoHauptOben_PUMPE_Cisterna:STATE
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_
1:
2:
All:
0 ^BEREGNUNG_SCHALTER_
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
Ok, das ist eine Frage für den Chef (Damian), ob und wie # das abfangen kann.
Zitat von: Per am 04 Mai 2017, 17:22:03
Ok, das ist eine Frage für den Chef (Damian), ob und wie # das abfangen kann.
[#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"]
hier wird nur auf "on" getriggert und gezählt wird nur state = "on"
Danke Damian. Ich probiere das morgen.
Mmh, jetzt bin ich irritiert. Ein List ergibt:
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "off" and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "on" and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSE
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 608
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_4
TYPE DOIF
Readings:
2017-05-05 09:17:26 Device PozzoHauptOben_PUMPE_Cisterna
2017-05-05 09:17:26 cmd 4
2017-05-05 09:17:26 cmd_event PozzoHauptOben_PUMPE_Cisterna
2017-05-05 09:17:26 cmd_nr 4
2017-05-05 09:17:26 e_PozzoHauptOben_PUMPE_Cisterna_STATE off
2017-05-05 09:17:09 manu off
2017-05-05 09:17:16 matched_event_c1_1 on
2017-05-05 09:17:26 state cmd_4
2017-05-05 09:17:26 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"^on$"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "off" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 InternalDoIf($hash,'PozzoHauptOben_PUMPE_Cisterna','STATE') eq "on" and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
Devices:
1 PozzoHauptOben_PUMPE_Cisterna
2 PozzoHauptOben_PUMPE_Cisterna
all PozzoHauptOben_PUMPE_Cisterna
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
Helper:
event working: off,off
globalinit 1
last_timer 0
sleepdevice PozzoHauptOben_PUMPE_Cisterna
sleepsubtimer -1
sleeptimer -1
timerdev PozzoHauptOben_PUMPE_Cisterna
timerevent working: off,off
triggerDev PozzoHauptOben_PUMPE_Cisterna
timerevents:
working: off
off
timereventsState:
working: off
state: off
triggerEvents:
working: off
off
triggerEventsState:
working: off
state: off
Internals:
1 PozzoHauptOben_PUMPE_Cisterna:STATE
2 PozzoHauptOben_PUMPE_Cisterna:STATE
all PozzoHauptOben_PUMPE_Cisterna:STATE
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_:^on$
1:
2:
All:
0 ^BEREGNUNG_SCHALTER_:^on$
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
in den Readings wird das "working off" nicht mehr gefangen (war vorher so), aber im helper event.
Funktionieren tut es immer noch nicht. Per, da ich deinen BeregnungDOIF_PumpeCisterna DOIF Code noch immer nicht wirklich verstehe.... könntest du nochmal über den statusQuo im Zusammenhang mit dem working off schauen? Bin hier gerade ein wenig lost.
Vielleicht hats ja auch damit gar nichts zu tun und ich habe einfach mit den Dummies nur nicht ordentlich getestet :D
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "off" and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF ([PozzoHauptOben_PUMPE_Cisterna] eq "on" and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
Aktuell reagieren die DOELSEIF auf jedes Event, bei "Nichtpassen" startet DOELSE. Also muss jetzt die Änderung von oben wieder rein:
([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:off"] and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:on"] and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSE
(set PozzoHauptOben_PUMPE_Cisterna off)
Wenn das auch nicht hilft, muss statt DOELSE ein weiteres DOELSEIF mit
([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] == 0)
rein. Evtl. geht sogar nur
([#] == 0)
als Bedingung, wäre einen Test wert.
mit hin und herschalten der Pumpe und:
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:off"] and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:on"] and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
fängt er sogar jetzt die set_on + die alten workings :D
und manu wird nicht richtig gesetzt
List (Teil) ... hier ist die Pumpe an, manu steht aber auf off
Readings:
2017-05-05 10:46:09 Device PozzoHauptOben_PUMPE_Cisterna
2017-05-05 10:46:09 cmd 2
2017-05-05 10:46:09 cmd_event PozzoHauptOben_PUMPE_Cisterna
2017-05-05 10:46:09 cmd_nr 2
2017-05-05 10:46:09 manu off
2017-05-05 10:46:09 matched_event_c2_1 working: off
2017-05-05 10:46:09 matched_event_c3_1 set_on
2017-05-05 10:46:09 state cmd_2
irgendwie müssen doch diese Homematic Extras rauszufiltern sein?!
EDIT: Hoppala, jetzt aktuelles List. Sorry
OK, gg. "set_on" hilft "^on".
Vllt. hilft gg. "working" "event-on-change-reading state" oder "event-on-change-reading state,battery" auf HM-Seite. Ist zwar nicht die feine Englische, aber dann kann man in Ruhe weiter suchen.
Code mit ^off$" löst das Problem von manu. Das schaltet jetzt entsprechend Pumpe an/aus. Aber sobald ich einen Beregner anschalte läuft der waittimer los und schaltet nach 10 sek aus. Wie bisher.
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^off$"] and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^on$"] and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
Event Monitor
2017-05-05 11:14:38 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 1
2017-05-05 11:14:38 DOIF BeregnungDOIF_PumpeCisterna cmd: 1
2017-05-05 11:14:38 DOIF BeregnungDOIF_PumpeCisterna cmd_event: BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-05 11:14:38 DOIF BeregnungDOIF_PumpeCisterna cmd_1
2017-05-05 11:14:38 HM485 PozzoHauptOben_PUMPE_Cisterna set_on
2017-05-05 11:14:38 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 05.05.2017 11:14:48 cmd_4 PozzoHauptOben_PUMPE_Cisterna
2017-05-05 11:14:38 HM485 PozzoHauptOben_PUMPE_Cisterna on
2017-05-05 11:14:38 HM485 PozzoHauptOben_PUMPE_Cisterna working: off
2017-05-05 11:14:48 DOIF BeregnungDOIF_PumpeCisterna wait_timer: no timer
2017-05-05 11:14:49 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 4
2017-05-05 11:14:49 DOIF BeregnungDOIF_PumpeCisterna cmd: 4
2017-05-05 11:14:49 DOIF BeregnungDOIF_PumpeCisterna cmd_event: PozzoHauptOben_PUMPE_Cisterna
2017-05-05 11:14:49 DOIF BeregnungDOIF_PumpeCisterna cmd_4
2017-05-05 11:14:49 HM485 PozzoHauptOben_PUMPE_Cisterna set_off
2017-05-05 11:14:49 HM485 PozzoHauptOben_PUMPE_Cisterna working: off
2017-05-05 11:14:49 HM485 PozzoHauptOben_PUMPE_Cisterna off
List. DOIF fängt weiterhin die workings als timer und trigger events.
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^off$"] and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^on$"] and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSE
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 608
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_4
TYPE DOIF
Readings:
2017-05-05 11:14:49 Device PozzoHauptOben_PUMPE_Cisterna
2017-05-05 11:14:49 cmd 4
2017-05-05 11:14:49 cmd_event PozzoHauptOben_PUMPE_Cisterna
2017-05-05 11:14:49 cmd_nr 4
2017-05-05 11:13:48 manu on
2017-05-05 11:14:38 matched_event_c1_1 on
2017-05-05 11:14:49 matched_event_c2_1 off
2017-05-05 11:14:38 matched_event_c3_1 on
2017-05-05 11:14:49 state cmd_4
2017-05-05 11:14:48 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"^on$"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 EventDoIf('PozzoHauptOben_PUMPE_Cisterna',$hash,'^off$',0) and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 EventDoIf('PozzoHauptOben_PUMPE_Cisterna',$hash,'^on$',0) and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
Devices:
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
Helper:
event off
globalinit 1
last_timer 0
sleepdevice PozzoHauptOben_PUMPE_Cisterna
sleepsubtimer -1
sleeptimer -1
timerdev PozzoHauptOben_PUMPE_Cisterna
timerevent off
triggerDev PozzoHauptOben_PUMPE_Cisterna
timerevents:
working: off
off
timereventsState:
working: off
state: off
triggerEvents:
working: off
off
triggerEventsState:
working: off
state: off
Internals:
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_:^on$
1:
0 PozzoHauptOben_PUMPE_Cisterna:^off$
2:
0 PozzoHauptOben_PUMPE_Cisterna:^on$
All:
0 ^BEREGNUNG_SCHALTER_:^on$
1 PozzoHauptOben_PUMPE_Cisterna:^off$
2 PozzoHauptOben_PUMPE_Cisterna:^on$
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
Mal davon ausgehend, dass es an den working: liegt wäre doch die Aufgabe das working rauszufiltern. Aber mit event-on-change am Device möchte ich nicht unbedingt ran. Ich seh mich in einem Jahr Fehler suchen :D
Es muß doch eine Syntax (im DOIF) geben, die working rausfiltert ?!
Oder generell eine andere Herangehensweise ans DOIF? Aber da bist du der Maestro. Mir kam anfänglich ja auch keine Idee.
Zitat von: Per am 05 Mai 2017, 10:01:32
Wenn das auch nicht hilft, muss statt DOELSE ein weiteres DOELSEIF mit
([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] == 0)
rein. Evtl. geht sogar nur
([#] == 0)
als Bedingung, wäre einen Test wert.
so
([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^off$"] and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^on$"] and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSEIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] == 0)
(set PozzoHauptOben_PUMPE_Cisterna off)
macht er immerhin die Pumpe nicht immer aus :D
allerdings macht er, wenn vorher aus, die Pumpe an, aber lässt sie an :(
([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^off$"] and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^on$"] and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSEIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] == 0 and [?$SELF:manu] eq "off")
(set PozzoHauptOben_PUMPE_Cisterna off)
zum Haare raufen. Genau wie zuvor. Stellt an, aber nicht ab
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^off$"] and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF (["PozzoHauptOben_PUMPE_Cisterna:^on$"] and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_:^on$":state:"^on$"] == 0 and [?$SELF:manu] eq "off") \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
Guten Morgen! ... habe jetzt die halbe Nacht die commandref durchgeackert und alle erdenklichen Möglichkeiten durchprobiert (die Beregner rauchten heute Morgen :D)
habe auch Pers Vorschlag bzgl event-on-change-reading state bei den Beregnern und der Pumpe beherzigt und es kommt somit nur noch
set_on
set_off
on
off
durch.
die jetzige
cfg:
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSE \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
sollte sowohl bei der Pumpe als auch bei den Beregnern alles was nicht on oder off ist herausfiltern. Trotzdem läuft die Geschichte nicht.
Auszug event-monitor
2017-05-06 09:05:15 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 1
2017-05-06 09:05:15 DOIF BeregnungDOIF_PumpeCisterna cmd: 1
2017-05-06 09:05:15 DOIF BeregnungDOIF_PumpeCisterna cmd_event: BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
2017-05-06 09:05:15 DOIF BeregnungDOIF_PumpeCisterna cmd_1
2017-05-06 09:05:15 HM485 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 set_on
2017-05-06 09:05:15 HM485 PozzoHauptOben_PUMPE_Cisterna set_on
2017-05-06 09:05:15 HM485 BEREGNUNG_12_7_MEQ0064131 ACK
2017-05-06 09:05:15 HM485 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-05-06 09:05:15 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 06.05.2017 09:05:25 cmd_4 PozzoHauptOben_PUMPE_Cisterna
2017-05-06 09:05:15 HM485 PozzoHauptOben_PUMPE_Cisterna on
2017-05-06 09:05:25 DOIF BeregnungDOIF_PumpeCisterna wait_timer: no timer
2017-05-06 09:05:25 DOIF BeregnungDOIF_PumpeCisterna cmd_nr: 4
2017-05-06 09:05:25 DOIF BeregnungDOIF_PumpeCisterna cmd: 4
2017-05-06 09:05:25 DOIF BeregnungDOIF_PumpeCisterna cmd_event: PozzoHauptOben_PUMPE_Cisterna
2017-05-06 09:05:25 DOIF BeregnungDOIF_PumpeCisterna cmd_4
2017-05-06 09:05:25 HM485 PozzoHauptOben_PUMPE_Cisterna set_off
2017-05-06 09:05:25 HM485 PozzoHauptOben_PUMPE_Cisterna off
egal wie (ob Pumpe vorher an oder aus), die Pumpe wird nach Betätigung eines Beregners nach 10 sek ausgeschaltet.
Irgendwas triggert bei cmd_1 zu cmd_4 und ich finds nicht heraus. Wenn es kein Bug im DOIF ist, gebe ich mit dem Schalten der Pumpe hiermit auf.
Ich beruhige mich jetzt erstmal ein paar Tage und teste den Rest der Beregnung ausgiebig und dann mach ich noch die Zusammenfassung.
Vielen Dank Per! für deine Mühen und Damian für ein vorzügliches Modul.
PS. Per, durch das ganze hin und her habe ich jetzt sogar dein DOIF Cisterna verstanden :D .... Hirnakrobatik ;)
DAS GIBTS DOCH NICHT! Jetzt dachte ich im Restore "Ach komm, einen probierst du noch"
.... und es geht. Alle event-on-change-reading Geschichten sind raus.
und das hier funktioniert:
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] != 0 or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] != 4) \
(set $SELF manu off) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] != 1) \
(set $SELF manu on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] == 0) \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
testen, testen, testen ......
edit: und trotzdem verwunderlich, warum es funktioniert. Das DOIF fängt alle events. Oder lese ich das List einfach falsch?
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] == 0)
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 609
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_4
TYPE DOIF
Readings:
2017-05-06 10:00:01 Device PozzoHauptOben_PUMPE_Cisterna
2017-05-06 10:00:01 cmd 4
2017-05-06 10:00:01 cmd_event BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-06 10:00:01 cmd_nr 4
2017-05-06 09:56:19 manu off
2017-05-06 09:59:51 matched_event_c1_1 working: off,off
2017-05-06 10:00:01 matched_event_c2_1 off
2017-05-06 09:56:50 matched_event_c3_1 on
2017-05-06 09:59:51 matched_event_c4_1 working: off,off
2017-05-06 10:00:01 state cmd_4
2017-05-06 10:00:01 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"^on$"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 EventDoIf('^PozzoHauptOben_PUMPE_Cisterna$',$hash,'^off$',0) and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 EventDoIf('^PozzoHauptOben_PUMPE_Cisterna$',$hash,'^on$',0) and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
3 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"^on$"') == 0
Devices:
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
4:
Helper:
event off
globalinit 1
last_timer 0
sleepdevice BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
sleepsubtimer -1
sleeptimer -1
timerdev BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
timerevent working: off,off
triggerDev PozzoHauptOben_PUMPE_Cisterna
timerevents:
working: off
off
timereventsState:
working: off
state: off
triggerEvents:
working: off
off
triggerEventsState:
working: off
state: off
Internals:
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_
1:
0 ^PozzoHauptOben_PUMPE_Cisterna$:^off$
2:
0 ^PozzoHauptOben_PUMPE_Cisterna$:^on$
3:
0 ^BEREGNUNG_SCHALTER_
All:
0 ^BEREGNUNG_SCHALTER_
1 ^PozzoHauptOben_PUMPE_Cisterna$:^off$
2 ^PozzoHauptOben_PUMPE_Cisterna$:^on$
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
Habe jetzt noch BeregnungDOIF_Mapping angepasst. Funktioniert auch das wieder.
Jetzt gibts aber neue Herausforderungen ;)
Das
define BeregnungDOIF_NachSonne DOIF ([?Wetterstation:statRain_dayHour24:d] < 1.0 and [myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungDOIF_NachSonne group Beregnung
attr BeregnungDOIF_NachSonne room Beregnung
triggert ja das
define BeregnungDOIF_Trigger DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1"))
Warum läuft das DOIF trotz dem Fragezeichen vor ?BeregnungDurchlauf_AN_AUS_AUTO sofort los (wenn BeregnungDOIF_NachSonne auf cmd_1 steht), wenn ich den Dummy BeregnungDurchlauf_AN_AUS_AUTO auf auto setze? Das Fragezeichen sollte doch diesen Event ignorieren. ??
Internals:
DEF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1"))
()
()
(set SqueezeBoxPlayer.* talk Durchlauf Beregnung gestartet, set $SELF cmd_2)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen)
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen)
(set $SELF cmd_3)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_04_HinterKueche)
(set BeregnungDummy_Helper Beregner_04_HinterKueche)
(set $SELF cmd_4)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_05_CampeggioOben)
(set BeregnungDummy_Helper Beregner_05_CampeggioOben)
(set $SELF cmd_5)
DOELSEIF (0)
(set BeregnungDummy_Helper Beregner_06_Waschhaus)
(set BeregnungDummy_Helper Beregner_06_Waschhaus)
(set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off")
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet)
NAME BeregnungDOIF_Trigger
NR 605
NTFY_ORDER 50-BeregnungDOIF_Trigger
STATE cmd_2
TYPE DOIF
Readings:
2017-05-06 11:15:24 Device BeregnungDurchlauf_AN_AUS_AUTO
2017-05-06 11:16:24 cmd 2.3
2017-05-06 11:16:24 cmd_event set_cmd_2
2017-05-06 11:16:24 cmd_nr 2
2017-05-06 11:16:24 cmd_seqnr 3
2017-05-06 08:51:47 e_BeregnungDOIF_NachSonne_STATE cmd_1
2017-05-06 11:15:24 e_BeregnungDurchlauf_AN_AUS_AUTO_STATE auto
2017-05-06 11:16:24 state cmd_2
2017-05-06 11:16:24 wait_timer 06.05.2017 11:17:24 cmd_3_2 set_cmd_3
Condition:
0 InternalDoIf($hash,'BeregnungDurchlauf_AN_AUS_AUTO','STATE') eq "on" or (InternalDoIf($hash,'BeregnungDurchlauf_AN_AUS_AUTO','STATE') eq "auto" and InternalDoIf($hash,'BeregnungDOIF_NachSonne','STATE') eq "cmd_1")
1 0
2 0
3 0
4 0
5 InternalDoIf($hash,'BeregnungDurchlauf_AN_AUS_AUTO','STATE') eq "off"
Devices:
0 BeregnungDurchlauf_AN_AUS_AUTO BeregnungDOIF_NachSonne
5 BeregnungDurchlauf_AN_AUS_AUTO
all BeregnungDurchlauf_AN_AUS_AUTO BeregnungDOIF_NachSonne
Do:
0:
0
1
2 set SqueezeBoxPlayer.* talk Durchlauf Beregnung gestartet, set BeregnungDOIF_Trigger cmd_2
1:
0 set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen
1 set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen
2 set BeregnungDOIF_Trigger cmd_3
2:
0 set BeregnungDummy_Helper Beregner_04_HinterKueche
1 set BeregnungDummy_Helper Beregner_04_HinterKueche
2 set BeregnungDOIF_Trigger cmd_4
3:
0 set BeregnungDummy_Helper Beregner_05_CampeggioOben
1 set BeregnungDummy_Helper Beregner_05_CampeggioOben
2 set BeregnungDOIF_Trigger cmd_5
4:
0 set BeregnungDummy_Helper Beregner_06_Waschhaus
1 set BeregnungDummy_Helper Beregner_06_Waschhaus
2 set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet
5:
0 set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus, set SqueezeBoxPlayer.* talk Durchlauf Beregnung beendet
6:
Helper:
event auto
globalinit 1
last_timer 0
sleepdevice set_cmd_3
sleepsubtimer 1
sleeptimer 2
timerdev BeregnungDurchlauf_AN_AUS_AUTO
timerevent auto
triggerDev BeregnungDurchlauf_AN_AUS_AUTO
timerevents:
auto
timereventsState:
state: auto
triggerEvents:
auto
triggerEventsState:
state: auto
Internals:
0 BeregnungDurchlauf_AN_AUS_AUTO:STATE BeregnungDOIF_NachSonne:STATE
5 BeregnungDurchlauf_AN_AUS_AUTO:STATE
all BeregnungDurchlauf_AN_AUS_AUTO:STATE BeregnungDOIF_NachSonne:STATE
Itimer:
Readings:
Regexp:
0:
1:
2:
3:
4:
5:
All:
State:
State:
Trigger:
Attributes:
group Beregnung
wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
Zitat von: holle75 am 06 Mai 2017, 11:29:35
Warum läuft das DOIF trotz dem Fragezeichen vor ?BeregnungDurchlauf_AN_AUS_AUTO sofort los (wenn BeregnungDOIF_NachSonne auf cmd_1 steht), wenn ich den Dummy BeregnungDurchlauf_AN_AUS_AUTO auf auto setze? Das Fragezeichen sollte doch diesen Event ignorieren. ?
Macht es ja. Die erste Abfrage reagiert auf den Event, meldet zwar false, aber dabei wird auch das Fragezeichen abgefragt. Richtig müsste es heißen:
["BeregnungDurchlauf_AN_AUS_AUTO":"on"]
falsche Syntax, wenn Regex für das Devices und Event gelten soll, dann so:
["BeregnungDurchlauf_AN_AUS_AUTO:on"]
Es ist aber auch soooowas von komplex. Danke euch beiden.
Per, modifiziere gerade noch die Tiefenpumpe aus dem anderen Thread auch in Abhängigkeit der Beregner. Wo ja jetzt die Beregner-Abfrage-Syntax so schön funktioniert :D
aber wenn einer von euch noch eine Antwort zum List hätte? Interessiert mich was ich da falsch lese. Im Reading und im helper sind doch die workings drin? Die dachte ich ja mit der Syntax rauszufiltern.
Zitat von: holle75 am 06 Mai 2017, 09:31:54
edit: und trotzdem verwunderlich, warum es funktioniert. Das DOIF fängt alle events. Oder lese ich das List einfach falsch?
Internals:
DEF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] != 0 or [?$SELF:manu] eq "on")
(set PozzoHauptOben_PUMPE_Cisterna on)
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] != 4)
(set $SELF manu off)
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] != 1)
(set $SELF manu on)
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] == 0)
(set PozzoHauptOben_PUMPE_Cisterna off)
NAME BeregnungDOIF_PumpeCisterna
NR 609
NTFY_ORDER 50-BeregnungDOIF_PumpeCisterna
STATE cmd_4
TYPE DOIF
Readings:
2017-05-06 10:00:01 Device PozzoHauptOben_PUMPE_Cisterna
2017-05-06 10:00:01 cmd 4
2017-05-06 10:00:01 cmd_event BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
2017-05-06 10:00:01 cmd_nr 4
2017-05-06 09:56:19 manu off
2017-05-06 09:59:51 matched_event_c1_1 working: off,off
2017-05-06 10:00:01 matched_event_c2_1 off
2017-05-06 09:56:50 matched_event_c3_1 on
2017-05-06 09:59:51 matched_event_c4_1 working: off,off
2017-05-06 10:00:01 state cmd_4
2017-05-06 10:00:01 wait_timer no timer
Condition:
0 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"^on$"') != 0 or ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','manu') eq "on"
1 EventDoIf('^PozzoHauptOben_PUMPE_Cisterna$',$hash,'^off$',0) and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 4
2 EventDoIf('^PozzoHauptOben_PUMPE_Cisterna$',$hash,'^on$',0) and ReadingValDoIf($hash,'BeregnungDOIF_PumpeCisterna','cmd') != 1
3 AggregateDoIf($hash,'#','^BEREGNUNG_SCHALTER_','state','"^on$"') == 0
Devices:
Do:
0:
0 set PozzoHauptOben_PUMPE_Cisterna on
1:
0 set BeregnungDOIF_PumpeCisterna manu off
2:
0 set BeregnungDOIF_PumpeCisterna manu on
3:
0 set PozzoHauptOben_PUMPE_Cisterna off
4:
Helper:
event off
globalinit 1
last_timer 0
sleepdevice BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
sleepsubtimer -1
sleeptimer -1
timerdev BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
timerevent working: off,off
triggerDev PozzoHauptOben_PUMPE_Cisterna
timerevents:
working: off
off
timereventsState:
working: off
state: off
triggerEvents:
working: off
off
triggerEventsState:
working: off
state: off
Internals:
Itimer:
Readings:
Regexp:
0:
0 ^BEREGNUNG_SCHALTER_
1:
0 ^PozzoHauptOben_PUMPE_Cisterna$:^off$
2:
0 ^PozzoHauptOben_PUMPE_Cisterna$:^on$
3:
0 ^BEREGNUNG_SCHALTER_
All:
0 ^BEREGNUNG_SCHALTER_
1 ^PozzoHauptOben_PUMPE_Cisterna$:^off$
2 ^PozzoHauptOben_PUMPE_Cisterna$:^on$
State:
State:
Trigger:
Attributes:
group Beregnung
readingList manu
wait 0:0:0:10
Zitat von: Per am 07 Mai 2017, 07:24:25
Macht es ja. Die erste Abfrage reagiert auf den Event, meldet zwar false, aber dabei wird auch das Fragezeichen abgefragt. Richtig müsste es heißen:
["BeregnungDurchlauf_AN_AUS_AUTO":"on"]
falsche Syntax, wenn Regex für das Devices und Event gelten soll, dann so:
["BeregnungDurchlauf_AN_AUS_AUTO:on"]
Mmh, da es um auto geht (was ich irgendwann für den nächsten Tag setzen möchte, deswegen soll nicht gleich losgelaufen werden) und wenn denn dann SonneDOIF den nächsten Morgen auf cmd_1 springt (weil es Nachts/Abends auf cmd_2 geht), sollte doch einfach nur der state von BeregnungDurchlauf_AN_AUS_AUTO überprüft werden. Und da es ein Fragezeichen hat die Änderung des state eben nicht triggern ???
Warum ist dann meine ursprüngliche Syntax falsch? tschuldigung, verstehe es nicht.
define BeregnungDOIF_Trigger DOIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on" or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1"))
Edit: Aaah, ihr redet von der ersten Bedingung. Die funktioniert. Nur die or Bedingung funktioniert nicht.
Nochmal, diesmal nicht vom Handy, daher etwas ausführlicher.
BeregnungDurchlauf_AN_AUS_AUTO schaltet auf "an". Was passiert?
1. die erste Abfrage (Trigger) wird aktiv. Ergebnis positiv (true). Jetzt ignorieren wir mal das or, sonst wäre jetzt schon Schluss.
2. die zweite Abfrage (?) wird, da ja die erste durch den Trigger aktiviert wurde, auch abgefragt. Ergebnis false. "BeregnungDOIF_NachSonne" ist hier uninteressant, denken wir uns mal ein true.
true or (false and true) -> true -> Start erfolgt.
BeregnungDurchlauf_AN_AUS_AUTO schaltet auf "auto". Was passiert?
1. die erste Abfrage (Trigger) wird aktiv. Ergebnis negativ (false).
2. die zweite Abfrage (?) wird, da ja die erste durch den Trigger aktiviert wurde, auch abgefragt. Ergebnis true. I.V. mit dem vorhin als true gedachten "BeregnungDOIF_NachSonne" und dem and folgt:
false or (true and true) -> true -> Start erfolgt.
Abhilfe:
1. [BeregnungDurchlauf_AN_AUS_AUTO:"on"] (https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events) (bewirkt, dass nur extakt dieser Wert (+ Regex) getriggert wird, nicht alles was bei "BeregnungDurchlauf_AN_AUS_AUTO" kommt.
oder
2. checkReadingEvent (https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent)
Danke Per, entscheidend bei diesem Beispiel also, dass ich zweimal das selbe Device abfrage? Gäbe es nur die or-Bedingung (und ich setze ?BeregnungDurchlauf_AN_AUS_AUTO auf auto) würde nichts passieren. Richtig?
Ich habe jede Bedingung als einzelnen Vorgang betrachtet (und es ist mir neu, dass obwohl ? davor, wenn vorher getriggert, auch abgefragt wird). Jetzt verstehe ich das Problem, also mein Verständnisproblem. Danke dass du dir die Zeit genommen hast!
und jetzt verstehe ich auch warum ihr beide auf der ersten Bedingung rumgeritten habt :D
Ich habe natürlich nur die ?-Bedingung verändert und aus dem on ein auto gemacht -> klar jetzt, hat nicht funktionert
testen, testen, testen...
Ach so, was auch noch interessant ist, ist dass ich alle cmd oder cmd_sqnr. Bedingungen zb statt
== 1
in
eq "1"
umbauen mußte, da ich sonst immer
Argument " " is no numeric error
Argument "" isn't numeric in numeric eq (==) at (eval 1667) line
oder so ähnlich (log leider gelöscht) (gefunden) bekommen habe. Es funktioniert, aber den Fehler verstehen tue ich nicht (weil ist ja numerisch). Irgend eine Freizeichen-Problematik? Aber wo?
Zitat von: holle75 am 08 Mai 2017, 14:38:41Richtig?
Ja.
Zitat von: holle75 am 08 Mai 2017, 14:38:41Danke
Gern, hat mir ja Spass gemacht und dümmer bin ich davon auch nicht geworden (hoffe ich ;))
Zitat von: holle75 am 08 Mai 2017, 14:38:41Es funktioniert, aber den Fehler verstehen tue ich nicht (weil ist ja numerisch).
Verstehe ich auch nicht. Habe aber bei mir nicht nach Fehlern geschaut, solange es funktioniert hat.
es ist jetzt
["BeregnungDurchlauf_AN_AUS_AUTO:on"]
geworden ;)
.... und wenn es dich überkommt, die Langeweile überhand nimmt, es gibt ja noch die Idee mit der Matrix (Klickboxen) :D
habe ein bißchen rumgeschaut und eine Matrix scheint eine recht komplexe Angelegenheit in fhem zu sein. uzsu wäre dann wohl das Mittel der Wahl. Habe jedenfalls keine andere Klickbox-Lösung direkt in fhem gefunden ... oder kennst du eine?
Die drop-down-list Idee (die noch nicht ganz fertig gedacht ist) wird mir immer sympathischer. Auch weil man den Code nicht komplett umwerfen muß und die netten DevStateIcons beibehalten kann um direkt den state zu schalten .... was dann in zB ftui (für direkte Anwahlen, ohne die Gruppenverknüpfung, die man ja in WEB machen kann) das ganze erleichtern könnte.
Was meinst du?
Die Frontend-Geschichte ist nicht so meins. Allerdings sehe ich nichts, was gg. das "Aufbohren" deines "An-Aus-Auto"-Prinzipes spricht. Muss "halt" das DOIF geändert werden, da nicht mehr "Auto" abgefragt und die feste Reihenfolge nicht gegeben ist.
DOIF kann ja Events mit Regex abfragen, startest du einfach am Anfang (wenn vorhanden) alle "Beregner:Runde1", dannach alle "Beregner:Runde2", mit Timer passend zur Anzahl (wie schon gemacht).
Zur optischen Anzeige siehe oben ;).
Ach Per ... "muß halt das DOIF geändert werden" ... ich hab jetzt mal die Anführungszeichen an den wirklich wichtigen Stellen gemacht :D
Also, jeder Beregner Dummy hat jetzt ein Reading "Kreis". Trotzdem noch ein auto, da man so der Automatik zuordnen oder (was ist das Wort für das Gegenteil von zuordnen) kann, ohne den Kreis eventuell zu vergessen (ich bin schon über 30).
######################################## BEREGNUNG ############################################
define myTwilight Twilight 43.5976 12.8648 0 712129
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#--------------------------- FAKE DUMMIES ---------------------------------#
define BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 dummy
attr BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 room Beregnung
attr BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 webCmd on:off
define BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 dummy
attr BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 room Beregnung
attr BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 webCmd on:off
define BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 dummy
attr BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 room Beregnung
attr BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 webCmd on:off
define BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 dummy
attr BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 room Beregnung
attr BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 webCmd on:off
define BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 dummy
attr BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 room Beregnung
attr BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 webCmd on:off
define BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 dummy
attr BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 room Beregnung
attr BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 webCmd on:off
define PozzoHauptOben_PUMPE_Cisterna dummy
attr PozzoHauptOben_PUMPE_Cisterna room Beregnung
attr PozzoHauptOben_PUMPE_Cisterna webCmd on:off
#------------------------ Beregner Dummys ---------------------------#
define Beregner_01_Zitronen dummy
attr Beregner_01_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_01_Zitronen group Beregnung
attr Beregner_01_Zitronen readingList talktext,switch,Kreis
attr Beregner_01_Zitronen room Beregnung
attr Beregner_01_Zitronen setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_01_Zitronen webCmd Kreis:auto:on:off
#set Beregner_01_Zitronen talktext Beregnung Zitronen
#set Beregner_01_Zitronen switch BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
define Beregner_05_CampeggioOben dummy
attr Beregner_05_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_05_CampeggioOben group Beregnung
attr Beregner_05_CampeggioOben readingList talktext,switch,Kreis
attr Beregner_05_CampeggioOben room Beregnung
attr Beregner_05_CampeggioOben setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_05_CampeggioOben webCmd Kreis:auto:on:off
#set Beregner_05_CampeggioOben talktext Beregnung Camping oben
#set Beregner_05_CampeggioOben switch BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13
define Beregner_02_CampeggioUnten dummy
attr Beregner_02_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_02_CampeggioUnten group Beregnung
attr Beregner_02_CampeggioUnten readingList talktext,switch,Kreis
attr Beregner_02_CampeggioUnten room Beregnung
attr Beregner_02_CampeggioUnten setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_02_CampeggioUnten webCmd Kreis:auto:on:off
#set Beregner_02_CampeggioUnten talktext Beregnung Camping unten
#set Beregner_02_CampeggioUnten switch BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_03_Blauregen dummy
attr Beregner_03_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_03_Blauregen group Beregnung
attr Beregner_03_Blauregen readingList talktext,switch,Kreis
attr Beregner_03_Blauregen room Beregnung
attr Beregner_03_Blauregen setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_03_Blauregen webCmd Kreis:auto:on:off
#set Beregner_03_Blauregen talktext Beregnung Blauregen
#set Beregner_03_Blauregen switch BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
define Beregner_04_HinterKueche dummy
attr Beregner_04_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_04_HinterKueche group Beregnung
attr Beregner_04_HinterKueche readingList talktext,switch,Kreis
attr Beregner_04_HinterKueche room Beregnung
attr Beregner_04_HinterKueche setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_04_HinterKueche webCmd Kreis:auto:on:off
#set Beregner_04_HinterKueche talktext Beregnung Hinter Kueche
#set Beregner_04_HinterKueche switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
define Beregner_06_Waschhaus dummy
attr Beregner_06_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_06_Waschhaus group Beregnung
attr Beregner_06_Waschhaus readingList talktext,switch,Kreis
attr Beregner_06_Waschhaus room Beregnung
attr Beregner_06_Waschhaus setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_06_Waschhaus webCmd Kreis:auto:on:off
#set Beregner_06_Waschhaus talktext Beregnung Waschhaus
#set Beregner_06_Waschhaus switch BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16
#------------------------ Beregnung Einstellung Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat group Beregnung
attr BeregnungStartmonat room Beregnung
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat group Beregnung
attr BeregnungEndmonat room Beregnung
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer group Beregnung
attr BeregnungStandarddauer room Beregnung
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation group Beregnung
attr BeregnungStartelevation room Beregnung
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO group Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO room Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnung Logik -----------------------------#
define BeregnungDOIF_NachSonne DOIF ([myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungDOIF_NachSonne group Beregnung
attr BeregnungDOIF_NachSonne room Beregnung
define BeregnungDummy_Helper dummy
attr BeregnungDummy_Helper group Beregnung
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|0|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_01_Zitronen) \
(set BeregnungDummy_Helper Beregner_01_Zitronen) \
(set $SELF cmd_3) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten) \
(set BeregnungDummy_Helper Beregner_02_CampeggioUnten) \
(set $SELF cmd_4) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_03_Blauregen) \
(set BeregnungDummy_Helper Beregner_03_Blauregen) \
(set $SELF cmd_5) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_04_HinterKueche) \
(set BeregnungDummy_Helper Beregner_04_HinterKueche) \
(set $SELF cmd_6) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_05_CampeggioOben) \
(set BeregnungDummy_Helper Beregner_05_CampeggioOben) \
(set $SELF cmd_7) \
DOELSEIF (0) \
(set BeregnungDummy_Helper Beregner_06_Waschhaus) \
(set BeregnungDummy_Helper Beregner_06_Waschhaus) \
(set SqueezeBoxPlayer.* talk Automatik Beregnung beendet, IF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on") (set BeregnungDurchlauf_AN_AUS_AUTO off )) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
hab jetzt mal die ganze Pumpen Geschichte auf dem Testraspi eliminiert.
Aber: könntest du mir einen kleinen Hinweis geben, was das "halt" das DOIF ändern angeht? 8) .... da es das Auto noch gibt, wirds ein bißchen schwieriger.
Ich würde das "auto" weglassen und das "Vergessen des Kreises" eine Automatik (DOIF ;)) vergessen machen:
define neuesDOIF DOIF (([BeregnerDummy:Kreis]) (set BeregnerDummy auto)
Wobei ich echt nicht nachvollziehen kann, warum du das trennen willst.
... weil ich mit dem Auto plus den Kreisen die Beregner einmalig den Kreisen zuteilen kann und dann je nach Bedarf sie durch Auto inkludieren kann oder nicht. Wenn ich den jeweiligen Beregner im DropDownMenu (wo der Kreis angegeben ist) auf sozusagen "aus" (nicht einem Kreis zugeteilt) stellen müßte ... und das bei sagen wir mal 10 Kreisen mache, sitzt du danach da und weißt nicht mehr, welcher Beregner mit welchem verknüpft war. Oder verstehe ich deine Idee nicht?
habe mal weiter gespielt und folgendes gefunden:
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','Beregner_','Kreis','"Kreis1"')) {set BeregnungDummy_Helper $_}} \
{foreach (AggrDoIf('@','Beregner_','Kreis','"Kreis1"')) {set BeregnungDummy_Helper $_}} \
(set $SELF cmd_3) \
.......
das sieht vielversprechend aus, nur der Ausführungsteil ist mir in der commandref unverständlich. Gibt leider nur Beispiele mit push oder log Einträgen. Das ist das Beispiel welches ich versuche umzuarbeiten
define di_Fenster DOIF (["^Window:open"]) {foreach (AggrDoIf('@','^windows','state','"open"')) {Log3 "di_Fenster",3,"Das Fenster $_ ist noch offen"}}
mmh, ......
Edit: Tz, auf blöd rumgespielt und so gehts (keine Fehler mehr und es wird tatsächlich Kreis 1 geschaltet). Allerdings keine Ahnung, warum es so richtig ist :D ... was soll die 3 da? Warum soviele Klammern, wer hat sich Perl ausgedacht? :D
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {"di_Fenster",3,{fhem("set BeregnungDummy_Helper $_")}}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {"di_Fenster",3,{fhem("set BeregnungDummy_Helper $_")}}} \
(set $SELF cmd_3) \
EDIT: und so funktionierts auch noch und wirft nicht so viele Fehler. Und meine Frage nach der 3 und den Klammern hat sich auch relativiert. Ich bekomm hier immer mehr Spaß bei :D
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
EDIT EDIT: und so läufts komplett. Sogar ohne Wartezeiten wenn einzelne Kreise keine Teilnehmer haben, oder einige Teilnehmer eines Kreises auf Off stehen.
Da hat jemand mit BeregnungDOIF_Mapping DOIF gute Arbeit gemacht ! ;)
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|0|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_3) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_4) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_5) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_6) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_7) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set SqueezeBoxPlayer.* talk Automatik Beregnung beendet, IF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on") (set BeregnungDurchlauf_AN_AUS_AUTO off )) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
Zitat von: holle75 am 09 Mai 2017, 22:05:49sitzt du danach da und weißt nicht mehr, welcher Beregner mit welchem verknüpft war.
Aha, das kann ich nachvollziehen.
Zwar schön, dass es so funktioniert, aber jetzt bin ich dran, das nachzuvollziehen ;).
Zitat von: holle75 am 09 Mai 2017, 22:05:49Da hat jemand mit BeregnungDOIF_Mapping DOIF gute Arbeit gemacht !
Und das geht mit dem
sleep? 1 ms ist nicht viel, was ist der Unterschied zu ohne?
Ganz hohe Schule wäre, jedem Beregner den Wasserverbrauch zu hinterlegen und daraufhin nur solche automatisch zusammenzuschalten, welche die Zisternenpumpe auch schaft.
Oder ganz einfach mittels Bodenfeuchtemessern (https://forum.fhem.de/index.php/topic,70100.0.html) zu automatisieren.
Zitat von: Per am 10 Mai 2017, 08:33:36
Zwar schön, dass es so funktioniert, aber jetzt bin ich dran, das nachzuvollziehen ;).
Ich muß gestehen, dass ich auch länger gebraucht habe um zu verstehen, warum die Timings nicht verschoben sind. Also auch wenn du Kreise willkürlich verteilst mit fehlenden Kreisen dazwischen oder ohne zugeteiltem Beregner nicht die wait-Zeit trotzdem vorhanden ist. Aber hey, man darf auch mal Glück haben ;) ... deswegen meinte ich, du hast gute Arbeit mit dem Mapping DOIF gemacht :)
Zitat von: Per am 10 Mai 2017, 08:33:36
Und das geht mit dem sleep? 1 ms ist nicht viel, was ist der Unterschied zu ohne?
Ohne den Mini-sleep verhaspelt sich das DOIF in der Abarbeitung. Dann geht nix mehr ordentlich. Jedenfalls bei mir. Weiss jetzt allerdings nicht mehr, ob schon vor Umbau von den Dummies auf Homematic oder danach.
Zitat von: Per am 10 Mai 2017, 08:33:36
Ganz hohe Schule wäre, jedem Beregner den Wasserverbrauch zu hinterlegen und daraufhin nur solche automatisch zusammenzuschalten, welche die Zisternenpumpe auch schaft.
Oder ganz einfach mittels Bodenfeuchtemessern (https://forum.fhem.de/index.php/topic,70100.0.html) zu automatisieren.
Ich schau mir die Sensoren mal an. Danke
EDIT:
Ich seh gerade, das hier
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_3) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_4) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_5) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_6) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_7) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set SqueezeBoxPlayer.* talk Automatik Beregnung beendet, IF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on") (set BeregnungDurchlauf_AN_AUS_AUTO off )) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BeregnungDummy_Helper Beregner_01_Zitronen, set BeregnungDummy_Helper Beregner_02_CampeggioUnten, set BeregnungDummy_Helper Beregner_03_Blauregen, set BeregnungDummy_Helper Beregner_04_HinterKueche, set BeregnungDummy_Helper Beregner_05_CampeggioOben, set BeregnungDummy_Helper Beregner_06_Waschhaus, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
lässt sich im unteren Bereich vereinfachen:
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_3) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_4) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_5) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_6) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_7) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set SqueezeBoxPlayer.* talk Automatik Beregnung beendet, IF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on") (set BeregnungDurchlauf_AN_AUS_AUTO off )) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
{foreach (AggrDoIf('@','^Beregner_')) {fhem("set BeregnungDummy_Helper $_")}} (set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,0
stimmt dann die zusätzliche 0 hinten im wait? Wenns zwei Klammern wären ja, aber auch bei einer perl-Ausführung plus einer "normalen" Ausführung?
Zitat von: holle75 am 10 Mai 2017, 11:57:12Ich seh gerade, das hier [...] lässt sich im unteren Bereich vereinfachen
Sogar noch viel einfacher, ich wollte es nur universell haben:
set BEREGNUNG_SCHALTER_.*:FILTER=STATE!=off off
(geht auch ohne FILTER, setzt dann halt ein paar Befehle umsonst ab; evtl. musst du auch den Filter verfeinern/erweitern (Gruppe))Hast du das auch schon getestet?
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
{foreach (AggrDoIf('@','^Beregner_')) {fhem("set BeregnungDummy_Helper $_")}} (set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
Ich kenne das mit direktem Perl-Code so nicht, aber zur Not kannst du ja
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
({foreach (AggrDoIf('@','^Beregner_')) {fhem("set BeregnungDummy_Helper $_")}}) (set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
schreiben, dann passt das mit den zwei Nullen auf jeden Fall.
Zitat von: Per am 10 Mai 2017, 12:36:03
Hast du das auch schon getestet?
so, gefällts mir am besten. Schön verständlich, wie früher ;)
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
(set BEREGNUNG_SCHALTER_.*:FILTER=STATE!=off off, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
noch nicht getestet, aber sollte doch .... wieso fragst du auf STATE und nicht state ab?
Bin echt mal gespannt, welche lustigen Sonderherausforderungen dann nach dem Einbau im Homematic Umfeld auf mich zukommen. Wobei die Änderungen, glaubs, nichts mit dem eigentlichen Schalten zu tun haben.
EDIT: Hoppala, moment, so umgehe ich die Beregner_Dummies und sie werden nicht richtig gesetzt. (mit dem Filter und direkt SCHALTER schalten, kannst du einzelne Beregner über die Dummies anmachen, dann aber im AN_AUS_AUTO off drücken und die Beregner gehen aus, die Dummies sind aber noch an) ..
so gehts auch ... mit einer 0 im wait:
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
({foreach (AggrDoIf('@','^Beregner_')) {fhem("set BeregnungDummy_Helper $_")}}, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
EDITEDIT. und das Großartigste ist, dass du jetzt sogar die Reihenfolge so verändern kannst wie du möchtest. Das ist jetzt allerdings ein schöner Zufall und nicht erdacht ;)
Zitat von: holle75 am 10 Mai 2017, 13:13:37wieso fragst du auf STATE und nicht state ab?
Weil es in der CommandRef auch so steht ;). Und aus der habe ich das einfach kopiert.
Zitat von: holle75 am 10 Mai 2017, 13:13:37und die Beregner gehen aus, die Dummies sind aber noch an
Stimmt, die Abfrage, ob der Dummy auf "on" steht, fehlt :-[. Also doch nicht so einfach.
Oh neee, jetzt hab ich natürlich noch ein Kuriosum finden müssen.
Puh, hast du es im Testsystem, drinnen gerade? Falls ja, mach mal die Einstellungen wie im angehängten Bild.
Der Code gerade:
define myTwilight Twilight 43.5976 12.8648 0 712129
attr myTwilight group Beregnung
attr myTwilight room Beregnung
attr myTwilight sortby 20
attr myTwilight stateFormat Sonnenelevation aktuell: elevation
#--------------------------- FAKE DUMMIES ---------------------------------#
define BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 dummy
attr BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 room Beregnung
attr BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 webCmd on:off
define BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 dummy
attr BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 room Beregnung
attr BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 webCmd on:off
define BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 dummy
attr BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 room Beregnung
attr BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 webCmd on:off
define BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 dummy
attr BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 room Beregnung
attr BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 webCmd on:off
define BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 dummy
attr BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 room Beregnung
attr BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 webCmd on:off
define BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 dummy
attr BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 room Beregnung
attr BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 webCmd on:off
define PozzoHauptOben_PUMPE_Cisterna dummy
attr PozzoHauptOben_PUMPE_Cisterna room Beregnung
attr PozzoHauptOben_PUMPE_Cisterna webCmd on:off
#------------------------ Beregner Dummys ---------------------------#
define Beregner_01_Zitronen dummy
attr Beregner_01_Zitronen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_01_Zitronen group Beregnung
attr Beregner_01_Zitronen readingList talktext,switch,Kreis
attr Beregner_01_Zitronen room Beregnung
attr Beregner_01_Zitronen setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_01_Zitronen webCmd Kreis:auto:on:off
#set Beregner_01_Zitronen talktext Beregnung Zitronen
#set Beregner_01_Zitronen switch BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
define Beregner_05_CampeggioOben dummy
attr Beregner_05_CampeggioOben devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_05_CampeggioOben group Beregnung
attr Beregner_05_CampeggioOben readingList talktext,switch,Kreis
attr Beregner_05_CampeggioOben room Beregnung
attr Beregner_05_CampeggioOben setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_05_CampeggioOben webCmd Kreis:auto:on:off
#set Beregner_05_CampeggioOben talktext Beregnung Camping oben
#set Beregner_05_CampeggioOben switch BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13
define Beregner_02_CampeggioUnten dummy
attr Beregner_02_CampeggioUnten devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_02_CampeggioUnten group Beregnung
attr Beregner_02_CampeggioUnten readingList talktext,switch,Kreis
attr Beregner_02_CampeggioUnten room Beregnung
attr Beregner_02_CampeggioUnten setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_02_CampeggioUnten webCmd Kreis:auto:on:off
#set Beregner_02_CampeggioUnten talktext Beregnung Camping unten
#set Beregner_02_CampeggioUnten switch BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18
define Beregner_03_Blauregen dummy
attr Beregner_03_Blauregen devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_03_Blauregen group Beregnung
attr Beregner_03_Blauregen readingList talktext,switch,Kreis
attr Beregner_03_Blauregen room Beregnung
attr Beregner_03_Blauregen setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_03_Blauregen webCmd Kreis:auto:on:off
#set Beregner_03_Blauregen talktext Beregnung Blauregen
#set Beregner_03_Blauregen switch BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17
define Beregner_04_HinterKueche dummy
attr Beregner_04_HinterKueche devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_04_HinterKueche group Beregnung
attr Beregner_04_HinterKueche readingList talktext,switch,Kreis
attr Beregner_04_HinterKueche room Beregnung
attr Beregner_04_HinterKueche setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_04_HinterKueche webCmd Kreis:auto:on:off
#set Beregner_04_HinterKueche talktext Beregnung Hinter Kueche
#set Beregner_04_HinterKueche switch BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
define Beregner_06_Waschhaus dummy
attr Beregner_06_Waschhaus devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr Beregner_06_Waschhaus group Beregnung
attr Beregner_06_Waschhaus readingList talktext,switch,Kreis
attr Beregner_06_Waschhaus room Beregnung
attr Beregner_06_Waschhaus setList Kreis:Kreis1,Kreis2,Kreis3,Kreis4,Kreis5,Kreis6
attr Beregner_06_Waschhaus webCmd Kreis:auto:on:off
#set Beregner_06_Waschhaus talktext Beregnung Waschhaus
#set Beregner_06_Waschhaus switch BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16
#------------------------ Beregnung Einstellung Dummys ----------------------------#
define BeregnungStartmonat dummy
attr BeregnungStartmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungStartmonat group Beregnung
attr BeregnungStartmonat room Beregnung
attr BeregnungStartmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungStartmonat sortby 5
attr BeregnungStartmonat webCmd state
define BeregnungEndmonat dummy
attr BeregnungEndmonat eventMap Jan:1 Feb:2 Mar:3 Apr:4 Mai:5 Jun:6 Jul:7 Aug:8 Sep:9 Okt:10 Nov:11 Dez:12
attr BeregnungEndmonat group Beregnung
attr BeregnungEndmonat room Beregnung
attr BeregnungEndmonat setList state:Jan,Feb,Mar,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
attr BeregnungEndmonat sortby 6
attr BeregnungEndmonat webCmd state
define BeregnungStandarddauer dummy
attr BeregnungStandarddauer group Beregnung
attr BeregnungStandarddauer room Beregnung
attr BeregnungStandarddauer setList state:slider,1,1,60
attr BeregnungStandarddauer sortby 4
attr BeregnungStandarddauer webCmd state
define BeregnungStartelevation dummy
attr BeregnungStartelevation group Beregnung
attr BeregnungStartelevation room Beregnung
attr BeregnungStartelevation setList state:slider,1,1,30
attr BeregnungStartelevation sortby 3
attr BeregnungStartelevation webCmd state
define BeregnungDurchlauf_AN_AUS_AUTO dummy
attr BeregnungDurchlauf_AN_AUS_AUTO devStateIcon on:rc_GREEN off:rc_RED auto:rc_BLUE
attr BeregnungDurchlauf_AN_AUS_AUTO group Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO room Beregnung
attr BeregnungDurchlauf_AN_AUS_AUTO sortby 2
attr BeregnungDurchlauf_AN_AUS_AUTO webCmd auto:on:off
#------------------------- Beregnung Logik -----------------------------#
define BeregnungDOIF_NachSonne DOIF ([myTwilight:elevation] > [BeregnungStartelevation] and ($month >= [BeregnungStartmonat] and $month <= [BeregnungEndmonat])) DOELSE
attr BeregnungDOIF_NachSonne group Beregnung
attr BeregnungDOIF_NachSonne room Beregnung
define BeregnungDummy_Helper dummy
attr BeregnungDummy_Helper group Beregnung
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|0|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
define BeregnungDOIF_Trigger DOIF (["BeregnungDurchlauf_AN_AUS_AUTO:on"] or ([?BeregnungDurchlauf_AN_AUS_AUTO] eq "auto" and [BeregnungDOIF_NachSonne] eq "cmd_1")) \
() \
() \
(set SqueezeBoxPlayer.* talk Automatik Beregnung gestartet, set $SELF cmd_2) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis1"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_3) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis2"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_4) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis3"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_5) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis4"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_6) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis5"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set $SELF cmd_7) \
DOELSEIF (0) \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
{foreach (AggrDoIf('@','^Beregner_','Kreis','"Kreis6"')) {fhem("set BeregnungDummy_Helper $_")}} \
(set SqueezeBoxPlayer.* talk Automatik Beregnung beendet, IF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "on") (set BeregnungDurchlauf_AN_AUS_AUTO off )) \
DOELSEIF ([BeregnungDurchlauf_AN_AUS_AUTO] eq "off") \
({foreach (AggrDoIf('@','^Beregner_')) {fhem("set BeregnungDummy_Helper $_")}}, set SqueezeBoxPlayer.* talk Automatik Beregnung beendet)
attr BeregnungDOIF_Trigger group Beregnung
attr BeregnungDOIF_Trigger wait 0,0,0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0,[BeregnungDOIF_Mapping],0:0
#------------------------- Beregnung Pumpe Cisterna bei Bedarf on -----------------------------#
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] ne "4") \
(set $SELF manu off) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] ne "1") \
(set $SELF manu on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0") \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna devStateIcon disabled:general_aus@red:initialize initialize|initialized|cmd_2|cmd_4:general_an@yellow:disable cmd_1|cmd_3:general_an@green:disable
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna room Beregnung
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
bisher hat wirklich jede Konstellation funktioniert, nur in genau dieser hier wird Beregner_01_Zitronen einfach ignoriert. Mann, Mann wo ist denn da jetzt bitte die Logik???
EDIT: ok, Zitronen wird richtigerweise getriggert, aber sofort wieder ausgeschaltet. Hab ich irgendwas in den waits, resp deiner verrückten Übernahme des waits aus mappingDOIF verbaselt?
EDITEDIT: Der verbaselt sich im MappingDOIF. Das war ja auch schon früher der Fall, konnte man bis jetzt aber mit dem Pseudo-Sleep abfangen. Deutlich sieht man es, wenn man mal die waits auf zb 5 sekunden stellt. Zum Teil (eben bei der Zitronen Konstellation kommt das off vor dem on und sonstige Schönheiten ... die auch immer mal anders ausfallen können). Ich glaube, deswegen hat dann auch der Umbau auf Homematic soviele Probleme bereitet. Da kommen so viele Events auf einmal, dass Mapping DOIF "nicht nachkommt", "nicht weiß was nehmen soll"?! :)
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|5|5
Mmh, Per, wie kann man das "entprellen"? Idee?
Kurzer Schuss ins Blaue (oder sogar ins Schwarze?): Dadurch, dass "Beregner_02_CampeggioUnten" off und (wie "Zitronen" "Kreis2") ist, wird der Timer auf 0 gesetzt, damit aber leider auch "Zitronen" beendet. Bisher war jeder Regner nur für seine Zeit zuständig, jetzt der letzte für den ganzen Kreis. Vllt. "einfach" die Aggregatsfunktion erweitern auf "status" eq "auto" (weiss nicht, ob das geht). Aber wie ich
Damian kenne, geht das (und sei es erst morgen ;)).
Oder BeregnungDOIF_Mapping dahingehend anpassen, dass ein Nicht-Auto nach Start und Ende unterschiedlich (state) behandelt wird:
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|[$self]|0|0
Zitat von: holle75 am 10 Mai 2017, 18:05:07Puh, hast du es im Testsystem, drinnen gerade?
Welches Testsystem? Ich mach das am "offenen Herzen" ;D. Mit
include test.cfg
wird das reingenommen, nach Reboot ist das wieder spurlos (außer ein paar einmaligen Fehlermeldungen) verschwunden.
Zitat von: holle75 am 10 Mai 2017, 18:05:07EDITEDIT: Der verbaselt sich im MappingDOIF. Das war ja auch schon früher der Fall, konnte man bis jetzt aber mit dem Pseudo-Sleep abfangen. Deutlich sieht man es, wenn man mal die waits auf zb 5 sekunden stellt. Zum Teil (eben bei der Zitronen Konstellation kommt das off vor dem on und sonstige Schönheiten ... die auch immer mal anders ausfallen können). Ich glaube, deswegen hat dann auch der Umbau auf Homematic soviele Probleme bereitet. Da kommen so viele Events auf einmal, dass Mapping DOIF "nicht nachkommt", "nicht weiß was nehmen soll"?! :)
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|5|5
Mmh, Per, wie kann man das "entprellen"? Idee?
Pflege erstmal oben das ein. Die 5|5 kannst du machen, ich glaube aber nicht, dass du damit was änderst.
DOIF (wie auch
notify) gehen in der Reihenfolge vor, wie es auch im EventLog zu finden ist.
Zitat von: Per am 10 Mai 2017, 21:21:42
Kurzer Schuss ins Blaue (oder sogar ins Schwarze?): Dadurch, dass "Beregner_02_CampeggioUnten" off und (wie "Zitronen" "Kreis2") ist, wird der Timer auf 0 gesetzt, damit aber leider auch "Zitronen" beendet. Bisher war jeder Regner nur für seine Zeit zuständig, jetzt der letzte für den ganzen Kreis. Vllt. "einfach" die Aggregatsfunktion erweitern auf "status" eq "auto" (weiss nicht, ob das geht). Aber wie ich Damian kenne, geht das (und sei es erst morgen ;)).
Das macht irgendwie mehr Sinn als meine Erklärung dass das DOIF in den events rumstochert :D ... man fängt halt klein an :P
und den state in die Aggregatsfunktion zu nehmen kam mir auch schon kurz .... und wegen fehlendem knowhow auch wieder ganz schnell vergessen.... und nicht weiterverfolgt weil ich ja ans Gestochere glaubte.... und das wäre der sauberste Weg.
Zitat von: Per am 10 Mai 2017, 21:21:42
Oder BeregnungDOIF_Mapping dahingehend anpassen, dass ein Nicht-Auto nach Start und Ende unterschiedlich (state) behandelt wird:
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off) \
DOELSEIF ([BeregnungDummy_Helper])
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|[$self]|0|0
... aber machst du so nicht auch "an" wenn state nicht auto ist ? ... wenn auch nur für eine Millisekunde? Denke, das würden die echten Schalter nicht so gerne öfter mögen.
Zitat von: Per am 10 Mai 2017, 21:21:42
wird das reingenommen, nach Reboot ist das wieder spurlos (außer ein paar einmaligen Fehlermeldungen) verschwunden.
Mmh, gut zu wissen.
Zitat von: Per am 10 Mai 2017, 21:21:42
Pflege erstmal oben das ein. Die 5|5 kannst du machen, ich glaube aber nicht, dass du damit was änderst. DOIF (wie auch notify) gehen in der Reihenfolge vor, wie es auch im EventLog zu finden ist.
Die 5|5 war nur ein Vorschlag um zu sehen wie "komisch" sich Mapping DOIF verhält, nicht als Fix gedacht. Die Reihenfolgen Info ist top. Und auch sinnig. Und widerlegt meine Gestocher-Theorie um so deutlicher.
Zitat von: holle75 am 10 Mai 2017, 23:55:25... aber machst du so nicht auch "an" wenn state nicht auto ist ? ... wenn auch nur für eine Millisekunde?
Ja, wollte nur sehen, ob du um diese Zeit noch aufpasst :D
Ist der übliche C&P-Fehler. dort kommt eine leere Klammer oder dein Sleep rein, mehr nicht.
Evtl. kann auch das letzte DOELSEIF gelöscht werden, außer einem EventLog-Eintrag macht das ja nix effektiv. Weiss auch nicht mehr, wofür das mal gedacht war.
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
() \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off)
attr BeregnungDOIF_Mapping cmdState [$self]|[$self]|[$self]|60*[BeregnungStandarddauer]|[$self]|0
attr BeregnungDOIF_Mapping do always
attr BeregnungDOIF_Mapping group Beregnung
so lässt er Zitronen immer noch aus. Vielleicht lag ich ja mit meinem Gestochere doch nicht so falsch :'(
so sieht ein Durchgang im eventlog aus mit Filter .*BEREGNUNG.*
2017-05-11 15:43:52 dummy BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 on
2017-05-11 15:44:52 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 11.05.2017 15:45:02 cmd_4 BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16
2017-05-11 15:44:52 dummy BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 off
2017-05-11 15:44:52 dummy BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-05-11 15:44:52 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 11.05.2017 15:45:02 cmd_4 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
2017-05-11 15:44:52 dummy BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off
2017-05-11 15:44:52 dummy BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 on
2017-05-11 15:45:52 DOIF BeregnungDOIF_PumpeCisterna wait_timer: 11.05.2017 15:46:02 cmd_4 BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
2017-05-11 15:45:52 dummy BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 off
2017-05-11 15:46:02 DOIF BeregnungDOIF_PumpeCisterna cmd_event: BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15
immer noch Zitronen an und sofort wieder aus.
Muss $self nicht $SELF heissen?
Das ist von dir ;) .... aber auch in Groß wird Zitronen übersprungen. Gerade probiert
NEIN, jetzt gehts doch! ... hab mich mit dem wait verbaselt. So gehts (gerade ;) )
define BeregnungDOIF_Mapping DOIF (["^Beregner_:^on$"]) \
(sleep 0.001;;set [$DEVICE:switch] on, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] gestartet) \
DOELSEIF (["^Beregner_:^off$"]) \
(sleep 0.001;;set [$DEVICE:switch] off, sleep 0.001;;set SqueezeBoxPlayer.* talk [$DEVICE:talktext] beendet) \
DOELSEIF (["^Beregner_:^auto$"]) \
(sleep 0.001;;set [$DEVICE:switch] off) \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto" and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
(sleep 0.001;;set [$EVENT:switch] on) \
DOELSEIF ([BeregnungDummy_Helper] and [?BeregnungDOIF_Trigger:cmd_seqnr] eq "2") \
() \
DOELSEIF ([BeregnungDummy_Helper] and [?$EVENT] eq "auto") \
(sleep 0.001;;set [$EVENT:switch] off)
attr BeregnungDOIF_Mapping cmdState [$SELF]|[$SELF]|[$SELF]|60*[BeregnungStandarddauer]|[$SELF]|0
Sieht gut aus. Yes .... Danke, Per.
jetzt würde ich das gerne die Tage am Anfang zusammenschreiben damit auch andere was davon haben.
Aber eine kleine Sache habe ich noch. Im Laufe der Tests habe ich ja, wie du auch, alle Schalter gegen Dummies getauscht.
Die PozzoPumpen Automatik funktioniert mit meinem Homematic Schalter im Betriebssetup prima. Mit einem Dummy nicht.
Die Laufzeit wird nicht berechnet. Die Pozzo Automatik habe ich noch ein wenig erweitert, so dass sie auch läuft, wenn die Beregnung an ist und dann Mittags nochmal schaut ob insgesamt 30 Minuten gelaufen wurde. Wenn nicht substituiert sie die Differenz.
Der Code ist gerade so:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([13:00-16:00] and [Xtender_AC_out] < 1200 and [?$SELF:Laufzeit] < 1800) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [Xtender_AC_out] < 1200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and ([$SELF:cmd_seqnr] eq "1" or [$SELF:cmd] eq "2")) \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out] > 2100 and ([$SELF:cmd_seqnr] eq "1" or [$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])},set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF devStateIcon disabled:general_aus@red:initialize initialize|initialized|cmd_1|cmd_1_2|cmd_3|cmd_4|cmd_5:general_an@yellow:disable cmd_1_1|cmd_2:general_an@green:disable
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit
attr PozzoHauptOben_PUMPE_PozzoDOIF room Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,1800-[$SELF:Laufzeit]:60:0:0:0
#set PozzoHauptOben_PUMPE_PozzoDOIF Laufzeit 0
aber mit einem Dummy
define Xtender_AC_out dummy
attr Xtender_AC_out room Beregnung
attr Xtender_AC_out setList state:slider,0,200,2400
attr Xtender_AC_out webCmd state
wird die Laufzeit nicht mehr Berechnet. Mir könnte es ja wurscht sein, aber so ein fertig importierbarer Code zum spielen und testen für andere, der auch komplett funktioniert wär schon was ;)
(set PozzoHauptOben_PUMPE_Pozzo off,set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])})
sec sollte immer 0 sein, weil du gerade die Pumpe geschaltet hast. Eine echte Pumpe hat da vllt. etwas "Reaktionszeit", beim Dummy solltest du wahrscheinlich die Reihenfolge umdrehen:
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])},set PozzoHauptOben_PUMPE_Pozzo off)
probier ich, oben im Code schon geändert, nicht wundern. Hab gepennt
Genau das wars.
Trotzdem gerade überlegt, dass ich die PozzoPumpe rauslass. Wer hat schon zwei Pumpen. Machts nur komplizierter
Bennene sie doch Prozzo-Pumpe ;).
Mich würde schonmal das "Gesamtkunstwerk" in echt interessieren, die Namen der Devices machen neugierig...
Mußt du halt mal beim nächsten Italien-Urlaub vorbeikommen! Sehr nett hier. Hippie-See-Idylle meets Hardcoreautomation mit allen Bubenspielereien dies so braucht. Vom Trecker bis zur Solaranlage, Seecontainer, Motorsägen :D :D .... Da hättest du Freude bei .... aber nicht den Twilight Koordinaten folgen, die sind "abgeändert" :D
Zitat von: holle75 am 11 Mai 2017, 22:17:29Mußt du halt mal beim nächsten Italien-Urlaub vorbeikommen!
Ist das ne Einladung? ;D. Wäre mein erster Italien-Aufenthalt.
Klar ist das ne Einladung. Und wenn du noch nicht in Italien warst dringend überfällig! Ist halt im Moment noch ein wenig baustellig :D ... aber wenn ein Camper oder Zelt dir zu unkommod ist, es gibt zum Schlafen hier rundrum ein paar nette Agriturismi.... oder du wartest noch ein Jahr, dann sollte fertig sein.
Zitat von: holle75 am 12 Mai 2017, 12:32:14ein Camper
Bin selbst Camper (3x Esterel ;)), will sogar den Großen "verFHEMen" ;D ;D ;D.
wie jetzt? Camper und nicht regelmäßig in IT? Na dann auf bald!
Per, habe das ganze noch ein wenig aufgebohrt und bin im Teststadium. Läuft ganz nett, nur meine Tiefenpumpe macht komische Sachen :)
Problem, sie schaltet sich beim Kreiswechsel zwischendurch ab.
Das ist der Beregnungs Log
2017-07-10_08:48:47 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-07-10_08:48:47 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on
2017-07-10_08:48:47 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 on
2017-07-10_08:48:47 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 on
2017-07-10_08:48:47 PozzoHauptOben_PUMPE_Cisterna on
2017-07-10_08:48:47 PozzoHauptOben_PUMPE_Pozzo on
2017-07-10_08:58:42 PozzoHauptOben_PUMPE_Cisterna on << addLog
2017-07-10_09:18:47 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off
2017-07-10_09:18:47 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off
2017-07-10_09:18:47 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off
2017-07-10_09:18:47 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 off
2017-07-10_09:18:47 BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 on
2017-07-10_09:18:47 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-07-10_09:19:07 PozzoHauptOben_PUMPE_Pozzo off
2017-07-10_09:19:15 PozzoHauptOben_PUMPE_Pozzo on
2017-07-10_09:28:42 PozzoHauptOben_PUMPE_Cisterna on << addLog
2017-07-10_09:48:47 BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 off
2017-07-10_09:48:47 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off
2017-07-10_09:48:47 BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 on
2017-07-10_09:48:47 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 on
2017-07-10_09:48:47 PozzoHauptOben_PUMPE_Pozzo on
2017-07-10_09:49:07 PozzoHauptOben_PUMPE_Pozzo off
2017-07-10_09:49:16 PozzoHauptOben_PUMPE_Pozzo on
2017-07-10_09:58:42 PozzoHauptOben_PUMPE_Cisterna on << addLog
2017-07-10_10:18:47 BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 off
2017-07-10_10:18:47 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 off
2017-07-10_10:18:47 BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 on
2017-07-10_10:18:48 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on
2017-07-10_10:19:07 PozzoHauptOben_PUMPE_Pozzo off
2017-07-10_10:19:18 PozzoHauptOben_PUMPE_Pozzo on
2017-07-10_10:28:42 PozzoHauptOben_PUMPE_Cisterna on << addLog
2017-07-10_10:48:48 BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 off
2017-07-10_10:48:48 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off
2017-07-10_10:48:58 PozzoHauptOben_PUMPE_Cisterna off
2017-07-10_10:49:08 PozzoHauptOben_PUMPE_Pozzo off
und das die fhem.cfg für die Pumpe
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 7200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [Xtender_AC_out:Power__W:d] < 1200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [$SELF:cmd] eq "2") \
(sleep 20;;set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([$SELF:cmd_seqnr] eq "1" or [$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1:general_an@yellow:disable cmd_1_2:general_an@yellow:disable cmd_3:general_an@yellow:disable cmd_4:general_an@yellow:disable cmd_5:general_an@yellow:disable cmd_1_1:general_an@green:disable cmd_2:general_an@green:disable
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit mitBeregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF room System
attr PozzoHauptOben_PUMPE_PozzoDOIF setList mitBeregnung:mit_Beregnung,Mittags
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,7200-[$SELF:Laufzeit]:0:0:15:0
attr PozzoHauptOben_PUMPE_PozzoDOIF webCmd mitBeregnung
ich glaube das Problem ist, dass ja alle Beregner erstmal an, aber dann auch alle off geschaltet werden .... im selben Moment der nächste Kreis on geschaltet wird. Heißt aber, dass es einen Moment mit allen off gibt. Das scheint cmd 3 zu triggern. Dann dachte ich, vezögere ich halt den Befehl im Ausführungsteil von cmd 3, dass der DOELSEIF Fall im cmd 2 dann cmd 3 abbricht. Scheinbar macht er das nicht. Ich frage mich, warum? Glaube, Xtender_AC_out:Power__W, von cmd 2 triggert dann erst, wenn cmd 3 abgearbeitet ist. Davon ausgehend, dass [#"^BEREGNUNG_SCHALTER_":state:"^on$"] nur abgearbeitet wird, wenn ein anderes Device den DO-Fall triggert?
Idee?
Zitat von: holle75 am 10 Juli 2017, 11:48:23Ich frage mich, warum?
Weil
(sleep 20;;set $SELF cmd_4)
ein Mini-
at ergibt, welches unabhängig vom
DOIF arbeitet, wenn es einmal angestartet wurde.
Vorteil: es geht auch mit
set xxx cmd_3Nachteil: es geht nicht weg, wenn
DOIF umschaltet
Stell doch mal auf
wait um.
ich schau mal, was morgen passiert. Wenn ich mich recht erinnere, hatte ich es mit wait probiert, mit ähnlichem Ergebnis. Kann aber auch sein, dass ich das wait für den Fall nicht lange genug gewählt hatte. Ich schau. Danke dir.
(fast) selbes Ergebnis:
beregnung log
017-07-11_08:48:50 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-07-11_08:48:50 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on
2017-07-11_08:48:50 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 on
2017-07-11_08:48:50 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 on
2017-07-11_08:48:50 PozzoHauptOben_PUMPE_Cisterna on
2017-07-11_08:48:50 PozzoHauptOben_PUMPE_Pozzo on
2017-07-11_09:08:43 PozzoHauptOben_PUMPE_Cisterna on << addLog
2017-07-11_09:18:50 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off
2017-07-11_09:18:51 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off
2017-07-11_09:18:51 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off
2017-07-11_09:18:51 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 off
2017-07-11_09:18:51 BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 on
2017-07-11_09:18:51 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-07-11_09:19:36 PozzoHauptOben_PUMPE_Pozzo off
2017-07-11_09:19:46 PozzoHauptOben_PUMPE_Pozzo on
jetzt mit
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 7200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [Xtender_AC_out:Power__W:d] < 1200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([$SELF:cmd_seqnr] eq "1" or [$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1:general_an@yellow:disable cmd_1_2:general_an@yellow:disable cmd_3:general_an@yellow:disable cmd_4:general_an@yellow:disable cmd_5:general_an@yellow:disable cmd_1_1:general_an@green:disable cmd_2:general_an@green:disable
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit mitBeregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF room System
attr PozzoHauptOben_PUMPE_PozzoDOIF setList mitBeregnung:mit_Beregnung,Mittags
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,7200-[$SELF:Laufzeit]:0:45:0:0
attr PozzoHauptOben_PUMPE_PozzoDOIF webCmd mitBeregnung
#set PozzoHauptOben_PUMPE_PozzoDOIF Laufzeit 0
sleep raus, wait rein
2017-07-14_17:46:16 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-07-14_17:46:16 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on
2017-07-14_17:46:16 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 on
2017-07-14_17:46:16 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 on
2017-07-14_17:46:16 PozzoHauptOben_PUMPE_Pozzo on
2017-07-14_17:56:17 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off
2017-07-14_17:56:17 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off
2017-07-14_17:56:17 BEREGNUNG_SCHALTER_Blauregen_12_7_MEQ0064131_17 off
2017-07-14_17:56:17 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 off
2017-07-14_17:56:17 BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 on
2017-07-14_17:56:17 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 on
2017-07-14_18:06:17 BEREGNUNG_SCHALTER_HinterKueche_12_7_MEQ0064131_15 off
2017-07-14_18:06:17 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14 off
2017-07-14_18:06:17 BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 on
2017-07-14_18:06:17 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 on
2017-07-14_18:10:17 PozzoHauptOben_PUMPE_Pozzo off
2017-07-14_18:10:24 PozzoHauptOben_PUMPE_Pozzo on
2017-07-14_18:16:17 BEREGNUNG_SCHALTER_Waschhaus_12_7_MEQ0064131_16 off
2017-07-14_18:16:17 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04 off
2017-07-14_18:16:17 BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 on
2017-07-14_18:16:17 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 on
2017-07-14_18:20:17 PozzoHauptOben_PUMPE_Pozzo off
2017-07-14_18:20:25 PozzoHauptOben_PUMPE_Pozzo on
2017-07-14_18:26:17 BEREGNUNG_SCHALTER_CampeggioOben_12_7_MEQ0064131_13 off
2017-07-14_18:26:17 BEREGNUNG_SCHALTER_CampeggioUnten_12_7_MEQ0064131_18 off
2017-07-14_18:30:17 PozzoHauptOben_PUMPE_Pozzo off
wait habe ich jetzt mal übetrieben auf 4 Min. gesetzt. Wieso wird das wait komplett durchgeführt obwohl ein anderer DOIF-Fall definitiv eingetreten ist? ... und wieso tritt dann der DOIF-Fall eben doch nach Ablauf des waits ein?
das wait sollte doch "überschrieben" werden?
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 7200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [Xtender_AC_out:Power__W:d] < 1200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([$SELF:cmd_seqnr] eq "1" or [$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1:general_an@yellow:disable cmd_1_2:general_an@yellow:disable cmd_3:general_an@yellow:disable cmd_4:general_an@yellow:disable cmd_5:general_an@yellow:disable cmd_1_1:general_an@green:disable cmd_2:general_an@green:disable
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit mitBeregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF room System
attr PozzoHauptOben_PUMPE_PozzoDOIF setList mitBeregnung:mit_Beregnung,Mittags
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,7200-[$SELF:Laufzeit]:0:240:0:0
attr PozzoHauptOben_PUMPE_PozzoDOIF webCmd mitBeregnung
#set PozzoHauptOben_PUMPE_PozzoDOIF Laufzeit 0
Stimmt, da war noch was. Muss mir dazu aber nochmal den Thread durchlesen, um zu wissen, was ich mir damals dabei gedacht hatte.
... kam dir der Gedanke noch?
Was mir als erstes auffällt: in Bedingung 3 und 4 wird abgefragt, ob $SELF:cmd(_seqnr) 1 bzw 2 ist. Aber triggernd, nicht mit "?". Muss das so? Darf eigentlich nicht, da attr selftrigger nicht aktiviert ist (was wiederum richtig ist).
Weiss aber nicht, wie sich das auswirkt, ob die Abfrage dennoch stattfindet, wenn auch nicht triggern, dazu kenne ich DOIF viel zu wenig. Aber mit den "?" machst du nix falsch.
Kannst du den status des "PozzoHauptOben_PUMPE_PozzoDOIF" mit loggen?
Für lists werden die Zeiten nicht reichen.
Leider, wie immer, ein sehr guter Punkt von dir mit dem ? ..... das könnte das Problem sein. Ich probiere und berichte.... man ist aber auch manchmal blind.
probiert. Das löst nicht das Problem. Ist aber trotzdem richtig. Ich mach jetzt mal ein eigenes DOIF für die Beregner.
selbst wenn ich den Part
[#"^BEREGNUNG_SCHALTER_":state:"^on$"]
in ein anderes DOIF lege und dann über eine "Variable" abfrage, also den Trigger aus PozzoHauptOben_PUMPE_PozzoDOIF rausnehme, macht er, trotz jetzt den Fragezeichen, den selben Mist. Ich logge jetzt mal den status mit
2017-07-19_08:53:43 PozzoHauptOben_PUMPE_PozzoDOIF wait_timer: 19.07.2017 08:53:45 cmd_2 BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
2017-07-19_08:53:45 PozzoHauptOben_PUMPE_PozzoDOIF wait_timer: no timer
2017-07-19_08:53:45 PozzoHauptOben_PUMPE_PozzoDOIF cmd_nr: 2
2017-07-19_08:53:45 PozzoHauptOben_PUMPE_PozzoDOIF cmd: 2
2017-07-19_08:53:45 PozzoHauptOben_PUMPE_PozzoDOIF cmd_event: BEREGNUNG_SCHALTER_Zitronen_12_7_MEQ0064131_14
2017-07-19_08:53:45 PozzoHauptOben_PUMPE_PozzoDOIF cmd_2
2017-07-19_09:23:43 PozzoHauptOben_PUMPE_PozzoDOIF wait_timer: 19.07.2017 09:23:53 cmd_3 BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF wait_timer: no timer
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF Laufzeit: 1808
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd_nr: 4
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd: 4
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd_event: set_cmd_4
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd_4
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd_nr: 3
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd: 3
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd_event: BEREGNUNG_SCHALTER_ZirkusUnten_2_2_MEQ0726012_04
2017-07-19_09:23:53 PozzoHauptOben_PUMPE_PozzoDOIF cmd_3
2017-07-19_09:23:57 PozzoHauptOben_PUMPE_PozzoDOIF wait_timer: 19.07.2017 09:23:59 cmd_2 Xtender_AC_out
2017-07-19_09:23:59 PozzoHauptOben_PUMPE_PozzoDOIF wait_timer: no timer
2017-07-19_09:23:59 PozzoHauptOben_PUMPE_PozzoDOIF cmd_nr: 2
2017-07-19_09:23:59 PozzoHauptOben_PUMPE_PozzoDOIF cmd: 2
2017-07-19_09:23:59 PozzoHauptOben_PUMPE_PozzoDOIF cmd_event: Xtender_AC_out
2017-07-19_09:23:59 PozzoHauptOben_PUMPE_PozzoDOIF cmd_2
log für einmal Beregner-Kreis umschalten. Und so geht es dann immer.
DOIF
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 7200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [Xtender_AC_out:Power__W:d] < 1200) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_1:general_an@yellow:disable cmd_1_2:general_an@yellow:disable cmd_3:general_an@yellow:disable cmd_4:general_an@yellow:disable cmd_5:general_an@yellow:disable cmd_1_1:general_an@green:disable cmd_2:general_an@green:disable
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit mitBeregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF room System
attr PozzoHauptOben_PUMPE_PozzoDOIF setList mitBeregnung:mit_Beregnung,Mittags
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,7200-[$SELF:Laufzeit]:2:10:0:0
attr PozzoHauptOben_PUMPE_PozzoDOIF webCmd mitBeregnung
#set PozzoHauptOben_PUMPE_PozzoDOIF Laufzeit 0
was wahrscheinlich reinspielt, ist, dass ich mehrere Kreise gleichzeitig laufen lasse. Somit auch beim Kreiswechsel mehrere Beregner sowohl on als auch off geschaltet werden (im Log sieht man nur den ersten/letzten?). Im Moment wird cmd 3 komplett ausgeführt (weil vielleicht der letzte Beregner in der Abarbeitung off geht?) und dann triggert Xtender_AC_out (Abfrageintervall 10sek) wieder cmd 2. so entsteht die Pause. Aber was ich dann nicht verstehe: Selbst wenn ich das wait auf zb 4 Minuten stelle sollte Xtender_AC_out innerhalb der 10 sek. cmd 2 triggern und das wait für cmd 3 überschreiben. Wieso passiert das nicht? Wieso wird das wait für cmd 3 komplett ausgeführt und dann darf Xtender_AC_out erst triggern?
edit: Das DOIF für die cisterna läuft sauber durch.
define BeregnungDOIF_PumpeCisterna DOIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" or [?$SELF:manu] eq "on") \
(set PozzoHauptOben_PUMPE_Cisterna on) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^off$"] and [?$SELF:cmd] ne "4") \
(set $SELF manu off) \
DOELSEIF (["^PozzoHauptOben_PUMPE_Cisterna$:^on$"] and [?$SELF:cmd] ne "1") \
(set $SELF manu on) \
DOELSEIF ([#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0") \
(set PozzoHauptOben_PUMPE_Cisterna off)
attr BeregnungDOIF_PumpeCisterna devStateIcon disabled:general_aus@red:initialize initialize:general_an@yellow:disable initialized:general_an@yellow:disable cmd_2:general_an@yellow:disable cmd_4:general_an@yellow:disable cmd_1:general_an@green:disable cmd_3:general_an@green:disable
attr BeregnungDOIF_PumpeCisterna group Beregnung
attr BeregnungDOIF_PumpeCisterna readingList manu
attr BeregnungDOIF_PumpeCisterna room System
attr BeregnungDOIF_PumpeCisterna wait 0:0:0:10
Ändere doch die zweite Bedingung mal in:
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and ?[Xtender_AC_out:Power__W:d] < 1200)
Ich habe den Eindruck, dass ist ein "außenliegendes" Problem, die Leistung des Xtender_AC_out geht natürlich hoch, wenn Pumpen aus- und runter, wenn sie angehen. Du willst aber den Moment, bevor sie geschaltet werden.
Im ersten Fall scheint es aber beabsichtigt zu sein, wobei es da bestimmt auch noch zu Seiteneffekten kommen kann. Aber zumindest hat der hier nicht reingegrätscht.
Die Timer hat schön gearbeitet, nachdem er die Trigger bekommen hat. Da sehe ich keinen Fehler.
Du könntest mal noch den Zähler # mitloggen (über attr cmdState oder attr status oder so.)
so ist doch die zweite Bedingung?
Aber guter Punkt!
Klar, das erklärt, warum cmd 2 erst wieder getriggert werden kann, nachdem die Pozzopumpe ausgeschaltet wird und der Stromverbrauch unter 1200 W sinkt. Somit kann auch das wait nicht vorher überschrieben werden.
Ich bin ganz anfänglich davon ausgegangen, dass NUR EINMAL die Beregner cmd 2 auslösen und dann am Ende cmd 3..... und habe darüber, dass das ja mehrmals geschieht dann im Problemfinden gar nicht weiter nachgedacht.
mmh, aber wie erreiche ich dann die Funktionalität, dass er bei mehr als 2500W die Pozzopumpe abschaltet, aber bei unter 1200W wieder einschaltet?
Zitat von: holle75 am 19 Juli 2017, 12:20:23mmh, aber wie erreiche ich dann die Funktionalität, dass er bei mehr als 2500W die Pozzopumpe abschaltet, aber bei unter 1200W wieder einschaltet?
Kann es sein, dass beim Ein-/Ausschalten die Werte überschwingen?
Kannst du die gewünschte (!) Funktion dieses
DOIF mal als Textaufgabe schreiben? Manchmal findet man (ich!) Fehler, wenn man versucht, einem GGüber das Erdachte zu erklären.
überschwingen (Anlauf Pumpen) tun die Werte nicht, da der Zähler nur alle 10 sekunden gelesen wird und die Werte mit ausreichend Spatz gewählt sind. Habe jetzt nochmal cmd 1 "abgesichert" und aus cmd 2 den Stromzähler rausgenommen. Nicht probiert, aber die Logik des Problems habe ich jetzt erkannt. Am Strom sollte es gelegen haben.
so siehts aus:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 9000 and [?$SELF:cmd] ne "2" and [?$SELF:cmd] ne "3") \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0") \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF group Beregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF readingList Laufzeit mitBeregnung
attr PozzoHauptOben_PUMPE_PozzoDOIF room System
attr PozzoHauptOben_PUMPE_PozzoDOIF setList mitBeregnung:mit_Beregnung,Mittags
attr PozzoHauptOben_PUMPE_PozzoDOIF sortby 7
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,9000-[$SELF:Laufzeit]:2:10:0:0
attr PozzoHauptOben_PUMPE_PozzoDOIF webCmd mitBeregnung
was ich erreichen möchte:
- zwischen 12:30 und 14:00 soll die Zisterne gefüllt werden (wenn die Pumpe nicht schon mit den Beregnern lief, resp die verbleibende Zeit soll gelaufen werden). Hier kann ich wählen (var mitBeregnung), ob die Pumpe mit den Beregnern läuft, oder generell erst Mittags.
- wenn die Beregner laufen (und ich das wünsche ... var mitBeregnung) soll PozzoPumpe laufen.
- wenn die Beregner stehen, soll PozzoPumpe stehen (bis zum Mittag ... Restlaufzeit).
- egal ob Mittags oder mit den Beregnern, soll die Pumpe ausgehen, wenn der Stromverbrauch über 2500W (inkl Pumpe) liegt und wieder loslaufen, wenn der Stromverbrauch (dann ohne Pumpe) unter 1200W liegt.
Zitat von: holle75 am 19 Juli 2017, 13:25:18- egal ob Mittags oder mit den Beregnern, soll die Pumpe ausgehen, wenn der Stromverbrauch über 2500W (inkl Pumpe) liegt und wieder loslaufen, wenn der Stromverbrauch (dann ohne Pumpe) unter 1200W liegt.
Soll sie Mittag oder mit den Pumpen angehen, wenn der Verbrauch zwischen 1200W und (2500-Pumpe)W liegt?
Ich bin mal von Loslaufen ausgegangen:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([12:30-14:00] and [?$SELF:Laufzeit] < 9000 and (([?$SELF:cmd] ne "1" and [Xtender_AC_out:Power__W:d] < 2000) or ([Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_1) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and (([?$SELF:cmd] ne "1" and [Xtender_AC_out:Power__W:d] < 2000) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "3") \
(set $SELF cmd_1) \
DOELSEIF ([Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:cmd] eq "1") \
()
Wenn myreading (https://forum.fhem.de/index.php/topic,71000.0.html) freigeschaltet wird oder du dir die Beta runter lädst, kannst du auch vereinfachen:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([12:30-14:00] and [?$SELF:Laufzeit] < 9000 and [$SELF:sperre]) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_1) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and [$SELF:sperre]) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "3") \
(set $SELF cmd_1) \
DOELSEIF ([Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:cmd] eq "1") \
()
attr PozzoHauptOben_PUMPE_PozzoDOIF sperre:(([?$SELF:cmd] ne "1" and [Xtender_AC_out:Power__W:d] < 2000) or [Xtender_AC_out:Power__W:d] < 1200)
Dazu bei beiden
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 0:180,9000-[$SELF:Laufzeit]:2:10:180
Die 2000 sind mal (2500 - Pumpe) mit Pumpe = 500W angenommen.
Klammern und Sonderzeichen sind nochmal zu prüfen, da ich unterwegs bin und keinen Zugriff auf eine Fhem-Oberfläche habe.
ein paar Fragen ;)
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
müßte ich noch gegen ein falsches Berechnen der Laufzeit absichern. Darf also nur eintreten, wenn das DOIF die Pumpe anmacht, sonst würde das überschreiten von 2500W (außerhalb) immer eine neue Laufzeit berechnen.
Die PozzoPumpe zieht ca 1000W, deswegen die Schwellen bei unter 1200W (~ 1000W Grundverbrauch inkl. Zisternenpumpe) und 2500W wenn die PozzoPumpe dazu kommt.
GanzGanz verstehe ich die Zusammenhänge jetzt nicht, aber ich probiere es mal so:
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "3")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([12:30-14:00] and [?$SELF:Laufzeit] < 9000 and (([?$SELF:cmd] ne "1" and [Xtender_AC_out:Power__W:d] < 2500) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_1) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and (([?$SELF:cmd] ne "1" and [Xtender_AC_out:Power__W:d] < 2500) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "3") \
(set $SELF cmd_1) \
DOELSEIF ([Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:cmd] eq "1") \
() \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 0:180,9000-[$SELF:Laufzeit]:2:10:180:0
Was hängen denn noch für Verbraucher dran?
Die tägliche Rücksetzung hatte ich vergessen :-[
Ich habe jetzt mal deine Idee aufgegriffen und in "mein" DOIF reingebastelt. So verstehe ich es wenigstens ganz. Obs richtig ist ....
define PozzoHauptOben_PUMPE_PozzoDOIF DOIF ([12:30-14:00] and [Xtender_AC_out:Power__W:d] < 1200 and [?$SELF:Laufzeit] < 9000 and [?$SELF:cmd] ne "2") \
(set PozzoHauptOben_PUMPE_Pozzo on) \
(set $SELF cmd_4) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] ne "0" and (([?$SELF:cmd] ne "4" and [Xtender_AC_out:Power__W:d] < 2500) or [Xtender_AC_out:Power__W:d] < 1200)) \
(set PozzoHauptOben_PUMPE_Pozzo on) \
DOELSEIF ([?$SELF:mitBeregnung] eq "mit_Beregnung" and [#"^BEREGNUNG_SCHALTER_":state:"^on$"] eq "0" and [?$SELF:cmd] eq "2") \
(set $SELF cmd_4) \
DOELSEIF ([Xtender_AC_out:Power__W:d] > 2500 and ([?$SELF:cmd_seqnr] eq "1" or [?$SELF:cmd] eq "2")) \
(set $SELF Laufzeit {([$SELF:Laufzeit] + [PozzoHauptOben_PUMPE_Pozzo:state:sec])}, set PozzoHauptOben_PUMPE_Pozzo off) \
DOELSEIF ([04:00]) (set $SELF Laufzeit 0)
attr PozzoHauptOben_PUMPE_PozzoDOIF wait 180,9000-[$SELF:Laufzeit]:2:10:0:0
... und teste. Falls dir was auffällt, lass wissen.
Zitat von: holle75 am 19 Juli 2017, 19:50:06und teste
Die (2.) Saison ist rum, hat es funktioniert?
Oh, wie ne Eins .... habe die ganze Beregnung noch wesentlich weiter aufgebohrt und denke, damit jetzt unter den 10 komplexesten Beregnungen im "Hobbybereich" weltweit zu liegen :D
Nee, keine Ahnung, aber in Kombi mit der Wetterstation und Sensoren und Wettervorhersagen und Pumpen und Anwesenheit und SolaranlagenVerbrauch und und und funktioniert das wirklich schön. Ich schreib dir jetzt mal noch im anderen Thread wegen dem "skippen"
https://forum.fhem.de/index.php/topic,91605.msg841813.html#msg841813 (https://forum.fhem.de/index.php/topic,91605.msg841813.html#msg841813)
Ich habe mich damit auch letztes Jahr beschäftigt und in diesem Jahr sind aus ursprünglich 4 Bewässerungskreisen schon 12 geworden, welche in unterschiedlicher Dauer angesteuert werden können (siehe Anhang).
Dahinter liegen rund 380 Zeilen DOIF für eine Ansteuerung morgens, abends oder eben zu beiden Zeiten...
Da auch meine Pumpe nicht alle Kreise zusammen versorgen kann, so sucht sich das Script selbst seine "passenden" Größen zusammen um die Pumpe nicht zu überfordern. Ebenfalls ist es möglich mit dem letzten Auswahlfeld den entprechenden Kreis manuell für eine dort auswählbare Zeit zu starten. Ich müsste jetzt nur mal versuchen das ganze in den neuen Perl-Modus zu packen bzw. Subs hinzu zu fügen, dann könnte das Script auch mit der Hälfte des Codes auskommen können.
Grüße
Gregor
Zitat von: Rheininsel am 09 Oktober 2018, 10:45:58
Ich habe mich damit auch letztes Jahr beschäftigt und in diesem Jahr sind aus ursprünglich 4 Bewässerungskreisen schon 12 geworden, welche in unterschiedlicher Dauer angesteuert werden können (siehe Anhang).
Dahinter liegen rund 380 Zeilen DOIF für eine Ansteuerung morgens, abends oder eben zu beiden Zeiten...
Da auch meine Pumpe nicht alle Kreise zusammen versorgen kann, so sucht sich das Script selbst seine "passenden" Größen zusammen um die Pumpe nicht zu überfordern. Ebenfalls ist es möglich mit dem letzten Auswahlfeld den entprechenden Kreis manuell für eine dort auswählbare Zeit zu starten. Ich müsste jetzt nur mal versuchen das ganze in den neuen Perl-Modus zu packen bzw. Subs hinzu zu fügen, dann könnte das Script auch mit der Hälfte des Codes auskommen können.
Grüße
Gregor
Hast du viele DOIFs oder alles in einem?
Derzeit ist es verteilt in mehrere. Der große Steuerungs-DIIF hat dabei die 380 Zeilen Code, da ich sehr viele Berechnungen drin machen muss (Perl).
Zitat von: Rheininsel am 09 Oktober 2018, 19:57:13
Derzeit ist es verteilt in mehrere. Der große Steuerungs-DIIF hat dabei die 380 Zeilen Code, da ich sehr viele Berechnungen drin machen muss (Perl).
OK.
Das wäre tatsächlich eine Herausforderung, die Sache sauber im Perl Modus abzubilden.
Häng doch mal rein...
Nach sehr langer Zeit ist jetzt wieder Bewässerungszeit und ich wollte Euch nicht den Code schuldig bleiben... Sorry. Wer mehr Infos haben möchte... Ich bemühe mich nun um eine Zeitnahe Antwort ;-)
(([{sunrise(+3600,"06:30","08:30")}|8] or [{sunrise(+7200,"07:30","08:30")}|7]) and [11_Gartenautomatik] eq "JA" and [01_MODUS] eq "Sommer" and [Wetterstation:statRainHour24] < (2 + (([Wetter:fc1_high_c]-20)/5) ))
({
prowl("Bewässerung wird jetzt gestartet","","0","0");
my $testwert;;;;
my $testwert2;;;;
my $testwert3;;;;
my $testwert4;;;;
my @Ventilwerte;;;;
my @Ventilgroessen;;;;
my @Ventilgruppen;;;;
my @Ventilzeiten;;;;
my @Startzeit;;;;
my $Ventilwert;;;;
my $i=0;;;;
my $j=0;;;;
my $z1=0;;;;
my $z2=0;;;;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;;
my $Zeitspeicher=3;;;;
my $aktuelleZeit=0;;;;
my $sec2;;;;
my $min2;;;;
my $hour2;;;;
my $mday2;;;;
my $mon2;;;;
my $temperatur=ReadingsVal('Wetter', 'fc1_high_c', '25');;;;
my $temperatur_korrekturwert=ReadingsVal('Korrekturfaktor', 'state', '10');;;;
my $temp_korrekturwert;;;;
if ($temperatur > 25) {
$temp_korrekturwert=(($temperatur-25))/$temperatur_korrekturwert;;;;
} else {
$temp_korrekturwert=0;;;;
}
@Ventilgroessen[1] = 0;;;;
@Ventilgroessen[2] = 0;;;;
@Ventilgroessen[3] = 0;;;;
@Ventilgroessen[4] = 0;;;;
@Ventilgroessen[5] = 0;;;;
@Ventilgroessen[6] = 0;;;;
@Ventilgroessen[7] = 0;;;;
@Ventilgroessen[8] = 0;;;;
push(@Ventilwerte,['Gartenventil01',ReadingsVal('Gartenventil01', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil01', 'Dauer', 'AUS'),ReadingsVal('Gartenventil01', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil02',ReadingsVal('Gartenventil02', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil02', 'Dauer', 'AUS'),ReadingsVal('Gartenventil02', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil03',ReadingsVal('Gartenventil03', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil03', 'Dauer', 'AUS'),ReadingsVal('Gartenventil03', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil04',ReadingsVal('Gartenventil04', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil04', 'Dauer', 'AUS'),ReadingsVal('Gartenventil04', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil05',ReadingsVal('Gartenventil05', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil05', 'Dauer', 'AUS'),ReadingsVal('Gartenventil05', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil06',ReadingsVal('Gartenventil06', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil06', 'Dauer', 'AUS'),ReadingsVal('Gartenventil06', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil07',ReadingsVal('Gartenventil07', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil07', 'Dauer', 'AUS'),ReadingsVal('Gartenventil07', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil08',ReadingsVal('Gartenventil08', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil08', 'Dauer', 'AUS'),ReadingsVal('Gartenventil08', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil09',ReadingsVal('Gartenventil09', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil09', 'Dauer', 'AUS'),ReadingsVal('Gartenventil09', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil10',ReadingsVal('Gartenventil10', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil10', 'Dauer', 'AUS'),ReadingsVal('Gartenventil10', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil11',ReadingsVal('Gartenventil11', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil11', 'Dauer', 'AUS'),ReadingsVal('Gartenventil11', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil12',ReadingsVal('Gartenventil12', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil12', 'Dauer', 'AUS'),ReadingsVal('Gartenventil12', 'Volumen', 'gross')]);;
for my $row (@Ventilwerte) {
if (@$row[1] eq "morgens" or @$row[1] eq "beides") {
if (@$row[2] != 0) {
if (@$row[3] eq "klein") { @$row[3] = 1;;;; }
elsif (@$row[3] eq "mittel") { @$row[3] = 2;;;; }
elsif (@$row[3] eq "gross") { @$row[3] = 4;;;; }
if ((@Ventilgroessen[1] + @$row[3]) <= 4) { @Ventilgroessen[1] += @$row[3];;;; push( @{$Ventilgruppen[1]}, @$row[0] );;;; push( @{$Ventilzeiten[1]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[2] + @$row[3]) <= 4) { @Ventilgroessen[2] += @$row[3];;;; push( @{$Ventilgruppen[2]}, @$row[0] );;;; push( @{$Ventilzeiten[2]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[3] + @$row[3]) <= 4) { @Ventilgroessen[3] += @$row[3];;;; push( @{$Ventilgruppen[3]}, @$row[0] );;;; push( @{$Ventilzeiten[3]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[4] + @$row[3]) <= 4) { @Ventilgroessen[4] += @$row[3];;;; push( @{$Ventilgruppen[4]}, @$row[0] );;;; push( @{$Ventilzeiten[4]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[5] + @$row[3]) <= 4) { @Ventilgroessen[5] += @$row[3];;;; push( @{$Ventilgruppen[5]}, @$row[0] );;;; push( @{$Ventilzeiten[5]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[6] + @$row[3]) <= 4) { @Ventilgroessen[6] += @$row[3];;;; push( @{$Ventilgruppen[6]}, @$row[0] );;;; push( @{$Ventilzeiten[6]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[7] + @$row[3]) <= 4) { @Ventilgroessen[7] += @$row[3];;;; push( @{$Ventilgruppen[7]}, @$row[0] );;;; push( @{$Ventilzeiten[7]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[8] + @$row[3]) <= 4) { @Ventilgroessen[8] += @$row[3];;;; push( @{$Ventilgruppen[8]}, @$row[0] );;;; push( @{$Ventilzeiten[8]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[9] + @$row[3]) <= 4) { @Ventilgroessen[9] += @$row[3];;;; push( @{$Ventilgruppen[9]}, @$row[0] );;;; push( @{$Ventilzeiten[9]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[10] + @$row[3]) <= 4) { @Ventilgroessen[10] += @$row[3];;;; push( @{$Ventilgruppen[10]}, @$row[0] );;;; push( @{$Ventilzeiten[10]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[11] + @$row[3]) <= 4) { @Ventilgroessen[11] += @$row[3];;;; push( @{$Ventilgruppen[11]}, @$row[0] );;;; push( @{$Ventilzeiten[11]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[12] + @$row[3]) <= 4) { @Ventilgroessen[12] += @$row[3];;;; push( @{$Ventilgruppen[12]}, @$row[0] );;;; push( @{$Ventilzeiten[12]}, @$row[2] );;;; }
}
}
}
my $anzahl_ventilgruppen;;;;
my $anzahl_ventiluntergruppen;;;;
my $zwischenwert=0;;;;
my $maximale_Ventilzeiten=0;;;;
my $steuerwert;;;;
my $ListeVentile;;;;
my $ListeZeiten;;;;
$anzahl_ventilgruppen = scalar @Ventilgruppen;;;;
$z1 = 1;;;;
while($z1 < $anzahl_ventilgruppen) {
my $aktuelleZeit = mktime($sec+$Zeitspeicher+(($sec+$Zeitspeicher)*$temp_korrekturwert), $min, $hour, $mday, $mon, $year);;;;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($aktuelleZeit);;;;
if ($sec < 10) { $sec2 = "0";;} else { $sec2 = "";;}
if ($min < 10) { $min2 = "0";;} else { $min2 = "";;}
if ($hour < 10) { $hour2 = "0";;} else { $hour2 = "";;}
if ($mday < 10) { $mday2 = "0";;} else { $mday2 = "";;}
if ($mon < 9) {$mon2 = "0";;} else { $mon2 = "";;}
if ($z1==0) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[0]};;;;
$ListeVentile = "@{@Ventilgruppen[0]}";
$ListeZeiten = "@{$Ventilzeiten[0]}";
}
elsif ($z1==1) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[1]};;;;
$ListeVentile = "@{@Ventilgruppen[1]}";
$ListeZeiten = "@{$Ventilzeiten[1]}";
}
elsif ($z1==2) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[2]};;;;
$ListeVentile = "@{@Ventilgruppen[2]}";
$ListeZeiten = "@{$Ventilzeiten[2]}";
}
elsif ($z1==3) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[3]};;;;
$ListeVentile = "@{@Ventilgruppen[3]}";
$ListeZeiten = "@{$Ventilzeiten[3]}";
}
elsif ($z1==4) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[4]};;;;
$ListeVentile = "@{@Ventilgruppen[4]}";
$ListeZeiten = "@{$Ventilzeiten[4]}";
}
elsif ($z1==5) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[5]};;;;
$ListeVentile = "@{@Ventilgruppen[5]}";
$ListeZeiten = "@{$Ventilzeiten[5]}";
}
elsif ($z1==6) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[6]};;;;
$ListeVentile = "@{@Ventilgruppen[6]}";
$ListeZeiten = "@{$Ventilzeiten[6]}";
}
elsif ($z1==7) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[7]};;;;
$ListeVentile = "@{@Ventilgruppen[7]}";
$ListeZeiten = "@{$Ventilzeiten[7]}";
}
elsif ($z1==8) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[8]};;;;
$ListeVentile = "@{@Ventilgruppen[8]}";
$ListeZeiten = "@{$Ventilzeiten[8]}";
}
elsif ($z1==9) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[9]};;;;
$ListeVentile = "@{@Ventilgruppen[9]}";
$ListeZeiten = "@{$Ventilzeiten[9]}";
}
elsif ($z1==10) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[10]};;;;
$ListeVentile = "@{@Ventilgruppen[10]}";
$ListeZeiten = "@{$Ventilzeiten[10]}";
}
elsif ($z1==11) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[11]};;;;
$ListeVentile = "@{@Ventilgruppen[11]}";
$ListeZeiten = "@{$Ventilzeiten[11]}";
}
elsif ($z1==12) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[12]};;;;
$ListeVentile = "@{@Ventilgruppen[12]}";
$ListeZeiten = "@{$Ventilzeiten[12]}";
}
$z2 = 1;;;;
my @ListeVentile = split (/ /,$ListeVentile);
my @ListeZeiten = split (/ /,$ListeZeiten);
foreach my $AktuellesVentil (@ListeVentile) {
my $AktuelleVentilzeit = shift(@ListeZeiten);
if ($AktuelleVentilzeit > $maximale_Ventilzeiten)
{
$maximale_Ventilzeiten = $AktuelleVentilzeit;;;;
}
fhem ("define Start_$AktuellesVentil at ".($year+1900)."-".$mon2.($mon+1)."-".$mday2.$mday."T".$hour2.$hour.":".$min2.$min.":".$sec2.$sec." set Bewaesserung_Sw_".substr ($AktuellesVentil, 12, 2)." on-for-timer ".($AktuelleVentilzeit*10+(($AktuelleVentilzeit*10)*$temp_korrekturwert))."");
fhem ("attr Start_$AktuellesVentil room Bewässerung");
fhem ("attr Start_$AktuellesVentil group aktuell_Zeitsteuerung");
}
$testwert .= "Maxwert -> ".$maximale_Ventilzeiten."\n";;;;
$Zeitspeicher = ($maximale_Ventilzeiten*10)-5;;;; ##$Zeitspeicher+
$maximale_Ventilzeiten = 0;;
$z1++;;;;
}
})
DOELSEIF
(([{sunset("REAL",0,"18:00","21:00")}]) and [11_Gartenautomatik] eq "JA" and [01_MODUS] eq "Sommer" and [Wetterstation:statRainHour24] < (2 + (([Wetter:fc1_high_c]-20)/5) ))
({
prowl("Bewässerung wird jetzt gestartet","","0","0");
my $testwert;;;;
my $testwert2;;;;
my $testwert3;;;;
my $testwert4;;;;
my @Ventilwerte;;;;
my @Ventilgroessen;;;;
my @Ventilgruppen;;;;
my @Ventilzeiten;;;;
my @Startzeit;;;;
my $Ventilwert;;;;
my $i=0;;;;
my $j=0;;;;
my $z1=0;;;;
my $z2=0;;;;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;;;
my $Zeitspeicher=3;;;;
my $aktuelleZeit=0;;;;
my $sec2;;;;
my $min2;;;;
my $hour2;;;;
my $mday2;;;;
my $mon2;;;;
my $temperatur=ReadingsVal('Wetter', 'fc1_high_c', '25');;;;
my $temperatur_korrekturwert=ReadingsVal('Korrekturfaktor', 'state', '10');;;;
my $temp_korrekturwert;;;;
if ($temperatur > 25) {
$temp_korrekturwert=(($temperatur-25))/$temperatur_korrekturwert;;;;
} else {
$temp_korrekturwert=0;;;;
}
@Ventilgroessen[1] = 0;;;;
@Ventilgroessen[2] = 0;;;;
@Ventilgroessen[3] = 0;;;;
@Ventilgroessen[4] = 0;;;;
@Ventilgroessen[5] = 0;;;;
@Ventilgroessen[6] = 0;;;;
@Ventilgroessen[7] = 0;;;;
@Ventilgroessen[8] = 0;;;;
push(@Ventilwerte,['Gartenventil01',ReadingsVal('Gartenventil01', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil01', 'Dauer', 'AUS'),ReadingsVal('Gartenventil01', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil02',ReadingsVal('Gartenventil02', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil02', 'Dauer', 'AUS'),ReadingsVal('Gartenventil02', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil03',ReadingsVal('Gartenventil03', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil03', 'Dauer', 'AUS'),ReadingsVal('Gartenventil03', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil04',ReadingsVal('Gartenventil04', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil04', 'Dauer', 'AUS'),ReadingsVal('Gartenventil04', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil05',ReadingsVal('Gartenventil05', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil05', 'Dauer', 'AUS'),ReadingsVal('Gartenventil05', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil06',ReadingsVal('Gartenventil06', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil06', 'Dauer', 'AUS'),ReadingsVal('Gartenventil06', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil07',ReadingsVal('Gartenventil07', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil07', 'Dauer', 'AUS'),ReadingsVal('Gartenventil07', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil08',ReadingsVal('Gartenventil08', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil08', 'Dauer', 'AUS'),ReadingsVal('Gartenventil08', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil09',ReadingsVal('Gartenventil09', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil09', 'Dauer', 'AUS'),ReadingsVal('Gartenventil09', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil10',ReadingsVal('Gartenventil10', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil10', 'Dauer', 'AUS'),ReadingsVal('Gartenventil10', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil11',ReadingsVal('Gartenventil11', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil11', 'Dauer', 'AUS'),ReadingsVal('Gartenventil11', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil12',ReadingsVal('Gartenventil12', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil12', 'Dauer', 'AUS'),ReadingsVal('Gartenventil12', 'Volumen', 'gross')]);;
for my $row (@Ventilwerte) {
if (@$row[1] eq "abends" or @$row[1] eq "beides") {
if (@$row[2] != 0) {
if (@$row[3] eq "klein") { @$row[3] = 1;;;; }
elsif (@$row[3] eq "mittel") { @$row[3] = 2;;;; }
elsif (@$row[3] eq "gross") { @$row[3] = 4;;;; }
if ((@Ventilgroessen[1] + @$row[3]) <= 4) { @Ventilgroessen[1] += @$row[3];;;; push( @{$Ventilgruppen[1]}, @$row[0] );;;; push( @{$Ventilzeiten[1]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[2] + @$row[3]) <= 4) { @Ventilgroessen[2] += @$row[3];;;; push( @{$Ventilgruppen[2]}, @$row[0] );;;; push( @{$Ventilzeiten[2]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[3] + @$row[3]) <= 4) { @Ventilgroessen[3] += @$row[3];;;; push( @{$Ventilgruppen[3]}, @$row[0] );;;; push( @{$Ventilzeiten[3]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[4] + @$row[3]) <= 4) { @Ventilgroessen[4] += @$row[3];;;; push( @{$Ventilgruppen[4]}, @$row[0] );;;; push( @{$Ventilzeiten[4]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[5] + @$row[3]) <= 4) { @Ventilgroessen[5] += @$row[3];;;; push( @{$Ventilgruppen[5]}, @$row[0] );;;; push( @{$Ventilzeiten[5]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[6] + @$row[3]) <= 4) { @Ventilgroessen[6] += @$row[3];;;; push( @{$Ventilgruppen[6]}, @$row[0] );;;; push( @{$Ventilzeiten[6]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[7] + @$row[3]) <= 4) { @Ventilgroessen[7] += @$row[3];;;; push( @{$Ventilgruppen[7]}, @$row[0] );;;; push( @{$Ventilzeiten[7]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[8] + @$row[3]) <= 4) { @Ventilgroessen[8] += @$row[3];;;; push( @{$Ventilgruppen[8]}, @$row[0] );;;; push( @{$Ventilzeiten[8]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[9] + @$row[3]) <= 4) { @Ventilgroessen[9] += @$row[3];;;; push( @{$Ventilgruppen[9]}, @$row[0] );;;; push( @{$Ventilzeiten[9]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[10] + @$row[3]) <= 4) { @Ventilgroessen[10] += @$row[3];;;; push( @{$Ventilgruppen[10]}, @$row[0] );;;; push( @{$Ventilzeiten[10]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[11] + @$row[3]) <= 4) { @Ventilgroessen[11] += @$row[3];;;; push( @{$Ventilgruppen[11]}, @$row[0] );;;; push( @{$Ventilzeiten[11]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[12] + @$row[3]) <= 4) { @Ventilgroessen[12] += @$row[3];;;; push( @{$Ventilgruppen[12]}, @$row[0] );;;; push( @{$Ventilzeiten[12]}, @$row[2] );;;; }
}
}
}
my $anzahl_ventilgruppen;;;;
my $anzahl_ventiluntergruppen;;;;
my $zwischenwert=0;;;;
my $maximale_Ventilzeiten=0;;;;
my $steuerwert;;;;
my $ListeVentile;;;;
my $ListeZeiten;;;;
$anzahl_ventilgruppen = scalar @Ventilgruppen;;;;
$z1 = 1;;;;
while($z1 < $anzahl_ventilgruppen) {
my $aktuelleZeit = mktime($sec+$Zeitspeicher+(($sec+$Zeitspeicher)*$temp_korrekturwert), $min, $hour, $mday, $mon, $year);;;;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($aktuelleZeit);;;;
if ($sec < 10) { $sec2 = "0";;} else { $sec2 = "";;}
if ($min < 10) { $min2 = "0";;} else { $min2 = "";;}
if ($hour < 10) { $hour2 = "0";;} else { $hour2 = "";;}
if ($mday < 10) { $mday2 = "0";;} else { $mday2 = "";;}
if ($mon < 9) {$mon2 = "0";;} else { $mon2 = "";;}
if ($z1==0) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[0]};;;;
$ListeVentile = "@{@Ventilgruppen[0]}";
$ListeZeiten = "@{$Ventilzeiten[0]}";
}
elsif ($z1==1) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[1]};;;;
$ListeVentile = "@{@Ventilgruppen[1]}";
$ListeZeiten = "@{$Ventilzeiten[1]}";
}
elsif ($z1==2) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[2]};;;;
$ListeVentile = "@{@Ventilgruppen[2]}";
$ListeZeiten = "@{$Ventilzeiten[2]}";
}
elsif ($z1==3) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[3]};;;;
$ListeVentile = "@{@Ventilgruppen[3]}";
$ListeZeiten = "@{$Ventilzeiten[3]}";
}
elsif ($z1==4) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[4]};;;;
$ListeVentile = "@{@Ventilgruppen[4]}";
$ListeZeiten = "@{$Ventilzeiten[4]}";
}
elsif ($z1==5) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[5]};;;;
$ListeVentile = "@{@Ventilgruppen[5]}";
$ListeZeiten = "@{$Ventilzeiten[5]}";
}
elsif ($z1==6) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[6]};;;;
$ListeVentile = "@{@Ventilgruppen[6]}";
$ListeZeiten = "@{$Ventilzeiten[6]}";
}
elsif ($z1==7) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[7]};;;;
$ListeVentile = "@{@Ventilgruppen[7]}";
$ListeZeiten = "@{$Ventilzeiten[7]}";
}
elsif ($z1==8) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[8]};;;;
$ListeVentile = "@{@Ventilgruppen[8]}";
$ListeZeiten = "@{$Ventilzeiten[8]}";
}
elsif ($z1==9) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[9]};;;;
$ListeVentile = "@{@Ventilgruppen[9]}";
$ListeZeiten = "@{$Ventilzeiten[9]}";
}
elsif ($z1==10) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[10]};;;;
$ListeVentile = "@{@Ventilgruppen[10]}";
$ListeZeiten = "@{$Ventilzeiten[10]}";
}
elsif ($z1==11) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[11]};;;;
$ListeVentile = "@{@Ventilgruppen[11]}";
$ListeZeiten = "@{$Ventilzeiten[11]}";
}
elsif ($z1==12) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[12]};;;;
$ListeVentile = "@{@Ventilgruppen[12]}";
$ListeZeiten = "@{$Ventilzeiten[12]}";
}
$z2 = 1;;;;
my @ListeVentile = split (/ /,$ListeVentile);
my @ListeZeiten = split (/ /,$ListeZeiten);
foreach my $AktuellesVentil (@ListeVentile) {
my $AktuelleVentilzeit = shift(@ListeZeiten);
if ($AktuelleVentilzeit > $maximale_Ventilzeiten)
{
$maximale_Ventilzeiten = $AktuelleVentilzeit;;;;
}
fhem ("define Start_$AktuellesVentil at ".($year+1900)."-".$mon2.($mon+1)."-".$mday2.$mday."T".$hour2.$hour.":".$min2.$min.":".$sec2.$sec." set Bewaesserung_Sw_".substr ($AktuellesVentil, 12, 2)." on-for-timer ".($AktuelleVentilzeit*10+(($AktuelleVentilzeit*10)*$temp_korrekturwert))."");
fhem ("attr Start_$AktuellesVentil room Bewässerung");
fhem ("attr Start_$AktuellesVentil group aktuell_Zeitsteuerung");
}
$testwert .= "Maxwert -> ".$maximale_Ventilzeiten."\n";;;;
$Zeitspeicher = ($maximale_Ventilzeiten*10)-5;;;; ##$Zeitspeicher+
$maximale_Ventilzeiten = 0;;
$z1++;;;;
}
})
Es wird mit verschiedenen Dummys gearbeitet und auch die Ventile sind nochmals einzeln steuerbar. Die zugehörige Pumpe zur Versorgung aus Wasserfässern wird nur eingeschaltet, wenn auch ein Ventil geöffnet wurde.
Grüße und schöne Ostern!
Gregor
Das sieht nicht nach einem Output von Rawdefinition aus: Warum hast du vier Semikolons, statt einem?
Aufwändigere Berechnungen würde ich alleine schon aus Performance-Gründen in eine Funktion auslagern. In deinem Fall wird bei jeder Ausführung der ganze Perlcode übersetzt. Unnötige Trigger würde ich mit ? ausbauen.
Effizienter und auch übersichtlicher:
DOIF
## Definition der beiden Bewesserungsroutinen
subs {
sub bewesserung1
{
prowl("Bewässerung wird jetzt gestartet","","0","0");
my $testwert;
my $testwert2;
my $testwert3;
...
}
sub bewesserung2
{
...
}
} ## end of subs
## Ausführungsblock 1
{if (([{sunrise(+3600,"06:30","08:30")}|8] or [{sunrise(+7200,"07:30","08:30")}|7]) and [?11_Gartenautomatik] eq "JA" and [?01_MODUS] eq "Sommer" and [?Wetterstation:statRainHour24] < (2 + ([?Wetter:fc1_high_c]-20)/5)) {
bewesserung1();
}
}
## Ausführungsblock 2
{if ([{sunset("REAL",0,"18:00","21:00")}] and [?11_Gartenautomatik] eq "JA" and [?01_MODUS] eq "Sommer" and [?Wetterstation:statRainHour24] < (2 + ([?Wetter:fc1_high_c]-20)/5)) {
bewesserung2();
}
}
Das war Perl-Modus.
Hihi! Das schaut nach Potential aus. Danke! Ich werde das anpassen. Schaut wirklich besser aus.
Grüße
Gregor
Zitat von: Rheininsel am 21 April 2019, 11:00:15
Hihi! Das schaut nach Potential aus. Danke! Ich werde das anpassen. Schaut wirklich besser aus.
Grüße
Gregor
Du solltest bei der Umstellung daran denken, dass im Perl-Modus der Namensraum von DOIF gekapselt (geschützt) ist, das hat den Vorteil, dass man sich nicht bestehende Routinen versehentlich überschreibt, die außerhalb der DOIF-Welt definiert wurden. Bei fremden Routinen, die angemeckert werden, musst du :: voranstellen z. B. ::prowl(...).
Ein paar Anmerkungen, ohne weitere Syntaxprüfungen, mathematische Vereinfachungen oder Auslagerung in Funktionen u.ä.:
1.
push(@Ventilwerte,['Gartenventil01',ReadingsVal('Gartenventil01', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil01', 'Dauer', 'AUS'),ReadingsVal('Gartenventil01', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil02',ReadingsVal('Gartenventil02', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil02', 'Dauer', 'AUS'),ReadingsVal('Gartenventil02', 'Volumen', 'gross')]);;
...
push(@Ventilwerte,['Gartenventil11',ReadingsVal('Gartenventil11', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil11', 'Dauer', 'AUS'),ReadingsVal('Gartenventil11', 'Volumen', 'gross')]);;
push(@Ventilwerte,['Gartenventil12',ReadingsVal('Gartenventil12', 'Betrieb', 'AUS'),ReadingsVal('Gartenventil12', 'Dauer', 'AUS'),ReadingsVal('Gartenventil12', 'Volumen', 'gross')]);;
Mit Änderung der Nahmen auf ohne führende 0 (sonst wird es etwas aufwendiger):
my @a = (1..12);
for my $i (@a){
my $GV_Nr = 'Gartenventil' . $i;
push(@Ventilwerte,[$GV_Nr, ReadingsVal($GV_Nr, 'Betrieb', 'AUS'),ReadingsVal($GV_Nr, 'Dauer', 'AUS'),ReadingsVal($GV_Nr, 'Volumen', 'gross')]);
}
2.
if ((@Ventilgroessen[1] + @$row[3]) <= 4) { @Ventilgroessen[1] += @$row[3];;;; push( @{$Ventilgruppen[1]}, @$row[0] );;;; push( @{$Ventilzeiten[1]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[2] + @$row[3]) <= 4) { @Ventilgroessen[2] += @$row[3];;;; push( @{$Ventilgruppen[2]}, @$row[0] );;;; push( @{$Ventilzeiten[2]}, @$row[2] );;;; }
...
elsif ((@Ventilgroessen[11] + @$row[3]) <= 4) { @Ventilgroessen[11] += @$row[3];;;; push( @{$Ventilgruppen[11]}, @$row[0] );;;; push( @{$Ventilzeiten[11]}, @$row[2] );;;; }
elsif ((@Ventilgroessen[12] + @$row[3]) <= 4) { @Ventilgroessen[12] += @$row[3];;;; push( @{$Ventilgruppen[12]}, @$row[0] );;;; push( @{$Ventilzeiten[12]}, @$row[2] );;;; }
-->
my @a = (1..12);
for my $i (@a){
if ((@Ventilgroessen[$i] + @$row[3]) <= 4) { @Ventilgroessen[$i] += @$row[3];push( @{$Ventilgruppen[$i]}, @$row[0] );push( @{$Ventilzeiten[$i]}, @$row[2] );
break;}
}
und 3.
if ($z1==0) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[0]};;;;
$ListeVentile = "@{@Ventilgruppen[0]}";
$ListeZeiten = "@{$Ventilzeiten[0]}";
}
elsif ($z1==1) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[1]};;;;
$ListeVentile = "@{@Ventilgruppen[1]}";
$ListeZeiten = "@{$Ventilzeiten[1]}";
}
...
elsif ($z1==11) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[11]};;;;
$ListeVentile = "@{@Ventilgruppen[11]}";
$ListeZeiten = "@{$Ventilzeiten[11]}";
}
elsif ($z1==12) {
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[12]};;;;
$ListeVentile = "@{@Ventilgruppen[12]}";
$ListeZeiten = "@{$Ventilzeiten[12]}";
}
-->
$anzahl_ventiluntergruppen = scalar @{@Ventilgruppen[$z1]};
$ListeVentile = "@{@Ventilgruppen[$z1]}";
$ListeZeiten = "@{$Ventilzeiten[$z1]}";