[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]]

87insane

#15
Mit dem Dummy muss ich nachher mal testen.
Die DOIFs für z.B. Sonnen auf/untergang funktionieren nach wie vor. Habe aktuell aber auch nur drei DOIFs. Sonnenaufgang, Sonnenuntergang und den letzten Wecker.

Mehr als du dir vorstellen kannst... Kannst du denn ein paar Punkte zum prüfen nennen? Ich vermute das es ggf. mit dem Raspberry Update zu tun hat oder aber mit den Paketquellen die hinterlegt sind. Leider kann ich das nicht zu 100% sagen, da ich nicht zu 100% weiß ob es im Zusammenhang steht.
Fest steht, ein Event wird erzeugt. notifys zb. triggern nach wie vor korrekt. Wenn ich dieses DOIF neu anlege (hatte ich zum testen probiert), geht es auch nicht. Teste es, wie oben schon gesagt, wie du vorgeschlagen hast....

Weitere Hinweise sind gerne erwünscht :)


@Per: Deins teste ich auch gleich, DANKE

87insane

#16
Habe mal die DOIF_Readings angelegt...

Zuerst habe ich einen Wecker gestellt auf 6:45. Dieser wurde auch direkt im Alexa Device eingetragen und nach Auswertung in LastAlarm geschrieben.

List -r:
Nach gestelltem Wecker.

define di_letzter_wecker_rollos DOIF ([[ECHO_123:LastAlarm]] and [?ECHO_123:LastAlarm] ne "keiner")\
(set sz_rollo pct 0)\
DOELSEIF ([00:15])
attr di_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]]
attr di_letzter_wecker_rollos room hidden

setstate di_letzter_wecker_rollos cmd_2
setstate di_letzter_wecker_rollos 2019-04-18 00:15:00 cmd 2
setstate di_letzter_wecker_rollos 2019-04-18 00:15:00 cmd_event timer_2
setstate di_letzter_wecker_rollos 2019-04-18 00:15:00 cmd_nr 2
setstate di_letzter_wecker_rollos 2019-04-17 19:06:53 mode enabled
setstate di_letzter_wecker_rollos 2019-04-18 00:15:00 state cmd_2
setstate di_letzter_wecker_rollos 2019-04-18 13:42:57 test1 ECHO_123:LastAlarm
setstate di_letzter_wecker_rollos 2019-04-18 13:40:05 test2 0
setstate di_letzter_wecker_rollos 2019-04-18 13:42:57 test3 ARRAY(0x46e3e70)
setstate di_letzter_wecker_rollos 2019-04-18 13:42:57 test4 error in DOIF_Readings: Bareword "ECHO_123" not allowed while "strict subs" in use, line 1.\

setstate di_letzter_wecker_rollos 2019-04-18 13:42:57 test5 06:45
setstate di_letzter_wecker_rollos 2019-04-18 13:42:57 test6 error in DOIF_Readings: syntax error, line 1, near "ECHO_123:"\

setstate di_letzter_wecker_rollos 2019-04-17 19:07:44 timer_01_c01 error: Wrong timespec keiner: either HH:MM:SS or {perlcode}
setstate di_letzter_wecker_rollos 2019-04-18 00:15:00 timer_02_c02 19.04.2019 00:15:00


Danach stellte ich den Wecker aus und es erschien in LastAlarm "keiner", wie gewünscht. Das interessiert das DOIF auch schon nicht. Ergebnis bei List -r ist genau das gleiche wie bei dem ersten hier.


PS: Ich finde die Art so etwas zu testen, sehr gut! Kannte ich nicht und wird mir sicher an einigen Stellen helfen! Danke für den Tipp!

Ich selber sehe hier nicht wie ich weiter kommen würde. Das einzige Reading, welches reagiert ist test5. Nachdem ich den Wecker auf 6:45 hatte, danach wieder auf keiner und zum Schluss nochmal auf 7:10. Es blieb immer 6:45 stehen. Ich denke die 6:45 sind auch nur stehen geblieben da das DOIF frisch war, durch das DOIF_Readings setzen.

Das mit dem dummy mache ich als nächstes. Hoffe aber hier ggf. schon auf Erkenntnisse.
PS: Weiß nur noch nicht so recht wie. Da setreading (manuell) auch das DOIF triggert. Nur aus dem notify nicht mehr. Auch der Lösungsansatz über readingsSingleUpdate( $defs{$NAME}, 'LastAlarm', $lastalarmalexa,1); hatte keine Veränderung gebracht.

Danke und Gruß,
Kai

Per

Zitat von: 87insane am 18 April 2019, 13:55:21da das DOIF frisch war
Zumindest für die Tests solltest du do always einschalten.
Das sollte allerdings keinen Einfluss auf die DOIF_Readings haben, nur auf das DOIF selbst.

87insane

#18
ERKENNTNIS!

Nachdem ich nun alles ein wenig umgebogen habe...

- Das notify schreibt nun einfach in ein anderes device den LastAlarm...
- DOIF soll nun auch auf das andere Gerät reagieren...
- Alles auf das andere Gerät gedreht...
- Test mit mehreren Weckern...

Da geht das ganze.... Also muss es an dem Alexe Device liegen?
Habe das Alexe Device neu angelegt, ohne Erfolg.

Kann der Ersteller des Module eine Art Sperre oder so einbauen? Wie kann sowas entstehen?

EDIT: Hab mir nun einen dummy dauerhaft dafür angelegt. Ist in meinen Augen am Ende eh besser und übersichtlicher. ABER mich würde trotzdem interessieren warum das nun nicht mehr anders geht...

List:
Internals:
   CFGFN     
   FUUID      5cb86f41-f33f-fcb4-00d6-81aee0b8e0e72a75
   NAME       du_wecker
   NR         792
   STATE      Status: Es ist kein Wecker gestellt
   TYPE       dummy
   READINGS:
     2019-04-18 15:12:36   LastAlarm       keiner
Attributes:
   alias      Letzer Wecker
   group      Wecker
   room       FHEM / Info
   stateFormat {my $text = "Status: "; if(ReadingsVal("$name","LastAlarm","") eq "keiner") {return $text."Es ist kein Wecker gestellt";} else {return $text."Letzter Wecker um ".ReadingsVal("$name","LastAlarm","")."Uhr";} }

Ellert

#19
ZitatABER mich würde trotzdem interessieren warum das nun nicht mehr anders geht...
Diese Frage würde ich in dem entsprechenden Forenbereich stellen.

Edit: Ich seh' gerade, Du meinst nicht das Echogerät.

87insane

#20
Doch doch... das meine ich... Ich kann ein x beliebiges Gerät nehmen wohin das Reading geschrieben wird. Nur in das Echo Gerät geht es nicht mehr. Hatte gedacht das es ggf. hier, bei den Profis, auch jemand weiß. Für mich ist das Thema noch nicht beendet, da ich gerne verstehe was das Problem ist/war. Sonst müsste ich immer wieder fragen und das mag ich gern vermeiden. Ich stelle ja schon immer genug Fragen :-\

Anbei mal das DOIF und NOTIFY für die Nachwelt. Ggf. bringt es jemandem was...

notify - Wertet den letzten Wecker aus und schreibt die Zeit dessen in ein Device-Reading:

(ECHO_NAME_ANPASSEN:alarm_.._status:.(on|off)) {
my $k = "0";
my $alarmoff = "0";
my $schleifennr = "1";
my $lastalarmalexa = "0";

foreach $k (1..ReadingsVal("$NAME", "AlarmCount", ""))
{
$schleifennr = sprintf("%02d", $k);
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");
$wecker =~ s/:00.000$//;

if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa")
{
$lastalarmalexa = $wecker;
}

elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off")
{
$alarmoff = $alarmoff + 1;

if ($alarmoff eq ReadingsVal("$NAME", "AlarmCount", ""))
{
$lastalarmalexa = "keiner";
}
}
}
        fhem("setreading du_wecker LastAlarm $lastalarmalexa")
}

Das Ergebnis dieses Notifys ergibt immer eine Zeit im Format HH:MM oder das Wort "keiner", wenn kein Wecker aktiv ist.

DOIF - reagiert auf die ausgewertete Zeit des notifys und macht dann etwas:
([du_wecker:LastAlarm] and [?du_wecker:LastAlarm] ne "keiner")
(set sz_rollo pct 0)
DOELSEIF ([00:15])


Ein zusätzliches Reading im Alexa Gerät ist notwendig um das Reading AlarmCount zu erstellen und aktuell zu halten. Das ist notwendig da der Alarmcount im Modul immer hoch zählt und nicht direkt den ganz-Wert anzeigt.
AlarmCount {my $anz = grep( m/alarm_.._status/, ( keys %{$hash->{READINGS}} )); return $anz;}
Einfach in Userreadings einfügen.

Anbei auch noch der Dummy, wie ich ihn aktuell nutze:
defmod du_wecker dummy
attr du_wecker alias Letzer Wecker
attr du_wecker stateFormat {my $text = "Status: ";; if(ReadingsVal("$name","LastAlarm","") eq "keiner") {return $text."Es ist kein Wecker gestellt";;} else {return $text."Letzter Wecker um ".ReadingsVal("$name","LastAlarm","")."Uhr";;} }

87insane

Guten Morgen nochmal zusammen,

nun hat es heute Nacht wieder nicht geklappt. Da ich das DOIF umstellt hatte, hat er um 0 Uhr das Rollo hoch gefahren. Ich komme nicht ganz klar wenn ich anstelle von "0", "keiner" nehme. Der Trigger von DOIF erwartet in der Form eine Zeitangabe. Wenn aber kein Wecker aktiv ist, soll auch nichts passieren.

Das hier ist das DOIF, mit keiner...
([du_wecker:LastAlarm] and [?du_wecker:LastAlarm] ne "keiner")
(set sz_rollo pct 0)
DOELSEIF ([00:15])


Das hier ist das DOIF mit 0...
([[du_wecker:LastAlarm]] and [du_wecker:LastAlarm] ne "0")
(set az_steckdose_stehlampe relay0 on)
DOELSEIF ([00:15])


Das zweite geht. Aber generell, was macht man wenn der Trigger-Wert eine Zeit sein kann aber auch ein Wort? Aktuell habe ich alles wieder auf "0" umgestellt, da dies auch immer lief.
Zum einen ist das mit der Bedingung so ne Sache, die geht ohne ? genau wie mit... Zum anderen muss ich wohl doppelte [[]] beim trigger nehmen, da die Zeit aus einem anderen Gerät kommt und da mag er es garnicht wenn dort ein Wort drin steht: ehler: error: Wrong timespec : either HH:MM:SS or {perlcode}. Wenn man im Trigger nun einfach noch "" um das Reading packt, dann nimmt er sich keiner Zeit mehr an.

Vielleicht gibt es ja sogar ganz andere Lösungen für ein solches Konstrukt. Ich bin gerne bereit zu lernen und zu verbessern...

Damian

Zitat von: 87insane am 19 April 2019, 09:21:06
Guten Morgen nochmal zusammen,

nun hat es heute Nacht wieder nicht geklappt. Da ich das DOIF umstellt hatte, hat er um 0 Uhr das Rollo hoch gefahren. Ich komme nicht ganz klar wenn ich anstelle von "0", "keiner" nehme. Der Trigger von DOIF erwartet in der Form eine Zeitangabe. Wenn aber kein Wecker aktiv ist, soll auch nichts passieren.

Das hier ist das DOIF, mit keiner...
([du_wecker:LastAlarm] and [?du_wecker:LastAlarm] ne "keiner")
(set sz_rollo pct 0)
DOELSEIF ([00:15])



Das hier ist das DOIF mit 0...
([[du_wecker:LastAlarm]] and [du_wecker:LastAlarm] ne "0")
(set az_steckdose_stehlampe relay0 on)
DOELSEIF ([00:15])


Das zweite geht. Aber generell, was macht man wenn der Trigger-Wert eine Zeit sein kann aber auch ein Wort? Aktuell habe ich alles wieder auf "0" umgestellt, da dies auch immer lief.
Zum einen ist das mit der Bedingung so ne Sache, die geht ohne ? genau wie mit... Zum anderen muss ich wohl doppelte [[]] beim trigger nehmen, da die Zeit aus einem anderen Gerät kommt und da mag er es garnicht wenn dort ein Wort drin steht: ehler: error: Wrong timespec : either HH:MM:SS or {perlcode}. Wenn man im Trigger nun einfach noch "" um das Reading packt, dann nimmt er sich keiner Zeit mehr an.

Vielleicht gibt es ja sogar ganz andere Lösungen für ein solches Konstrukt. Ich bin gerne bereit zu lernen und zu verbessern...

Wie ich schon man zu diesem Konstrukt geschrieben habe, wird mit 0 im Reading die Zeit auf 00:00 gesetzt, nicht gültige Zeitangaben führen zu einer Fehlermeldung.

Eine saubere Lösung wäre statt "keiner", 0 oder sonst etwas Ungültiges zu setzen, das DOIF in diesem Falle per set <mein DOIF> disable in den "inaktiv"-Modus zu versetzen und zum Aktivieren set <mein DOIF> enable. Das sollte man von außen mit einem anderen DOIF/notify machen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

87insane

Manchmal kann es zu einfach sein...

Habe es mal angepasst. Geht sicher besser aber ich glaube so läuft es....

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 schleifennr: $schleifennr wecker: $wecker lastalarmalexa: $lastalarmalexa";
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa")
{
$lastalarmalexa = $wecker;
}

elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off")
{
$alarmoff = $alarmoff + 1;
}
}
        if ($alarmoff eq ReadingsVal("$NAME", "AlarmCount", ""))
{
fhem("setreading du_wecker mode disabled");
fhem("set di_letzter_wecker_rollos disable");
}
elsif ($alarmoff ne ReadingsVal("$NAME", "AlarmCount", ""))
{
fhem("setreading du_wecker mode enabled");
fhem("setreading du_wecker LastAlarm $lastalarmalexa");
fhem("set di_letzter_wecker_rollos initialize");
}
}


DOIF:

([[du_wecker:LastAlarm]])(set sz_rollo pct 0)
DOELSEIF ([00:15])


Dummy zur Anzeige:
defmod du_wecker dummy
attr du_wecker alias Letzer Wecker
attr du_wecker group Wecker
attr du_wecker room FHEM / Info
attr du_wecker stateFormat {my $text = "Status: ";;;; if(ReadingsVal("$name","mode","") eq "disabled") {return $text."Es ist kein Wecker gestellt";;;;} else {return $text."Letzter Wecker um ".ReadingsVal("$name","LastAlarm","")."Uhr";;;;} }


Danke Dir! Nehme auch gerne noch mehr Ideen entgegen. Vermutlich gehen meine ganzen set´s auch besser...

87insane

Betrachte das aktuell als gelöst.... Läuft mit dem Dummy wieder erste Sahne ;)

popy

Zitat von: 87insane am 18 April 2019, 14:33:44
ERKENNTNIS!

Nachdem ich nun alles ein wenig umgebogen habe...

- Das notify schreibt nun einfach in ein anderes device den LastAlarm...
- DOIF soll nun auch auf das andere Gerät reagieren...
- Alles auf das andere Gerät gedreht...
- Test mit mehreren Weckern...

Da geht das ganze.... Also muss es an dem Alexe Device liegen?
Habe das Alexe Device neu angelegt, ohne Erfolg.

Kann der Ersteller des Module eine Art Sperre oder so einbauen? Wie kann sowas entstehen?

EDIT: Hab mir nun einen dummy dauerhaft dafür angelegt. Ist in meinen Augen am Ende eh besser und übersichtlicher. ABER mich würde trotzdem interessieren warum das nun nicht mehr anders geht...

List:
Internals:
   CFGFN     
   FUUID      5cb86f41-f33f-fcb4-00d6-81aee0b8e0e72a75
   NAME       du_wecker
   NR         792
   STATE      Status: Es ist kein Wecker gestellt
   TYPE       dummy
   READINGS:
     2019-04-18 15:12:36   LastAlarm       keiner
Attributes:
   alias      Letzer Wecker
   group      Wecker
   room       FHEM / Info
   stateFormat {my $text = "Status: "; if(ReadingsVal("$name","LastAlarm","") eq "keiner") {return $text."Es ist kein Wecker gestellt";} else {return $text."Letzter Wecker um ".ReadingsVal("$name","LastAlarm","")."Uhr";} }


Würde mir auch Gerne folgendes bauen:

Alexa alarm_XX parsen und nächste Weckzeit suchen danach einen "Rollo Auf" Job erstellen/aktualisieren.

Da ich durch suchen auf deinen Beitrag gestoßen bin und du Dich anscheinend schon damit beschäftigt hast.
Wärst du so net und könntest Bitte schnell erklären was du umgesetzt hast und wie?  ;D

Danke

87insane

#26
Guten Morgen,

eigentlich ganz einfach....

Zuerst habe ich im betroffenen Alexa Gerät ein eigenes Reading angelegt zum zählen der gesamten Wecker. Das muss sein, da das original Reading nicht immer korrekt ist.
AlarmCount {my $anz = grep( m/alarm_.._status/, ( keys %{$hash->{READINGS}} )); return $anz;}

ergibt

AlarmCount 17, bei mir zum aktuellen Zeitpunkt.


Danach habe ich mir folgende Funktion gebaut. Diese macht nichts anderes, als zu prüfen welcher der LETZTE, AKTIVE Wecker ist. Kannst du natürlich einfach umdrehen, in ERSTE, aktive Wecker oder was auch immer. Nachdem herausgefunden wurde ob der letzter Wecker existiert und welche Zeit er hat, setzt das wiederum ein DOIF aktiv oder inaktiv - Damit das Rollo/die Rollos auch machen was ich möchte. Zudem habe ich mir einen  Dummy gebaut, der mir anzeigt wann das ganze Spiel los geht und ob ein Wecker aktiv ist.

defmod n_letzter_wecker notify (ECHO_123456: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 schleifennr: $schleifennr wecker: $wecker lastalarmalexa: $lastalarmalexa";;\
if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa") \
{\
$lastalarmalexa = $wecker;;\
}\
\
elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off") \
{\
$alarmoff = $alarmoff + 1;;\
}\
}\
        if ($alarmoff eq ReadingsVal("$NAME", "AlarmCount", "")) \
{\
fhem("setreading du_wecker mode disabled");;\
fhem("set di_letzter_wecker_rollos disable");;\
}\
elsif ($alarmoff ne ReadingsVal("$NAME", "AlarmCount", "")) \
{\
fhem("setreading du_wecker mode enabled");;\
fhem("setreading du_wecker LastAlarm $lastalarmalexa");;\
fhem("set di_letzter_wecker_rollos initialize");;\
}\
}
attr n_letzter_wecker disable 0
attr n_letzter_wecker room hidden


DOIF:
defmod di_letzter_wecker_rollos DOIF ([[du_wecker:LastAlarm]])(set sz_rollo pct 0)\
DOELSEIF ([00:15])
attr di_letzter_wecker_rollos room hidden


Dummy:
defmod du_wecker dummy
attr du_wecker alias Letzer Wecker
attr du_wecker group Wecker
attr du_wecker icon clock
attr du_wecker room FHEM / Info
attr du_wecker stateFormat {my $text = "Status: ";;;; if(ReadingsVal("$name","mode","") eq "disabled") {return $text."Es ist kein Wecker gestellt";;;;} else {return $text."Letzter Wecker um ".ReadingsVal("$name","LastAlarm","")." Uhr";;;;} }



Sieht viel aus, ist aber schnell gemacht, da du ja nur copy/paste machen muss und ggf. anpassen an deine Bedürfnisse. Hast du noch Fragen? Gerne! Hab mich zu Anfang so sehr geärgert, bis ich das hinbekommen habe. Deswegen finde ich das gerade echt gut, dass jemand das auch haben mag :)

Danke und Gruß,
Kai

popy

Zitat von: 87insane am 24 Januar 2020, 07:41:03
Guten Morgen,

eigentlich ganz einfach....

Danke Kai für deine Zeit das rauszusuchen!

Habe in der Zwischenzeit auch schon gelöst allerdings mit einem Notify + _at - funktioniert gut.
Er sucht mir den nächsten aktivierten Wecker heraus setzt ein _at um dass Rollo 10 Minuten später ein Stück in die Höhe zu fahren  ;)

Hier das notify:


Internals:
   DEF        ECHO_Show_SZ_.*:alarm.* {

my $nearest_alarm_timestamp = 0;

#Log 1, "act_on_SZ_Alexa_Alarm: name: ".$NAME." event: ".$EVENT;

#step over all echos
my @echos = ( "ECHO_Show_SZ_Tobi", "ECHO_Show_SZ_Stefi");
foreach ( @echos ) {
#Do Echo has Alarms?
if(ReadingsNum($_,"alarm_count",0) > 0)
{
#Yes, we have at least an alarm -> loop trough it
#Log 1, "act_on_SZ_Alexa_Alarm: wir haben count: ".ReadingsNum($_,"alarm_count",0);
my @a = (1..ReadingsNum($_,"alarm_count",0));
for my $i (@a){
#is the alarm activated
my $num_str = sprintf ("%02d", $i);
if(ReadingsVal($_,"alarm_".$num_str."_status","off") eq "on")
{
my $alarm_sec_timestamp = time_str2num(ReadingsVal($_,"alarm_".$num_str."_originalDate","2020-01-01")." ".substr(ReadingsVal($_,"alarm_".$num_str."_originalTime","00:00:00.000"),0,8));
#Log 1, "act_on_SZ_Alexa_Alarm: ".$_.": ".$i." is on: ".ReadingsVal($_,"alarm_".$num_str."_originalDate","2020-01-01")." ".ReadingsVal($_,"alarm_".$num_str."_originalTime","00:00:00.000")." - sec: ".$alarm_sec_timestamp;

if(($nearest_alarm_timestamp == 0) || ($alarm_sec_timestamp < $nearest_alarm_timestamp))
{
#Log 1, "act_on_SZ_Alexa_Alarm: ".$_.": alarm ".$i." is smaller than".$nearest_alarm_timestamp." - using it!";
$nearest_alarm_timestamp = $alarm_sec_timestamp;
}
}
}
}
}


#set new rollo/sunrise job
fhem("delete job_SZ_Alarm");
if($nearest_alarm_timestamp == 0)
{
Log 1, "act_on_SZ_Alexa_Alarm: no alarm set, disabling blind/sunrise job!";
}else{
$nearest_alarm_timestamp = $nearest_alarm_timestamp + 600;
if($nearest_alarm_timestamp > time)
{
Log 1, "act_on_SZ_Alexa_Alarm: enabling blind/sunrise job @ alarm + 10 Min = ".FmtDateTime($nearest_alarm_timestamp);
fhem("define job_SZ_Alarm at ".$nearest_alarm_timestamp." {Log 1, 'job_SZ_Alarm: Rollo auf, es ist Zeit aufzustehen!'} ;; set BLIND_SZ bri 150");
}else{
Log 1, "act_on_SZ_Alexa_Alarm: ignoring alarm to set because its in the past! ".FmtDateTime($nearest_alarm_timestamp)." <> current time: ".FmtDateTime(time);
}
}
}
   FUUID      5e236307-f33f-0e94-fe22-905e33deb96a584a
   NAME       act_on_SZ_Alexa_Alarm
   NOTIFYDEV  ECHO_Show_SZ_.*
   NR         327
   NTFY_ORDER 50-act_on_SZ_Alexa_Alarm
   REGEXP     ECHO_Show_SZ_.*:alarm.*
   STATE      active
   TYPE       notify
   READINGS:
     2020-01-24 21:38:39   state           active
Attributes:
   alias      Prüfe Alexa Wecker für Rollo
   group      Schlafzimmer
   icon       clock
   room       System


vll. kanns ja auch mal jemand brauchen.

pOpY