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

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

Vorheriges Thema - Nächstes Thema

Damian

Neue Features:

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

Für Attribute: cmdpause, repeatcmd, repeatsame, waitsame, waitdel, wait können nun Berechnungen mit Angabe von Readings , Stati, Perl-Funktionen durchgeführt werden. Das Trennzeichen Doppelpunkt oder Komma innerhalb von Klammern und Anführungszeichen ist geschützt und gilt dort nicht als Trennzeichen.

Beispiel:

attr my_di repeatcmd myfunc():Attr("device","attr",""):[mydevice:myreading]*10


cmdState kann nun auch für Sequenzen cmd1_1, cmd1_2 usw. benutzt werden, es sind ebenfalls Angaben von Readings, Stati und Perlfunktionen möglich.

Beispiel:

attr my_di cmdState  erster [mydevice:myreading], zweiter {([mydevice:myreading]*2)}|"Text für cmd2, Komma als Trennzeichen oder Pipe-Zeichen | lässt sich innerhalb von Anführungszeichen schützen"
attr my_di state Der Status lautet [my_di]


Doku muss noch aktualisiert werden.

Gruß

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

Per

Zitat von: Damian am 19 März 2016, 22:12:40cmdState kann nun auch für Sequenzen cmd1_1, cmd1_2 usw. benutzt werden
Das geht schonmal :D



Ich bin immer wieder begeistert, wie manche den Überblick behalten, ich habe schon bei der Anwendung von DOIF meine Problem...

Damian

#2
Neue Version im ersten Post:

Auszug aus der Doku:

Zitat
Status des Moduls   back

Der Status des Moduls wird standardmäßig mit cmd_1, cmd_2, usw., bzw. cmd1_1 cmd1_2 usw. für Befehlssequenzen belegt. Dieser lässt sich über das Attribut "cmdState" mit Komma bzw. | getrennt umdefinieren:

attr <DOIF-modul> cmdState <Status für cmd1_1>,<Status für cmd1_2>,...| <Status für cmd2_1>,<Status für cmd2_2>,...|...

Beispiele:

attr di_lamp cmdState on|off

Pro Status können ebenfalls Stati oder Readings in eckigen Klammern oder Perlfunktionen sowie Berechnungen in Klammern der Form {(...)} angegeben werden.
Die Trennzeichen Komma und | sind in Klammern und Anführungszeichen geschützt und gelten dort nicht als Trennzeichen.

Zustände cmd1_1, cmd1 und cmd2 sollen wie folgt umdefiniert werden:

attr di_mytwilight [mytwilight:ss_astro], {([mytwilight:twilight_weather]*2+10)}|My attribut is: {(Attr("mydevice","myattr",""))}

...

Readingauswertung nur beim Event des jeweiligen Readings   back

Standardmäßig werden angegebene Readings ausgewertet, wenn irgend ein Event des angegebenen Devices triggert. Möchte man gezielt nur dann ein angegebenes Reading auswerten, wenn sich nur dieses ändert, so lässt sich das mit dem Attribut checkReadingEvent einschränken.

Beispiel:

define di_lamp ([[mytwilight:ss_weather]])(set lamp on)
attr di_lamp do always
attr di_lamp checkReadingEvent 1

Ohne checkReadingEvent, würde alle fünf Minuten die Einschaltzeit der Lampe neu gesetzt werden, da das twilight-Modul regelmäßig andere Reading wie z. B. das light-Reading ändert und damit Events erzeugt. Durch die Angabe des Attributes checkReadingEvent wird die Zeit nur dann neu gesetzt, wenn sich tatsächlich das Reading ss_weather ändert.

Eindeutige Statuserkennung   back

Bei Änderungen des Readings state wird in FHEM standardmäßig, im Gegensatz zu allen anderen Readings, der Readingname hier: "state: " im Event nicht vorangestellt. Möchte man eindeutig eine Statusänderung eines Moduls erkennen, so lässt sich das mit dem Attribut addStateEvent bewerksteligen. Bei Statusänderungen eines Devices wird bei der Angabe des Attributes addStateEvent im Event "state: " vorangestellt, darauf kann man dann gezielt im DOIF-Modul triggern.

Beispiel:

define di_lamp ([FB:"^state: on$"]) (set lamp on)
attr di_lamp do always
attr di_lamp addStateEvent

Triggerung durch selbst ausgelöste Events   back

Standardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst.
Wenn das Attribut selftrigger ungleich Null gesetzt ist, kann das DOIF-Modul auf selbst ausgelöste Events reagieren. Dazu müssen die entsprchenden Kommandos mit wait verzögert werden.

Setzen der Timer mit Event   back

Wenn das Attribut timerevent ungleich Null gesetzt ist, wird beim Setzen der Timer im DOIF-Modul ein Event erzeugt. Das kann z. B. bei FHEM2FHEM nützlich sein, um die Timer-Readings zeitnah zu aktualisieren.

Gruß

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

Ellert

ZitatMöchte man gezielt nur dann ein angegebenes Reading auswerten, wenn sich nur dieses ändert, so lässt sich das mit dem Attribut checkReadingEvent einschränken.

Betrifft das tatsächlich nur Änderungen oder auch Aktualisierungen des Readings?

Damian

Zitat von: Ellert am 25 März 2016, 10:58:18
Betrifft das tatsächlich nur Änderungen oder auch Aktualisierungen des Readings?

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

Ellert

Hallo Damian,

ich habe die Kurzreferenz angepasst.
Grundlage ist die Version hier aus dem 1. Beitrag, runtergeladen am 25.3.

Schöne Feiertage
Ellert

Damian

Zitat von: Ellert am 26 März 2016, 13:47:06
Hallo Damian,

ich habe die Kurzreferenz angepasst.
Grundlage ist die Version hier aus dem 1. Beitrag, runtergeladen am 25.3.

Schöne Feiertage
Ellert

OK. Ich habe es übernommen.

Gruß

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

Damian

Was man vielleicht noch erwähnen sollte: In der dieser Version wird Zeilenumbruch \n gegen ein Leerzeichen ersetzt.
Damit braucht man kein Leerzeichen am Zeilenende anzugeben. Das musste man insb. in der Bedingung bei and oder or Operatoren bisher tun.

Gruß

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

Damian

#8
Ich habe Version 0.3 im ersten Post angehängt.

Ich habe das letzte Problem bei der Zeitumstellung korrigiert.

Desweiteren habe ich den Einleitungstext in der Doku umgeschrieben. In der Hoffnung, dass es jetzt auch für Einsteiger verständlicher ist.

Edit:

Hatte vergessen zu schreiben, dass Angaben bei allen Attributen mit Sekundenangaben erweitert wurden.

Auszug aus Doku zu wait:

ZitatStatt Sekundenangaben können ebenfalls Stati, Reading in eckigen Klammen Perl-Funktionen sowie Perl-Berechnung angegeben werden. Dabei werden die Trennzeichen Komma und Doppelpunkt in Klammern geschützt und gelten dort nicht als Trennzeichen.<br>
Diese Angaben können ebenfalls bei folgenden Attributen gemacht werden: cmdpause, repeatcmd, repeatsame, waitsame, waitdel<br>

Gruß

Damian

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

FunkOdyssey

#9
Hinweis am Rande:

PERL WARNING: Use of uninitialized value in pattern match (m//) at ./FHEM/98_DOIF.pm line 1158.
...
PERL WARNING: Use of uninitialized value $tailBlock in string ne at ./FHEM/98_DOIF.pm line 207.
...
PERL WARNING: Use of uninitialized value $_ in pattern match (m//) at ./FHEM/98_DOIF.pm line 942.
...
PERL WARNING: substr outside of string at ./FHEM/98_DOIF.pm line 127.
PERL WARNING: Use of uninitialized value $tailBlock in string ne at ./FHEM/98_DOIF.pm line 210





Bei mir hat sich etwas zum Vorteil geändert, was ich mir aber nicht erklären kann. Ich habe ein DOIF welches alle 60 Sekunden eine Überprüfung vornimmt. Aber zu 99% muss das DOIF keine Umschaltung vom cmd_1 auf cmd_2 oder ähnliches vornehmen. Dennoch wurde das Log vollgemüllt. Mit der neuen Version bleibt das Log plötzlich leer. Schön, aber vielleicht nicht richtig?
Und es spielt keine Rolle ob mit "checkReadingEvent" oder ohne.

2016-03-31_14:00:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:01:03
2016-03-31_14:00:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:01:03
2016-03-31_14:01:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:02:03
2016-03-31_14:01:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:02:03
2016-03-31_14:02:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:03:03
2016-03-31_14:02:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:03:03
2016-03-31_14:03:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:04:03
2016-03-31_14:03:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:04:03
2016-03-31_14:04:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:05:03
2016-03-31_14:04:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:05:03
2016-03-31_14:05:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:06:03
2016-03-31_14:05:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:06:03
2016-03-31_14:06:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:07:03
2016-03-31_14:06:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:07:03
2016-03-31_14:07:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:08:03
2016-03-31_14:07:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:08:03
2016-03-31_14:08:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:09:03
2016-03-31_14:08:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:09:03
2016-03-31_14:09:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:10:03
2016-03-31_14:09:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:10:03
2016-03-31_14:10:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:11:03
2016-03-31_14:10:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:11:03
2016-03-31_14:11:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:12:03
2016-03-31_14:11:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:12:03
2016-03-31_14:12:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:13:03
2016-03-31_14:12:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:13:03

Damian

Zitat von: FunkOdyssey am 31 März 2016, 14:16:25
Hinweis am Rande:

PERL WARNING: Use of uninitialized value $tailBlock in string ne at ./FHEM/98_DOIF.pm line 207.
PERL WARNING: Use of uninitialized value $_ in pattern match (m//) at ./FHEM/98_DOIF.pm line 942.


Wie sieht die dazugehörige Definition aus?

Zitat
Bei mir hat sich etwas zum Vorteil geändert, was ich mir aber nicht erklären kann. Ich habe ein DOIF welches alle 60 Sekunden eine Überprüfung vornimmt. Aber zu 99% muss das DOIF keine Umschaltung vom cmd_1 auf cmd_2 oder ähnliches vornehmen. Dennoch wurde das Log vollgemüllt. Mit der neuen Version bleibt das Log plötzlich leer. Schön, aber vielleicht nicht richtig?
Und es spielt keine Rolle ob mit "checkReadingEvent" oder ohne.

2016-03-31_14:00:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:01:03
2016-03-31_14:00:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:01:03
2016-03-31_14:01:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:02:03
2016-03-31_14:01:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:02:03
2016-03-31_14:02:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:03:03
2016-03-31_14:02:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:03:03
2016-03-31_14:03:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:04:03
2016-03-31_14:03:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:04:03
2016-03-31_14:04:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:05:03
2016-03-31_14:04:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:05:03
2016-03-31_14:05:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:06:03
2016-03-31_14:05:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:06:03
2016-03-31_14:06:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:07:03
2016-03-31_14:06:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:07:03
2016-03-31_14:07:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:08:03
2016-03-31_14:07:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:08:03
2016-03-31_14:08:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:09:03
2016-03-31_14:08:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:09:03
2016-03-31_14:09:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:10:03
2016-03-31_14:09:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:10:03
2016-03-31_14:10:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:11:03
2016-03-31_14:10:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:11:03
2016-03-31_14:11:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:12:03
2016-03-31_14:11:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:12:03
2016-03-31_14:12:03 di_zustandsanzeige timer_1_c1: 31.03.2016 14:13:03
2016-03-31_14:12:03 di_zustandsanzeige timer_2_c2: 31.03.2016 14:13:03


Das Setzen der Timer erzeugt keine Events, wenn man das neue Attribut "timerevent" nicht gesetzt hat.

Das sieht nicht nach der neuen Version aus.

Gruß

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

FunkOdyssey

#11
Ich hatte in letzter Zeit hier im Forum über verschiedene DOIF-Probleme berichtigt und diese wohl in diesem Thread ein wenig verwechselt.

checkReadingEvent ist also dafür, wenn ich das DOIF nur auf ein bestimmtes Reading (Condition) reagieren soll und nicht wenn sich anderweitige Readings ändern.

timerevent würde theoretisch wieder dafür sorgen, dass meine DOIF-Logs wieder vollgemüllt werden. Das habe ich nun verstanden.

Gute Features!

Zitat von: Damian am 31 März 2016, 16:27:44
Das sieht nicht nach der neuen Version aus.

Das Log im letzten Post bezog sich auf die vorherige offizielle DOIF-Version.

Zitat von: Damian am 31 März 2016, 16:27:44
Wie sieht die dazugehörige Definition aus?

Ich hatte den Beitrag gestern mehrfach um weitere Fehler erweitert. Ich habe gestern an mehreren DOIF herumgespielt. Ich denke, dass die Warnungen nur bei Änderung der DOIFs reagieren. Im Laufe des Tages sind keine weiteren hinzugekommen. Ich versuche mal, mich an die Fehlerquelle heranzutasten.




Nachtrag:
Ich benötige es eigentlich gar nicht. Aber ich habe es gerade ausprobiert. Ich wollte (wie vorher) die regelm. Timer-Aktualisierungen bei einigen DOIFs reproduzieren. Ich habe also timerevent hinzugefügt. Das hat aber scheinbar nicht gereicht. Ich musste zusätzlich checkReadingEvent entfernen. Das ist wahrscheinlich gewollt, aber auf dem ersten Blick nicht direkt erkennbar. Vielleicht etwas für die Doku.

Damian

Zitat von: FunkOdyssey am 01 April 2016, 11:09:08
I
Ich benötige es eigentlich gar nicht. Aber ich habe es gerade ausprobiert. Ich wollte (wie vorher) die regelm. Timer-Aktualisierungen bei einigen DOIFs reproduzieren. Ich habe also timerevent hinzugefügt. Das hat aber scheinbar nicht gereicht. Ich musste zusätzlich checkReadingEvent entfernen. Das ist wahrscheinlich gewollt, aber auf dem ersten Blick nicht direkt erkennbar. Vielleicht etwas für die Doku.

checkReadingEvent und timerevent haben nichts miteinander gemeinsam.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Das habe ich wohl verstanden, aber dennoch funktionierte timerevent erst dann, wenn ich checkReadingEvent entfernt hatte.

(
[[twilight:ss_indoor]-[twilight:sr]]
)
(set lampe on)
DOELSE
(set lampe off)

Damian

#14
Zitat von: FunkOdyssey am 01 April 2016, 15:59:31
Das habe ich wohl verstanden, aber dennoch funktionierte timerevent erst dann, wenn ich checkReadingEvent entfernt hatte.

(
[[twilight:ss_indoor]-[twilight:sr]]
)
(set lampe on)
DOELSE
(set lampe off)


Ich habe es gerade bei mit getestet: Das kann ich nicht bestätigen, bei mir funktioniert alles, wie beschrieben.

Edit:
Natürlich schränkt checkReadingEvent die Aktualisierung des Timers auf den Trigger des Reading, aber wenn er aktualisiert wird, dann gibt es auch ein Timer-Event.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF