Neue Features - $SELF, $self, cmd-Reading, timerevent, selftrigger ...

Begonnen von Damian, 19 März 2016, 22:12:40

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Oh, sorry. Mein Fehler.
Ich aktualisiere mal. Da sind wohl ein paar Versionen an mir vorübergegangen.

Sheridan

Ich habe mit selftrigger 1 etwas rumgespielt und meines Erachtens einen Fehler gefunden. Einfache Testumgebung:


define dmyIfTest dummy
define ifTest DOIF ([dmyIfTest] eq "on") (set dmyIfTest off)
attr ifTest selftrigger 1
attr ifTest wait 5


mache ich nun set dmyIfTest on wird dieses durch ifTest nach 5 Sekunden ausgeschaltet. Das ifTest sieht dann aber so aus (es hat das off zwar gesehen, ist aber noch in cmd_1):

fhem> list ifTest
Internals:
   CFGFN
   DEF        ([dmyIfTest] eq "on") (set dmyIfTest off)
   NAME       ifTest
   NR         993
   NTFY_ORDER 50-ifTest
   STATE      cmd_1
   TYPE       DOIF
   Helper:
     Dblog:
       Cmd:
         Dblog:
           TIME       1461013100.6452
           VALUE      1
       Cmd_event:
         Dblog:
           TIME       1461013100.6452
           VALUE      dmyIfTest
       Cmd_nr:
         Dblog:
           TIME       1461013100.6452
           VALUE      1
       State:
         Dblog:
           TIME       1461013100.6452
           VALUE      cmd_1
       Wait_timer:
         Dblog:
           TIME       1461013100.6211
           VALUE      no timer
   Readings:
     2016-04-18 22:58:20   Device          dmyIfTest
     2016-04-18 22:58:20   cmd             1
     2016-04-18 22:58:20   cmd_event       dmyIfTest
     2016-04-18 22:58:20   cmd_nr          1
     2016-04-18 22:58:20   e_dmyIfTest_STATE off
     2016-04-18 22:58:20   state           cmd_1
     2016-04-18 22:58:20   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'dmyIfTest','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
   Devices:
     0           dmyIfTest
     all         dmyIfTest
   Do:
     0:
       0          set dmyIfTest off
     1:
   Helper:
     event      off
     globalinit 1
     last_timer 0
     sleepdevice dmyIfTest
     sleepsubtimer -1
     sleeptimer -1
     timerdev   dmyIfTest
     timerevent off
     triggerDev dmyIfTest
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   Internals:
     0           dmyIfTest:STATE
     all         dmyIfTest:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       5

Entsprechend wird beim nächsten Versuch dmyIfTest auch nicht mehr abgeschaltet. Mache ich dagegen nochmal explizit selbst ein set dmyIfTest off sieht das ifTest so aus und funktioniert wieder (jetzt ist es in cmd_2 gewechselt):

fhem> list ifTest
Internals:
   CFGFN
   DEF        ([dmyIfTest] eq "on") (set dmyIfTest off)
   NAME       ifTest
   NR         993
   NTFY_ORDER 50-ifTest
   STATE      cmd_2
   TYPE       DOIF
   Helper:
     Dblog:
       Cmd:
         Dblog:
           TIME       1461013212.23423
           VALUE      2
       Cmd_event:
         Dblog:
           TIME       1461013212.23423
           VALUE      dmyIfTest
       Cmd_nr:
         Dblog:
           TIME       1461013212.23423
           VALUE      2
       State:
         Dblog:
           TIME       1461013212.23423
           VALUE      cmd_2
       Wait_timer:
         Dblog:
           TIME       1461013100.6211
           VALUE      no timer
   Readings:
     2016-04-18 23:00:12   Device          dmyIfTest
     2016-04-18 23:00:12   cmd             2
     2016-04-18 23:00:12   cmd_event       dmyIfTest
     2016-04-18 23:00:12   cmd_nr          2
     2016-04-18 23:00:12   e_dmyIfTest_STATE off
     2016-04-18 23:00:12   state           cmd_2
     2016-04-18 22:58:20   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'dmyIfTest','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) eq "on"
   Devices:
     0           dmyIfTest
     all         dmyIfTest
   Do:
     0:
       0          set dmyIfTest off
     1:
   Helper:
     event      off
     globalinit 1
     last_timer 0
     sleepdevice dmyIfTest
     sleepsubtimer -1
     sleeptimer -1
     timerdev   dmyIfTest
     timerevent off
     triggerDev dmyIfTest
     timerevents:
       off
     timereventsState:
       state: off
     triggerEvents:
       off
     triggerEventsState:
       state: off
   Internals:
     0           dmyIfTest:STATE
     all         dmyIfTest:STATE
   Itimer:
   Readings:
   Regexp:
     0:
     All:
   State:
   Trigger:
Attributes:
   selftrigger 1
   wait       5


Offenbar bekommt das ifTest zwar das off Event (dank selftrigger) mit, aber schaltet dann nicht in den richtigen cmd_2 Modus. Ohne das wait Attribut bekommt es übrigens auch das off nicht mit, aber es steht ja in der Doku, dass wait verwendet werden muss. Ein zusätzliches DOELSE () nützt ferner auch nichts. Der cmd_2 Status existiert ja.

Ich hatte mein ursprüngliches spezielleres Problem in einem eigenen Thread gepostet, bevor ich auf die neuste DOIF-Version mit selftrigger hingewiesen wurde. Jetzt konnte ich aber dieses Verhalten hardwareunabhängig mit dem dummy-Device nachstellen.

Viele Grüße,
-Sheridan
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

rrr


FunkOdyssey

#63
Mir fällt gerade etwas bzgl. cmdState auf.

Ich habe drei CMDs mit jeweils verschiedenen Sequenzen.
- cmd1_1
- cmd1_2
- cmd2_1
- cmd2_2
- cmd3_1
- cmd3_2

Ich habe/hatte bisher folgendes Attribut:
cmdState   JalAuf|JalHalb|JalZu
Für
cmd1_1 bis cmd1_2|cmd2_1 bis cmd2_2|cmd3_1 bis cmd3_2

Wenn mein DOIF aber (hier Jalousiensteuerung) mit cmd2_2 durch ist und ich bei den Sequenzen nicht weiter unterschieden habe, wird nun NICHT mehr JalAuf angezeigt.

Bin ich nun verpflichtet, für jede Sequenz ein cmdState zu definieren?




Oder auch in kurz:
Bei cmd1_1 habe ich kurz den STATE "JalAuf". Dieser wird mit cmd1_2 direkt wieder cmd1_2 überschrieben.

Ellert

Wenn Du nur den Endzustand benötigst, könntest Du versuchen den cmd_x_1 leer mit einem Komma angeben.
cmdState   ,JalAuf|,JalHalb|,JalZu

FunkOdyssey

Danke für den Tipp. Ich rette mich wohl irgendwie. Notfalls definiere ich das halt mehrmals identisch.
Ich dachte nur, dass das evtl. ein Bug ist.
Schließlich kann ich beim wait-Attribut & Co. auch eine Zahl definieren, die über alle Teilsequenzen gültig wird.

Ellert

ZitatSchließlich kann ich beim wait-Attribut & Co. auch eine Zahl definieren, die über alle Teilsequenzen gültig wird.

Du hast die Wirkung falsch gedeutet. Der Wait-Timer wirkt nur auf die 1. Sequenz. Für 2. Sequenz ist der ausgelassene Timer standartmässig 0. So, auch beim cmdState, Deine Angaben gelten für die 1. Sequenz. Für die 2. Sequenz wurde die Angabe ausgelassen, daher wird der Standartwert angezeigt. Mit dem Komma schiebst Du Deine Angaben eine Sequenz weiter. Das wäre beim Wait-Timer auch der Fall, dann würde die 2. Sequenz verzögert werden, und die Erste nicht. Die zu beobachtende Gesamtverzögerung wäre gleich.

FunkOdyssey

Tatsache. Dann habe ich das wirklich falsch gedeutet.
Ich bin ja schon froh, dass du mich überhaupt verstanden hast. :-)
Ich wusste nicht genau, wie ich es beschreiben soll.

Per

Zitat von: Damian am 19 März 2016, 22:12:40Attribut selftrigger erlaubt Selbsttriggerung über Wait
Schau mal bitte hier nach, ob es da Zusammenhänge gibt.


Zitat von: Damian am 19 März 2016, 22:12:40cmdState kann nun auch für Sequenzen cmd1_1, cmd1_2 usw. benutzt werden
Wäre es möglich, wenn nur ein Eintrag (trotz mehrerer Sequenzen) existiert, diesen für den ganzen Zweig zu nehmen? Damit blieb die Abwärtskompatibilität erhalten. Wer wirklich explizit keinen Namen vergeben will, kann ja mit leeren Einträgen arbeiten. Aber das dürfte im rein akademischen Bereich angesiedelt sein.

Damian

Zitat von: Per am 23 April 2016, 00:07:27
Schau mal bitte hier nach, ob es da Zusammenhänge gibt.

Selftrigger ist immer mit Vorsicht zu genießen. Die Probleme, die sich ergeben z. B. hier https://forum.fhem.de/index.php/topic,52354.0.html und im obigen Beispiel liegen darin begründet, dass beim Auslösen eines Triggers z. B. DOIF (Bedingung) (set dummy on), der dazugehörige Status des DOIF-Moduls noch nicht gesetzt wird, sondern noch der vorherige Status existiert. Das geht auch nicht anders, da der Befehl zu diesem Zeitpunkt noch nicht abgeschlossen ist - er könnte auch einen Fehler liefern). Dadurch funktioniert der Mechanismus der internen Zustandsauswertung (ohne do always) nicht. Daher, wenn man mit Selftrigger arbeitet, am besten nur eigenen Status auswerten, der ja immer korrekt gesetzt ist, wenn er den Trigger auslöst.

Zitat
Wäre es möglich, wenn nur ein Eintrag (trotz mehrerer Sequenzen) existiert, diesen für den ganzen Zweig zu nehmen? Damit blieb die Abwärtskompatibilität erhalten. Wer wirklich explizit keinen Namen vergeben will, kann ja mit leeren Einträgen arbeiten. Aber das dürfte im rein akademischen Bereich angesiedelt sein.

Muss ich mir mal genauer anschauen. Ich denke ich werde Selftrigger so erweitern, dass man Selftrigger wait und Selfttrigger all (auch ohne wait) angeben kann, damit würde der Selftrigger immer funktionieren, wie früher mal. Allerdings sollte jeder wissen, dass spätestens in der zweiten Rekursionstiefe FHEM die Kette unterbricht.

Gruß

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

FunkOdyssey

Zitat von: Per am 23 April 2016, 00:07:27
Wäre es möglich, wenn nur ein Eintrag (trotz mehrerer Sequenzen) existiert, diesen für den ganzen Zweig zu nehmen? Damit blieb die Abwärtskompatibilität erhalten. Wer wirklich explizit keinen Namen vergeben will, kann ja mit leeren Einträgen arbeiten. Aber das dürfte im rein akademischen Bereich angesiedelt sein.

Das habe ich nun unfreiwillig ausprobiert und das DOIF hat daraufhin gar nicht mehr funktioniert.
Ich hatte cmdState für 1_1, 1_2, etc. gleich betitelt. Und es wurde merkwürdigerweise kein einziger Ausführungsteil ausgeführt. Egal. Ich arbeite nun einfach ohne cmdState.

satprofi

Zitat von: Damian am 19 März 2016, 22:12:40
Neue Features:

Attribut selftrigger erlaubt Selbsttriggerung über Wait
Attribut timerevent erzeugt Events beim Setzen von Timern


Gruß

Damian

Hallo.
Mit aktuellem DOIF finde ich diese 2 neuen Attr nicht. Heute update gemacht.
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

FunkOdyssey

Mit der Version aus dem SVN?
Oder die Version aus dem ersten Posts des Threads?
afaik ist die Version noch nicht veröffentlicht. :-)

satprofi

achso. dann muss ich mir die einspielen.
thx
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

Damian

Version 0.14 im ersten Post.

-kleine Korrekturen

-Attribut Selftrigger wait|all

-Doku angepasst.


Gruß

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