[GELÖST] - DOIF triggert nicht mehr

Begonnen von 87insane, 17 April 2019, 13:17:37

Vorheriges Thema - Nächstes Thema

87insane

Hallo zusammen,

nachdem meine "letzter Wecker" Funktion nun ein paar Wochen/Monate lief, geht diese nun nicht mehr.

Was soll sie machen?
1. Ein Wecker wird via Alexa gestellt.
2. Sobald FHEM dies mitbekommt, wertet ein notify aus, welcher der letzte Wecker ist.
3. Nach der Auswertung, setzt das notify ein Reading (LastAlarm).
4. Ein DOIF soll dann diese Zeit nehmen und ein Rollo hoch fahren.

Nach mir unbekannten Ereignissen, reagiert nun das DOIF nicht mehr. Das Reading wird gesetzt.

notify:
defmod n_letzter_wecker notify (ECHO_123:alarm_.._status:.(on|off)) {\
my $k = "0";;\
my $alarmoff = "0";;\
my $schleifennr = "1";;\
my $lastalarmalexa = "0";;\
#Log 1, "VOR SCHLEIFE lastalarmalexa: $lastalarmalexa";;\
foreach $k (1..ReadingsVal("$NAME", "AlarmCount", ""))\
{\
$schleifennr = sprintf("%02d", $k);;\
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");;\
$wecker =~ s/:00.000$//;;\
#Log 1, "IN SCHLEIFE lastalarmalexa: $lastalarmalexa";;\
#Log 1, "IN SCHLEIFE schleifennr: $schleifennr wecker: $wecker lastalarmalexa: $lastalarmalexa";;\
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa") \
{\
$lastalarmalexa = $wecker;;\
#Log 1, "GEFUNDEN lastalarmalexa: $lastalarmalexa";;\
}\
\
elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off") \
{\
$alarmoff = $alarmoff + 1;;\
\
if ($alarmoff eq ReadingsVal("$NAME", "AlarmCount", "")) \
{\
$lastalarmalexa = "keiner";;\
#Log 1, "KEIN lastalarmalexa: $lastalarmalexa";;\
}\
}\
}\
        fhem("setreading $NAME LastAlarm $lastalarmalexa")\
}

Das notify wirft entweder eine Zeit im Format HH:MM rauß oder aber das Wort "keiner". Dieses landet dann im Reading LastAlarm des Alexa Gerätes.


doif:
([["ECHO_123:LastAlarm"]] and ["ECHO_123:LastAlarm"] ne "keiner")
(set sz_rollo pct 0)
DOELSEIF ([00:15])

Das DOIF soll die Uhrzeit des Readings nehmen und dann das Rollo hoch fahren. Das soll aber nur passieren, wenn in dem Reading nicht "keiner" steht.
Vor ein paar Minuten habe ich das so angepasst. Vorher war anstelle von "keiner" immer die Zahl "0" wenn kein Wecker gestellt war. Das fand ich doof und
wurde an anderer Stelle bereits bemängelt.

Problem ist also nun:
- Wenn kein Wecker gestellt ist bekomme ich einen Fehler: error: Wrong timespec : either HH:MM:SS or {perlcode} im DOIF angezeigt. Logisch da es keine Zeit ist. Das DOIF geht sicherlich noch besser !
- Das schlimmere Problem, DOIF reagiert nicht mehr auf die gestellte Zeit. Es wird ein EVENT erzeugt durch das notify, wenn LastAlarm beschrieben wird. DOIF nimmt sich dieses aber nur dann, wenn ich im DOIF auf DEF klicke und danach speichere. Das ist nun seit ca. 2 Wochen so. Vorher lief das ohne Probleme.


PS: Hier wurde bereits darüber etwas geschrieben... https://forum.fhem.de/index.php/topic,99538.msg930995.html#msg930995


EDIT: Lösung am Ende...

CoolTux

So kann das auch nicht gehen.


([[ECHO_123:"LastAlarm"]] and [?ECHO_123:LastAlarm] ne "keiner")
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

87insane

Habe gerade auch bemerkt das die " Probleme machen. Diese waren vorher auch nicht.

So sah es ganz original aus:
([[ECHO_90F00818720600GX:LastAlarm]] and [ECHO_90F00818720600GX:LastAlarm] ne "0")
(set sz_rollo pct 0)
DOELSEIF ([00:15])


So ging es ganz lange... Teste mal eben deins und melde mich dann.

Kannst du mir noch verraten warum vor dem Gerät ein ? in der zweiten Bedingung ist? Habe das des öfteren bereits gesehen aber nicht selber gebraucht bisher.

87insane

#3
Geht leider auch nicht.

LastAlarm wird beschrieben, wie gewollt.

EventMonitor:
2019-04-17 14:28:48 echodevice ECHO_123 alarm_02_status: on
2019-04-17 14:28:48 echodevice ECHO_123 LastAlarm: 18:35


DOIF List:
Internals:
   CFGFN      ./FHEM/Tasmota.cfg
   DEF        ([[ECHO_123:"LastAlarm"]] and [?ECHO_123:LastAlarm] ne "keiner")
(set sz_rollo pct 0)
DOELSEIF ([00:15])
   MODEL      FHEM
   NAME       di_letzter_wecker_rollos
   NR         103
   NTFY_ORDER 50-di_letzter_wecker_rollos
   STATE      initialized
   TYPE       DOIF
   VERSION    18890 2019-03-13 18:56:41
   READINGS:
     2019-04-17 14:27:34   cmd             0
     2019-04-17 14:27:34   mode            enabled
     2019-04-17 14:27:34   state           initialized
     2019-04-17 14:27:34   timer_01_c01    18.04.2019 00:00:00
     2019-04-17 14:27:34   timer_02_c02    18.04.2019 00:15:00
   Regex:
     accu:
   attr:
     cmdState:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday) and ::ReadingValDoIf($hash,'ECHO_123','LastAlarm') ne "keiner"
     1          ::DOIF_time_once($hash,1,$wday)
   days:
   devices:
   do:
     0:
       0          set sz_rollo pct 0
     1:
       0         
     2:
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   intervalfunc:
   itimer:
     all         ECHO_123
   localtime:
     0          1555538400
     1          1555539300
   realtime:
     0          00:00:00
     1          00:15:00
   time:
     0          [ECHO_123:"LastAlarm"]
     1          00:15:00
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1555538400:
       localtime  1555538400
       hash:
     1555539300:
       localtime  1555539300
       hash:
   uiState:
   uiTable:


Zumindest ist nun der Bug weg, wenn ich auf DEF klicke und dann speichere im DOIF wird nun nicht mehr die Zeit gesetzt. Jetzt bekommt nun das DOIF garnichts mehr mit....
Sobald man die "" im Trigger Teil des DOIF entfernt ist das verhalten wieder da.

INFO: Bei manuellem setzen durch setreading ECHO_123 LastAlarm 11:40 bekommt DOIF dies sofort mit.

nils_

mal eine andere anmerkung (auch im verlinkten thread aufgefallen!):
bitte poste _vollständige_ lists oder codes. du editierst da anscheinend immer gerne drin rum. (Anführungszeichen auf einmal da, Kommentare hinter readings, usw usf.)
Manche dieser Dinge sind für den Helfer aber wichtig bzw. die Dinge würden so wie sie gepostet sind nicht funktionieren....
viele Wege in FHEM es gibt!

87insane

Verständlich! Immer ein guter Hinweis...

Hier habe ich lediglich Dinge entfernt, die unwichtig sind.
- Geräte bzw. Device ID
- Den richtigen Namen meiner Alexa
- Meistens nehme ich BT MACs noch rauß

Kommentare werde ich nicht mehr machen. Die schreibe ich dann drunter/drüber (außerhalb des CODES).




Habe nach wie vor aber keine weitere Idee. Selbst der Code von CoolTux triggert nicht.
Vllt. fehlt mir hier Verständnis... Ich stelle mir das so vor:
notify setzt LastAlarm -> LastAlarm wird gesetzt und triggert / EVENT -> DOIF kennt dann die Zeit und würde entsprechend los legen.

Was soll das DOIF machen bzw. was macht es dieser Logik nach?
([[ECHO_123:LastAlarm]] and [?ECHO_123:LastAlarm] ne "keiner")

([[Gerätename:Reading]] and [?Gerätename:Reading] ne "keiner")
([[Trigger-Zeit]] und [?Bedingung] nicht/ungleich "keiner")


87insane

#6
Hat keiner eine Idee oder Fragen oder so?

Habe nun x Sachen probiert. Alles ohne Erfolg.
Aktuell steht das hier im DOIF.

([[ECHO_123:"LastAlarm"]] and [?ECHO_123:LastAlarm] ne "keiner")
(set sz_rollo pct 0)
DOELSEIF ([00:15])

Habe vorhin das DOIF einfach mal fest auf eine Zeit gesetzt, vorher einen Wecker gestellt und danach habe ich mir ausgeben lassen, was denn zu diesem Zeitpunkt in [ECHO_123:"LastAlarm"] steht. Das passt soweit alles.

Zudem habe ich mal auf das folgende gekürzt:
([[ECHO_123:"LastAlarm"]])
(set sz_rollo pct 0)
DOELSEIF ([00:15])

Wenn ich das Wiki korrekt verstehe, würde nun aus einem dummy oder bei mir eben das Alexa-Device, einfach die Zeit aus dem Reading im Trigger stehen.
Leider ist dem nicht so. Aus einem mir nach wie vor unklarem Grund wird weiterhin nichts getriggert. Bei einem festem Zeitwert, geht es ohne Probleme.

Was kann ich testen? Was kann ich ggf. an Fragen beantworten? Wie kann ich hier weiter kommen?

Habe selbst meine Datensicherung mal ausgepackt und geschaut ob ich aus versehen etwas geändert habe. Das Ergebnis ist das ich nichts geändert habe.... (Notepad++ Compare).
Das notify habe ich an letzter Stelle angepasst, da dies eine gute Idee war von einem Kollegen hier im Forum (Name gerade nicht im Kopf). Das setzt nach wie vor auch die korrekten
Zeiten in das Reading. Ein Event wird auch immer erzeugt... Habe ich ggf. eine lib oder irgendwas nicht mehr auf meinem Raspi, was hier wichtig ist? Irgendwas muss sich ja geändert
haben.... :\

PS: Mit "" bei dem Trigger Reading nimmt er garkeine Zeit. Ohne nimmt er sie wenn man das DOIF neu speichert. Also DEF und dann modify... (was darunter steht um die DEF zu speichern).

Ellert

Sieh Dir in der deutschsprachigen Befehlsreferenz zu DOIF den Punkt indirekte Zeitangaben an, dort ist beschrieben welcher Inhalt und welche Syntax erlaubt ist.

87insane

Dann verstehe ich es nicht. ([[Gerät:Reading]]) ist doch so vorgegeben....

Damian

Du hast ein Ereignis in Anführungszeichen angegeben, aber kein Reading ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

87insane

Ursprünglich war das ganze ohne "". Habe das nur eingefügt da jemand hier sagte mach mal so.

Es gibt ein reading aber natürlich auch ein Event wenn es beschrieben wird.  LastAlarm im alexa gerät.

Entweder ist mein Problem zu einfach für die meisten hier oder aber ich hab es ggf. falsch erklärt. Selten gab es so wenig Feedback hier.

Ellert

#11
Zitat von: 87insane am 18 April 2019, 06:16:31
Ursprünglich war das ganze ohne "". Habe das nur eingefügt da jemand hier sagte mach mal so.

Es gibt ein reading aber natürlich auch ein Event wenn es beschrieben wird.  LastAlarm im alexa gerät.

Entweder ist mein Problem zu einfach für die meisten hier oder aber ich hab es ggf. falsch erklärt. Selten gab es so wenig Feedback hier.
Der Thread hier fängt aber so
Zitat[["ECHO_123:LastAlarm"]]
mit "" an.
Erstell 2 Readings, eins mit fehlerfreien Timer und ein anderes  Reading mit der Angabe, ob der Timer ausgewertet werden soll oder nicht. Vielleicht funktioniert das besser.

Merkwürdig ist, dass es in Deinem DOIF 2 Timer gibt.
     2019-04-17 14:27:34   timer_01_c01    18.04.2019 00:00:00
     2019-04-17 14:27:34   timer_02_c02    18.04.2019 00:15:00

Das sollte nicht sein falls LastAlarm tatsächlich eine Zeit im Format HH:MM liefern sollte.

87insane

Guten Morgen :)

ursprünglich war es so und es lief auch einige Zeit so...
defmod letzter_wecker_rollos DOIF ([[ECHO_123:LastAlarm]] and [ECHO_123:LastAlarm] ne "0")\
(set sz_rollo pct 0)\
DOELSEIF ([00:15])


Danach ging es auf einmal nicht mehr. Den zweiten Timer habe ich da ich ich DOELSEIF auf 00:15 gestellt habe. Dies ist um doalways aus dem Weg zu gehen. War auch mal ein Tipp hier im Forum.

ZitatErstell 2 Readings, eins mit fehlerfreien Timer und ein anderes  Reading mit der Angabe, ob der Timer ausgewertet werden soll oder nicht. Vielleicht funktioniert das besser.
Wie meinst du das?

Hast du ggf. weitere Fragen? Hatte den Link zum Ursprungs-Post mal mit angehangen, da ich dachte es würde helfen. Kann aber auch verstehen, wenn nicht jeder alles liest. Würde ich vermutlich auch nicht tun.

Ellert

Wenn das

defmod letzter_wecker_rollos DOIF ([[ECHO_123:LastAlarm]] and [ECHO_123:LastAlarm] ne "0")\
(set sz_rollo pct 0)\
DOELSEIF ([00:15])


nicht funktioniert und die Daten die ECHO liefert o.k. sind, dann ist mehr kaputt als ich mir vorstellen kann.

Funktioniert die Definition  mit einem Dummy, statt mit ECHO, Du solltest dann mal eine Testumgebung erstellen, mit der Du das probieren kannst.

Per

Mach mal sechs DOIF_Readings:
attr letzter_wecker_rollos DOIF_Readings test1:"ECHO_123:LastAlarm",test2:["ECHO_123:LastAlarm"],test3:[["ECHO_123:LastAlarm"]],test4:ECHO_123:LastAlarm,test5:[ECHO_123:LastAlarm],test6:[[ECHO_123:LastAlarm]]