Hauptmenü

neues Modul DOIF

Begonnen von Damian, 21 Mai 2014, 15:53:18

Vorheriges Thema - Nächstes Thema

HoTi

Hallo zusammen,

ich habe mich mal an dem DOIF mit mehreren Kommandos Probiert.

define Rollos_runter DOIF ([BM_Garage:brightness] < 110 ) ((set WZT_dummy zu) wait 2 (set WZFL_dummy zu) wait 2 (set WZFR_dummy zu) wait 2 (set WCF_dummy zu) wait 2 (set KUF_dummy zu) wait 2 (set SZT_dummy zu) wait 2 (set KZT_dummy zu))


Leider wird nur das erste Kommando ausgeführt. Wo habe ich den den Fehler?!
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

Brockmann

Zitat von: RettungsTim am 19 Januar 2015, 08:31:15
Leider wird nur das erste Kommando ausgeführt. Wo habe ich den den Fehler?!
Klassisches Lesen-und-Verstehen-Problem: "wait" zwischen Befehlen steht auf der ToDo-Liste, soll also in der nächsten DOIF-Version implementiert werden. Zur Zeit kann man es aber noch nicht nutzen.
Wenn Du die Befehle ohne Wartepause ausführen willst, einfach ein Komma dazwischen setzen, also
Befehl 1,Befehl 2,Befehl 3 usw.

Damian

Du kannst aber auch sleep benutzen, wenn man es "richtig" angibt.

define Rollos_runter DOIF ([BM_Garage:brightness] < 110 ) ((set WZT_dummy zu, sleep;set WZFL_dummy zu; sleep 2;set WZFR_dummy zu; sleep;set WCF_dummy zu;sleep 2;set KUF_dummy zu;sleep 2;set SZT_dummy zu;sleep 2;set KZT_dummy zu)


Hinter sleep muss ein Semikolon (kein Komma stehen), damit wird die Kontrolle der folgenden Befehle von DOIF an sleep übergeben. So wird das System nicht blockiert.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

HoTi

oh verdammt....

Guter hinweiß mit dem Komma, da war mein zweites Probem ohne "wait".

Dann mach ich auch mal ein "wait" auf "wait"  ;D

Danke euch und sorry für die blöde Frage.-.-. Das habe ich echt nicht gelesen da ich in den 73 Seiten nach einer Lösung für mein Probelem gesucht habe und nicht alle Seiten gelesen habe :-(
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

Damian

Zitat von: RettungsTim am 19 Januar 2015, 08:53:48
oh verdammt....

Guter hinweiß mit dem Komma, da war mein zweites Probem ohne "wait".

Dann mach ich auch mal ein "wait" auf "wait"  ;D

Danke euch und sorry für die blöde Frage.-.-. Das habe ich echt nicht gelesen da ich in den 73 Seiten nach einer Lösung für mein Probelem gesucht habe und nicht alle Seiten gelesen habe :-(

Bei über Tausend Beiträgen kann es mal passieren :)

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MaJu

Zitat von: RettungsTim am 19 Januar 2015, 08:31:15
ich habe mich mal an dem DOIF mit mehreren Kommandos Probiert.

define Rollos_runter DOIF ([BM_Garage:brightness] < 110 ) ((set WZT_dummy zu) wait 2 (set WZFL_dummy zu) wait 2 (set WZFR_dummy zu) wait 2 (set WCF_dummy zu) wait 2 (set KUF_dummy zu) wait 2 (set SZT_dummy zu) wait 2 (set KZT_dummy zu))


Leider wird nur das erste Kommando ausgeführt. Wo habe ich den den Fehler?!

Alles was auszuführen ist muss in die zweite Klammer.
Auch wenn wait (noch) nicht mit DOIF geht: Du kannst "sleep" verwenden. Setze aber nach dem "sleep" statt Kommas jeweils ein Semikolon, ansonsten bedeutet "sleep" dass sich das gesamte FHEM schlafen legt.

Bei dir sähe die DOIF-Definition dann also so aus:

([BM_Garage:brightness] < 110 ) (set WZT_dummy zu, sleep 2; set WZFL_dummy zu; sleep 2; set WZFR_dummy zu; sleep 2; set WCF_dummy zu; sleep 2; set KUF_dummy zu; sleep 2; set SZT_dummy zu; sleep 2; set KZT_dummy zu)


Wozu aber die "wait" dazwischen? Um dummys mit einem Status zu versehen musst du keine Pause reinsetzen und es abkürzen (dann mit Kommas):
([BM_Garage:brightness] < 110 ) (set WZT_dummy zu, set WZFL_dummy zu, set WZFR_dummy zu, set WCF_dummy zu, set KUF_dummy zu, set SZT_dummy zu, set KZT_dummy zu)
Erlebnisreiche Grüße aus Leipzig!

HoTi

Zitat von: MaJu am 19 Januar 2015, 08:58:51
Wozu aber die "wait" dazwischen? Um dummys mit einem Status zu versehen musst du keine Pause reinsetzen und es abkürzen (dann mit Kommas):
([BM_Garage:brightness] < 110 ) (set WZT_dummy zu, set WZFL_dummy zu, set WZFR_dummy zu, set WCF_dummy zu, set KUF_dummy zu, set SZT_dummy zu, set KZT_dummy zu)


Danke.

Zu deiner Frage: Die Dummys sind mit HM Komponeten verknüpft (4-Fach schalter) und ich dachte es ist besser wenn ich nicht gleich alle 7 Rollos zeitgleich runter fahren will.
Viele Grüße aus  Oberbayern
Tim (RettungsTim)

maxritti

Hallo zusammen,


meine Rollos halten mich nach wie vor auf Trab.
Heute in der Nacht sogar um 0:00:00  ??? . Denn da sind auf einmal 3 von den Rollos einfach hoch gefahren worden.
Und ich habe keine Ahnung warum.

Ein Blick ins fhem Log hat dann allerdings dies hier zu Tage getragen:

2015.01.21 00:00:00.059 3: CUL_HM set EG_ku_RO_StrasseLinks on
2015.01.21 00:00:00.055 3: CUL_HM set OG_ki1_RO_Carport off
2015.01.21 00:00:00.052 3: CUL_HM set OG_ki2_RO_Garten off
2015.01.21 00:00:00.049 3: CUL_HM set OG_elt_RO_Strasse off
2015.01.21 00:00:00.047 3: CUL_HM set EG_wz_RO_TerrasseRechts off
2015.01.21 00:00:00.044 3: CUL_HM set EG_ku_RO_StrasseRechts off
2015.01.21 00:00:00.041 3: CUL_HM set OG_ki2_RO_Garten on
2015.01.21 00:00:00.039 3: CUL_HM set OG_ki1_RO_Carport on
2015.01.21 00:00:00.036 3: CUL_HM set EG_wz_RO_TerrasseLinks on
2015.01.21 00:00:00.033 3: CUL_HM set EG_ku_RO_StrasseRechts on
2015.01.21 00:00:00.030 3: CUL_HM set OG_ki1_RO_Garten on
2015.01.21 00:00:00.027 3: CUL_HM set EG_wz_RO_Carport off
2015.01.21 00:00:00.021 3: CUL_HM set OG_elt_RO_Strasse on
2015.01.21 00:00:00.016 3: CUL_HM set EG_wz_RO_Carport on
2015.01.21 00:00:00.006 3: CUL_HM set EG_wz_RO_TerrasseRechts on


Da ist ja mal mächtig etwas passiert. Mit dem Resultat, dass eben 3 Rollos ein "on" und kein "off" bekommen haben.
Nun stellt sich halt die Frage, warum sind diese Befehle gesendet worden?

Ich habe heute morgen mal ein List auf dem EG_ku_RO_StrasseRechts gemacht und da stand als state in der Tat um 00:00:00 "cmd_2".
Also fahre den Rollo um 00:00:00 hoch.

Momentan steht state auf cmd_2 um 06:40:00 weil da die Rollos korrekterweise hoch gefahren wurden.

Internals:
   CFGFN
   DEF        ([du_Rollo_Master] eq "an" and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and [du_Rollo_Art] ne "Weihnachten" and [{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}]) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}])
  (set EG_ku_RO_StrasseLinks off)
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
  (set EG_ku_RO_StrasseLinks on)
   NAME       di_EG_ku_RO_StrasseLinks
   NR         115
   NTFY_ORDER 50-di_EG_ku_RO_StrasseLinks
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2015-01-21 00:00:00   cmd_event       timer_4
     2015-01-21 00:00:00   cmd_nr          2
     2015-01-21 08:27:13   e_EG_dr_TS_Terrasse_luminosity 7.77
     2015-01-21 00:00:00   state           cmd_2
     2015-01-21 00:00:00   timer_1_c1      21.01.2015 16:10:00
     2015-01-21 00:00:00   timer_2_c1      21.01.2015 21:30:00
     2015-01-21 00:00:00   timer_3_c1      21.01.2015 21:30:00
     2015-01-21 06:40:00   timer_4_c2      22.01.2015 06:40:00|8
     2015-01-21 00:00:00   timer_5_c2      21.01.2015 09:30:00|7
   Condition:
     0          InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (ReadingValDoIf('EG_dr_TS_Terrasse','luminosity','') < InternalDoIf('du_Rollo_Luminosity_ru','STATE','') and InternalDoIf('du_Rollo_Art','STATE','') ne "Weihnachten" and DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")) or DOIF_time_once($hash->{timer}{2},$wday,"")
     1          InternalDoIf('du_Rollo_Master','STATE','') eq "an" and (DOIF_time_once($hash->{timer}{3},$wday,"8") or DOIF_time_once($hash->{timer}{4},$wday,"7"))
   Days:
     3          8
     4          7
   Devices:
     0           du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru du_Rollo_Art
     1           du_Rollo_Master
     all         du_Rollo_Master EG_dr_TS_Terrasse du_Rollo_Luminosity_ru du_Rollo_Art
   Do:
     0          set EG_ku_RO_StrasseLinks off
     1          set EG_ku_RO_StrasseLinks on
   Helper:
     last_timer 5
     sleeptimer -1
   Internals:
     0           du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Art:STATE
     1           du_Rollo_Master:STATE
     all         du_Rollo_Master:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Art:STATE
   Readings:
     0           EG_dr_TS_Terrasse:luminosity
     all         EG_dr_TS_Terrasse:luminosity
   Realtime:
     0          16:10:00
     1          21:30:00
     2          21:30:00
     3          06:40:00
     4          09:30:00
   State:
   Time:
     0          {ReadingsVal("du_Rollo_Zeit_ru_start", "state", "00:00:00")}
     1          {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
     2          {ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "00:00:00")}
     3          {ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}
     4          {ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}
   Timecond:
     0          0
     1          0
     2          0
     3          1
     4          1
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
   Timerfunc:
   Timers:
     0           0  1  2
     1           3  4
   Trigger:
Attributes:
   room       LichtRollo

   

Liegt das ggf an der von mir eingesetzten Version?
Ich meine mal hier irgendwo gelesen zu haben, dass die internen Timer umgestellt werden sollen.

$Id: 98_DOIF.pm 7435 2015-01-04 20:40:24Z damian-s $

Damian erwähnte zwar mal, dass die Zeitintervalle für DOIF zu gering sind.
Aber wenn dann bei den DOIFs bei State genau die Zeit steht, dann sind die Commands doch auch von DOIF gesendet worden.

Brockmann

Zitat von: maxritti am 21 Januar 2015, 08:30:01
Heute in der Nacht sogar um 0:00:00  ??? . Denn da sind auf einmal 3 von den Rollos einfach hoch gefahren worden.
Und ich habe keine Ahnung warum.

Offenbar hat das DOELSEIF zugeschlagen:
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "00:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "00:00:00")}|7]))
du_Rollo_Master ist vermutlich ohnehin grundsätzlich an. Also kann es nur an du_Rollo_Zeit_ho liegen.
Und da fällt auf, dass Du "00:00:00" als defaultvalue angegeben hast. Darauf wird ja zurückgegriffen, wenn kein anderer sinnvoller Wert aus dem angegebenen Reading ausgelesen werden kann.

Zu dem Zeitpunkt, als der Timer gesetzt worden ist, konnte also kein sinnvoller Wert aus du_Rollo_Zeit_ho generiert werden und deshalb wurde "00:00:00" zurückgeliefert und im Timer programmiert.
Jetzt musst Du "nur noch" rausfinden, wo im Hinblick darauf der Unterschied zwischen den DOIFs liegt, die funktioniert haben und denen, die nicht funktioniert haben. Denn im Prinzip sind die ja alle identisch, oder?

Außerdem stellt sich mir die Frage, ob der Defaultwert für diesen Anwendungsfall so optimal gewählt ist.  ;)
Wäre ja vielleicht sinnvoller, wenn die Rollos zu einer "christlicheren" Zeit hochfahren, falls mal was schiefgeht, so wie in diesem Fall...

maxritti

Argh.
Du hast natürlich Recht. Da wird der Hase im Pfeffer begraben sein.
Danke für den Schieber in die Richtung.

Erst mal werde ich den wohl wirklich mal auf eine andere Zeit setzen.

Wobei bei den Readings doch die korrekten Werte drin stehen?

2015-01-21 00:00:00   timer_1_c1      21.01.2015 16:10:00
2015-01-21 00:00:00   timer_2_c1      21.01.2015 21:30:00
2015-01-21 00:00:00   timer_3_c1      21.01.2015 21:30:00
2015-01-21 06:40:00   timer_4_c2      22.01.2015 06:40:00|8
2015-01-21 00:00:00   timer_5_c2      21.01.2015 09:30:00|7



Brockmann

Zitat von: maxritti am 21 Januar 2015, 10:36:36
Wobei bei den Readings doch die korrekten Werte drin stehen?
Ja, JETZT schon. Die Timer werden durch das Triggern neu gesetzt.
Du siehst ja am Datum der Readings, dass diese Timer jeweils um 00:00:00 neu gesetzt wurden. Und da hatte du_Rollo_Zeit_ho dann den richtigen Wert.

Die entscheidende Frage ist: Wann und warum vorher nicht?
Falls Du gestern einen FHEM-Neustart gemacht hast, würde ich mal dessen Ablauf analysieren. Ist sichergestellt, dass du_Rollo_Zeit_ho definiert ist, bevor die fraglichen DOIFs definiert werden?
Dein Vorteil ist, dass Du ja DOIFs hast, die funktionieren. Du musst also nur herausfinden, wo der Unterschied liegt.

maxritti

Ich werde zu alt für die ganze Technik.  :-\

In der Tat habe ich gestern FHEM neu gestartet.
Daraufhin haben sich die DOIFs die 00:00:00 aus den Dummies geholt.
Denn in der ConfigDB stehen die hinter den Definitionen der DOIFs.

Bislang habe ich mir damit geholfen, dass ich bei Änderung eines Dummies mit einem DOIFs die Defintionen der "Rollo-DOIFs" neu initialisiere, damit diese neuen Werte in die Readings kommen.
Dummerweise habe ich das gestern nach dem Neustart vergessen, so ein Dummie zu ändern, damit die DOIFs aktualisiert werden.

CFGFN
   DEF        ([du_Rollo_Master] or [du_Rollo_Zeit_ho] or [du_Rollo_Zeit_ho_WE] or [du_Rollo_Luminosity_ru] or [du_Rollo_Zeit_ru_start] or [du_Rollo_Zeit_ru_ende]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])
   NAME       di_Rollo_SetTime
   NR         114
   NTFY_ORDER 50-di_Rollo_SetTime
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2015-01-17 17:20:34   cmd_event       du_Rollo_Luminosity_ru
     2015-01-17 17:20:34   cmd_nr          1
     2015-01-17 17:20:34   e_du_Rollo_Luminosity_ru_STATE 0.7
     2015-01-11 19:21:26   e_du_Rollo_Master_STATE an
     2015-01-14 08:10:06   e_du_Rollo_Zeit_ho_STATE 06:40
     2015-01-17 17:20:34   state           cmd_1
   Condition:
     0          InternalDoIf('du_Rollo_Master','STATE','') or InternalDoIf('du_Rollo_Zeit_ho','STATE','') or InternalDoIf('du_Rollo_Zeit_ho_WE','STATE','') or InternalDoIf('du_Rollo_Luminosity_ru','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_start','STATE','') or InternalDoIf('du_Rollo_Zeit_ru_ende','STATE','')
   Devices:
     0           du_Rollo_Master du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
     all         du_Rollo_Master du_Rollo_Zeit_ho du_Rollo_Zeit_ho_WE du_Rollo_Luminosity_ru du_Rollo_Zeit_ru_start du_Rollo_Zeit_ru_ende
   Do:
     0          modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF]
   Helper:
     last_timer 0
     sleeptimer -1
   Internals:
     0           du_Rollo_Master:STATE du_Rollo_Zeit_ho:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE
     all         du_Rollo_Master:STATE du_Rollo_Zeit_ho:STATE du_Rollo_Zeit_ho_WE:STATE du_Rollo_Luminosity_ru:STATE du_Rollo_Zeit_ru_start:STATE du_Rollo_Zeit_ru_ende:STATE
   State:
Attributes:
   do         always
   room       LichtRollo


[Off-Topic]
MMn wäre es ja schick mit dem global initialized Event die DOIFs zu aktualisieren.
Aber da bin ich irgendwie nicht weiter gekommen.
[/Off-Topic]

Vielleicht hast Du dazu noch eine Idee?

maxritti

Hm, das war wohl einfacher als gedacht:

Ein Notify auf dem global:INITIALIZED und dieses triggert mein DOIF, welches die anderen DOIFs aus den Dummies aktualisiert.

Vielleicht nicht best practice, aber es scheint zu funktionieren.
Zumindest sind die Readings der DOIFs nun nach einem Neustart korrekt befüllt.  :)

Danke Dir Brockmann für die Hilfe.

Internals:
   CFGFN
   DEF        global:INITIALIZED trigger di_Rollo_SetTime
   NAME       no_GlobalInitialized
   NOTIFYDEV  global
   NR         180
   NTFY_ORDER 50-no_GlobalInitialized
   REGEXP     global:INITIALIZED
   STATE      2015-01-21 12:38:34
   TYPE       notify
Attributes:
   group      notify
   room       LichtRollo


Brockmann

Zitat von: maxritti am 21 Januar 2015, 12:42:19
Hm, das war wohl einfacher als gedacht:

Ein Notify auf dem global:INITIALIZED und dieses triggert mein DOIF, welches die anderen DOIFs aus den Dummies aktualisiert.
Es geht sogar noch einfach: Du könntest das DOIF direkt durch global:INITIALIZED triggern lassen, ungefähr so:
DOIF ([global:?initialized])(modify di_EG_ku_RO_StrasseLinks ...

Aber wieso verwendest Du überhaupt für jedes Rollo ein eigenes DOIF, wenn die alle identisch sind? Wäre da nicht eine STRUCTURE mit allen Rollos sinnvoller? Ein Befehl (und ein DOIF) und alle Rollos gehen hoch oder runter.

maxritti

Zitat von: Brockmann am 21 Januar 2015, 12:52:55
Es geht sogar noch einfach: Du könntest das DOIF direkt durch global:INITIALIZED triggern lassen, ungefähr so:
DOIF ([global:?initialized])(modify di_EG_ku_RO_StrasseLinks ...
Gute Idee. Das werde ich heute abend mal umbauen.

Zitat von: Brockmann am 21 Januar 2015, 12:52:55
Aber wieso verwendest Du überhaupt für jedes Rollo ein eigenes DOIF, wenn die alle identisch sind? Wäre da nicht eine STRUCTURE mit allen Rollos sinnvoller? Ein Befehl (und ein DOIF) und alle Rollos gehen hoch oder runter.
Die sind nicht wirklich alle gleich.

Und zwar habe ich ein paar Rollos an Türen, dort gibt es dann u.U. Tür/Fensterkontakte, welche noch mit in die DOIFs einfliessen. Also Tür auf oder zu und Rollo war oben oder unten, dann bitte wieder den "alten" Zustand herstellen.
Andere Rollos gehen zur Südseite, wo ich dann anhand des gemittelten Ertrages meiner PV Anlage die Rollos ein wenig  hoch- und runterfahre. Aber nur dann, wenn ein PV-Dummy den Wert "an" hat.
Und andere bleiben oben, wenn der Master Dummy auf bspws. "Weihnachten" steht, damit man die Aussenweihnachtsbeleuchtung begutachten kann  ;D

Schon ein wenig umfangreicher das ganze wie ich finde.