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

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

Vorheriges Thema - Nächstes Thema

Ellert

Habe ich korrigiert, commandref_join.pl meldet keine Fehler.

Damian

#46
Zitat von: Ellert am 07 April 2016, 20:35:22
Habe ich korrigiert, commandref_join.pl meldet keine Fehler.

Version 0.12:

cmd-Reading wird jetzt mit 0 vorbelegt bei Initialisierung.

Jetzt gibt es zusätzlich auch eine Perl-Variable $cmd in der Bedingung. Damit spart man bei Abfragen weitere Zeichen. $cmd entspricht dem Reading cmd.

Beispiel

Toggel-Schalter über Zustandsabfrage des Moduls:

([Trigger:""] and $cmd == 2) (set lamp off)
DOELSEIF ( [Trigger:""] and $cmd <= 2) (set lamp on)


Edit:

oder einfach:

([Trigger:""] and $cmd == 2) (set lamp off) DOELSE (set lamp on)

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

Ellert

Ich habe die Kurzreferenz angepasst auf Grundlage der Version 0.12, commandref_join.pl meldet keine Fehler für DOIF.

Damian

Zitat von: Ellert am 08 April 2016, 10:16:24
Ich habe die Kurzreferenz angepasst auf Grundlage der Version 0.12, commandref_join.pl meldet keine Fehler für DOIF.
OK. Ich werde noch die restliche Doku anpassen und dann langsam einchecken, bevor mir wieder was einfällt ;)


Gruß

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

Ralli

Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

Damian

Zitat von: Ralli am 08 April 2016, 11:16:03
... da wäre noch was auf der Liste: https://forum.fhem.de/index.php/topic,47979.msg416359.html#msg416359

8) Duck und wech ...

ja, steht auf der todo-Liste, wie auch das Neuaufsetzen eines wait-Timers nach einem Restart oder checkall-Attribut und noch ein paar andere Dinge. Allerdings werde ich irgendwann dann die Überschrift auf "Features Weihnachten 2016" ändern müssen ;)



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

Per

#51
Ein bestimmt schnell zu behebender Fehler mit aber derben Auswirkungen ist mir noch aufgefallen (V 0.12):
Bei der Verwendung von wait wird der Befehlsspeicher nicht geleert.
Beispiel
([Trigger1]) (Com1.1) (Com1.2)
DOELSEIF ([Trigger2]) (Com2.1)
wait 1,1:1
wird nach Com2.1 noch Com1.2 ausgführt, inkl. waittimer.
Verwende ich gleichviel Commandos
([Trigger1]) (Com1.1) (Com1.2)
DOELSEIF ([Trigger2]) (Com2.1) ()
wait 1,1:1,0

passt es.
Falls es sich mit dem Kurzbeispiel nicht nachvollziehen lässt, kann ich auch noch ein reales nachliefern.

Außerdem habe ich das Problem, dass bei do always der waittimer nicht zurück gesetzt wird, bei do resetwait schon, aber nicht auf cmd x.1, sondern der aktuelle :-\.
Da ich aber das erste Mal den waittimer aktiv beobachtet und resetwait eingesetzt habe, kann das auch ne andere Ursache haben.

Was mir noch aufgefallen ist, weiss aber nicht, ob das an fhem.pl oder 98_DOIF.pm liegt:
TAB vor DOELSE(IF) wird problemlos erkannt und umgesetzt, danach nicht, da muss zwingend ein Leerzeichen stehen. Ich kann damit leben, ich formatiere meine Quelltexte halt nur gern, weil ich sonst schnell den Überblick verliere.

Damian

Zitat von: Per am 10 April 2016, 09:53:23
Ein bestimmt schnell zu behebender Fehler mit aber derben Auswirkungen ist mir noch aufgefallen (V 0.12):
Bei der Verwendung von wait wird der Befehlsspeicher nicht geleert.
Beispiel
([Trigger1]) (Com1.1) (Com1.2)
DOELSEIF ([Trigger2]) (Com2.1)
wait 1,1:1
wird nach Com2.1 noch Com1.2 ausgführt, inkl. waittimer.
Verwende ich gleichviel Commandos
([Trigger1]) (Com1.1) (Com1.2)
DOELSEIF ([Trigger2]) (Com2.1) ()
wait 1,1:1,0

passt es.
Falls es sich mit dem Kurzbeispiel nicht nachvollziehen lässt, kann ich auch noch ein reales nachliefern.

Außerdem habe ich das Problem, dass bei do always der waittimer nicht zurück gesetzt wird, bei do resetwait schon, aber nicht auf cmd x.1, sondern der aktuelle :-\.
Da ich aber das erste Mal den waittimer aktiv beobachtet und resetwait eingesetzt habe, kann das auch ne andere Ursache haben.

Was mir noch aufgefallen ist, weiss aber nicht, ob das an fhem.pl oder 98_DOIF.pm liegt:
TAB vor DOELSE(IF) wird problemlos erkannt und umgesetzt, danach nicht, da muss zwingend ein Leerzeichen stehen. Ich kann damit leben, ich formatiere meine Quelltexte halt nur gern, weil ich sonst schnell den Überblick verliere.

Ich vermute, dass es ein Verständnisproblem ist. Ich habe es gerade bei mir getestet und alles funktioniert wie beabsichtigt.

bei cmd:

nach 1.1 (state cmd_1_1) kommt 1.2 (im Status steht cmd_1). Die Belegung von cmd ist anders als von State. Das ist für die Eindeutigkeit wichtig.

im DOELESIF-Fall gibt es nur cmd_2 im Status und das entspricht im cmd-reading 2, da es keine Sequenz gibt.

Bei do always wird kein Timer zurückgesetzt, wenn es sich um das gleiche Kommando handelt, das ist normal und beabsichtigt.

Es werden intern mit "\s" Zeichen zum nächsten Kommando überlesen und damit sollte nicht nur Leerzeichen, sondern auch Tab genauso funktionieren.

In der Weboberfläche kann ich kein Tab eingeben, ich editiere nicht die cfg-Datei


Gruß

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

Per

Zitat von: Damian am 10 April 2016, 11:58:09
Ich vermute, dass es ein Verständnisproblem ist. ...
Durchaus möglich.

Vllt. habe ich ja eine spezielle Konstellation, dass es bei mir nicht so klappt wie gewünscht.
Hier mal das vollständige DOIF:
([test2:state] eq "off" and [?$SELF:state] !~ "off" and [?$SELF:state] !~ "trigger") () () ()
DOELSEIF ([test2:state] eq "off" and [?$SELF:state] !~ "off" and [?$SELF:state] !~ "trigger") () () ()
DOELSEIF ([?$SELF:state] =~ "auto" and ([test1] eq "on")) (set test2 on)
DOELSEIF ([$SELF:state] eq "trigger" and ([test1] eq "on")) (set test2 on)
DOELSEIF ([?$SELF:state] =~ "auto" and ([test1] eq "off")) (set test2 off)
DOELSEIF ([$SELF:state] eq "trigger" and ([test1] eq "off")) (set test2 off)

cmdState manu_on,auto_m_on,trigger|manu_off,auto_m_off,trigger|auto_on|auto_on|auto_off|auto_off
wait 0,10,10:0,10,10:1:1:1:1
selftrigger 1
initialize auto_off

test1 und test2 sind einfache Dummys mit setList on off.
Nach auto_on folgt auto_m_on und trigger, danach wieder auto_on.

Zitat von: Damian am 10 April 2016, 11:58:09
Bei do always wird kein Timer zurückgesetzt, wenn es sich um das gleiche Kommando handelt, das ist normal und beabsichtigt.
Sowohl
[?$SELF:state] !~ [?test2:state]
als als auch
[test2:state] and [?$SELF:state] !~ [?test2:state]
ergaben nur einen einzigen Trigger bei Änderung von test2. Oben stehende Variante mit zwei DO-Zeilen hingegen funktioniert wie gewünscht bei jeder Änderung von test2.

Zitat von: Damian am 10 April 2016, 11:58:09
In der Weboberfläche kann ich kein Tab eingeben
Aber einkopieren ;).

Damian

Zitat von: Per am 10 April 2016, 13:39:50
Durchaus möglich.

Vllt. habe ich ja eine spezielle Konstellation, dass es bei mir nicht so klappt wie gewünscht.
Hier mal das vollständige DOIF:
([test2:state] eq "off" and [?$SELF:state] !~ "off" and [?$SELF:state] !~ "trigger") () () ()
DOELSEIF ([test2:state] eq "off" and [?$SELF:state] !~ "off" and [?$SELF:state] !~ "trigger") () () ()
DOELSEIF ([?$SELF:state] =~ "auto" and ([test1] eq "on")) (set test2 on)
DOELSEIF ([$SELF:state] eq "trigger" and ([test1] eq "on")) (set test2 on)
DOELSEIF ([?$SELF:state] =~ "auto" and ([test1] eq "off")) (set test2 off)
DOELSEIF ([$SELF:state] eq "trigger" and ([test1] eq "off")) (set test2 off)

cmdState manu_on,auto_m_on,trigger|manu_off,auto_m_off,trigger|auto_on|auto_on|auto_off|auto_off
wait 0,10,10:0,10,10:1:1:1:1
selftrigger 1
initialize auto_off

test1 und test2 sind einfache Dummys mit setList on off.
Nach auto_on folgt auto_m_on und trigger, danach wieder auto_on.
Sowohl
[?$SELF:state] !~ [?test2:state]
als als auch
[test2:state] and [?$SELF:state] !~ [?test2:state]
ergaben nur einen einzigen Trigger bei Änderung von test2. Oben stehende Variante mit zwei DO-Zeilen hingegen funktioniert wie gewünscht bei jeder Änderung von test2.
Aber einkopieren ;).

Kann doch alles sein: Ausgangszustand cmd_4 (auto_on), cmd_1_1 ist nicht sichtbar weil wait 0, danach kommt cmd_1_2 (auto_m_on), dann cmd_1_2 (trigger), dann durch selbsttrigger cmd_4 (auto_on).

Am besten, wenn du ein Fehlverhalten vermutest, dann speckst du es soweit ab, dass ich es mit paste und copy übernehmen kann, um es nachzuvollziehen.

Alles andere  sind Vermutungen, die sich nicht nachvollziehen lassen, weil zu komplex und zu unvollständig und es ist schade dann um unsere kostbare Zeit, die dafür drauf geht.

Gruß

Damian



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

Per

Zitat von: Damian am 10 April 2016, 15:09:47
cmd_1_1 ist nicht sichtbar weil wait 0
:-[ hast du natürlich recht.
Ich muss aber dennoch auf zwei Abschnitte aufteilen
() (set test2 on)
, weil der state von $SELF zu dem Zeitpunkt anscheind noch nicht gesetzt ist (obwohl es in den readings so angezeigt wird). Interessanterweise hat aber
(set test2 on) () ()
auch funktioniert, deshalb meine Vermutung.

FunkOdyssey

@Damian: Hast du das hier gesehen?
https://forum.fhem.de/index.php?topic=45373.new;topicseen

Nicht, dass nachher doch noch etwas am DOIF geändert werden muss.

Damian

Zitat von: FunkOdyssey am 10 April 2016, 23:35:46
@Damian: Hast du das hier gesehen?
https://forum.fhem.de/index.php?topic=45373.new;topicseen

Nicht, dass nachher doch noch etwas am DOIF geändert werden muss.

$SELF ist aus meiner Sicht nichts besonderes. Dann muss da noch eine Inkonsistenz in der Syntaxhervorhebung geben, das ist aber nicht meine Baustelle.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Ich habe in der Version noch ne Perl-Warnung gefunden:
PERL WARNING: Use of uninitialized value in pattern match (m//) at ./FHEM/98_DOIF.pm line 1168, <FH> line 7512.

Ich kann dir aber leider noch nicht mehr Infos darüber geben.

Damian

Zitat von: FunkOdyssey am 18 April 2016, 14:54:30
Ich habe in der Version noch ne Perl-Warnung gefunden:
PERL WARNING: Use of uninitialized value in pattern match (m//) at ./FHEM/98_DOIF.pm line 1168, <FH> line 7512.

Ich kann dir aber leider noch nicht mehr Infos darüber geben.

Benutzt du die Version 0.12?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF