[Gelöst] - Ausführungsreihenfolge Device und Notify

Begonnen von ftsinuglarity, 08 März 2018, 16:11:20

Vorheriges Thema - Nächstes Thema

ftsinuglarity

#30
Vielen Dank für Eure Antworten und Hinweise.
Eins nach dem anderen ... :)
Zitat von: nils_ am 09 März 2018, 10:59:37
Internals:
   CFGFN      ./configs/wz.cfg

ist nicht unbedingt die bevorzugte bearbeitungsmethode für deine .cfg
das händische editieren kann zu fehlern führen, die dich zur verzweiflung treiben werden:)

Das Thema der direkten Bearbeitung hatte ich ziemlich am Anfang schon einmal ausführlichst hier diskutiert. Damit ging gleich die Popcorntüte durch die Hände von Rudlof/Tux und betateilchen (sorry dafür)
Hat mir nochmal ein paar Vor und Nachteile gezeigt, ich hab die Vorteil der Guibearbeiung durchaus schätzen gelernt.  Seitdem arbeite ich überwiegend damit, aber nicht ausschließlich. Es gibt ein paar Details (umbennenunungen zb), die über die Oberfläche nicht gemacht werden können (weil sich nicht alles betroffene mit umbennent)
Um dann weiter anzupassen muß ich wissen wo was steht.
Zum Umbenennen hab ich mir ein Script dazu gebastelt, was in den betreffenden Dateien sucht und ersetzt. Inclusive der *pm Dateien, ich lagere fast alles aus. Da käme die UI überhaupt nicht ran normalerweise ... Haken ans Umbennen Problem.

Ich hab grad spaßenshalber mal die Zeilen nur in den cfg's gezählt: (ohne Leerzeilen und Kommentare, der reine Code)
cat *cfg |sed /^$/d|grep -v '#' |wc -l
2349 Zeilen
Das ist ohne fhem.cfg. Wenn ich das nicht sinnvoll aufteile, wirds extrem unübersichtlich (und ja, ist zusätzliche Arbeit und kann auch mal einen Reihenfolgenfehler geben .. muß einem klar sein was passieren kann und wo man dann sucht => Erfahrung.
Also ich fahre sehr gut damit, Fehler sind äußerst selten geworden. Für mich passt das perfekt. Zumal wie gesagt einiges mit UI nicht so vollkommen funkioniert. (Ich gebe gern auch mal ein konkretes Beispiel wenn gewünscht, müsste ich aber erst nachstellen)

Ein Sonderfall für die explizite Auslagerung in eine cfg sind Homematic Geräte.  Die haben die Eigenart, wenn ich den fhem-server starte, der RPC Server (vermeintlich) nicht erreichbar ist, fhem mal eben die konfigurierten Homematic Geräte einfach rausschmeißt. Wehe dem, der dann aus Versehen "save" klickt.
Also hab ich eine cfg nur mit dem Homematic Kram, der taucht sonst nirgends auf. Wenn der fhem-dienst startet, prüft er, ob der RPC erreichbar ist. Wenn nicht, includiert er die homematic.cfg nicht und erzeugt dafür einen Timer, der alle 10 Minuten schaut, ob der RPC erreichbar ist. Ist er das, wird die homematic.cfg includiert und fhem neu gestartet.
So reagiere ich jetzt dynamisch. Das geht nur! über eine ausgelagerte cfg.
Also .. es kann auch durchaus richtig sinnvoll sein auszulagern.
Vielleicht gibt es noch eine elegantere Lösung. So funktionierts erstmal gut, kümmer ich mich später drum, es gibt grad zu viele andere Baustellen.




Edit: Das Umbenennen per Script soll keine Aufforderung zur manuellen Bearbeitung sein, in welcher Form auch immer!!
Gerade am Anfang ist die Web-Ui wirklich zu empfehlen, sonst funktionert ganz schnell mal gar nichts mehr, wenn man sich aus Versehen grob Vertut. Ist mir zumindest nicht nur einmal passiert. Wenn ihr es partou nicht lassen könnt, bitte immer! ein (fhem-Voll)Backup vorher, sonst kanns schnell selbstverschuldet frustig werden. Ich spreche aus leidiger Erfahrung. Mittlerweile mache ich das meiste auch über die Oberfläche, weils normalerweise komplett reicht und als Bonus ne Menge Fehler abfängt.
Das immer wieder darauf hingewiesen wird, NICHT manuell zu bearbeiten sollte ernst genommen werden.
Ich bin da auch immer unbelehrbar, dadurch war es aber auch einen unnötig harte Schule, die mich viel Zeit gekostet hat und die Nerven anderer hier im Forum.

ftsinuglarity

#31
Zitat von: marvin78 am 09 März 2018, 08:50:32
Du musst einfach nur die Fragen beantworten und alle Infos liefern. Das ist nicht schwer. Infos selbst filtern ist NIE eine gute Idee, auch nur Teile von subs, Definitionen oder Code zu posten, ist keine gute Idee. Du postest hier in Anfängerfragen, also kannst du immer davon ausgehen, dass jemand, der bestimmte Informationen zur möglichen Lösung haben möchte, es besser beurteilen kann, welche Infos benötigt werden. Das ist nicht Teil eines Lernprozesses, sondern eine einfache logische Folge. Hier gibt es auch keine Abhängigkeit von deinem Kenntnisstand.  Es ist im Grunde egal, ob du dir zutraust, selbst zu entscheiden, was wichtig ist, warum das so ist, hast du hier gesehen. Du sagst selbst, dass dir Kenntnisse fehlen, also gehe davon aus, dass jemand der dir helfen möchte, diese hat und aus gutem Grund nach etwas fragt. Davon auszugehen, dass der Helfer deinen Post nicht richtig gelesen hat, ist erstmal falsch. Das heißt nicht, dass es nicht sein kann, denn es kommt vor, davon auszugehen ist aber falsch.

Die Infos, die du hier lieferst, sind aus meiner Sicht noch immer zu fragmentiert. Deine Antwort liegt aber vermutlich im state.

Ersteinmal .. du hast prinzipiell recht, mit guter Begründung!
>  Du postest hier in Anfängerfragen, also kannst du immer davon ausgehen, dass jemand, der bestimmte Informationen zur möglichen Lösung haben möchte, es besser beurteilen kann, welche Infos benötigt werden.
Nehme ich mir zu Herzen. Ich hatte Anfängerfragen absichtlich ausgewählt, da ich dachte, der Fehler wäre leicht zu fixen und was gundsätzliches, was ich einfach nur noch nicht gecheckt habe.
Ich hör mal auf da Vorrauszudenken und poste im richtigen Abteil.

> ... also kannst du immer davon ausgehen, dass jemand, der bestimmte Informationen zur möglichen Lösung haben möchte, es besser beurteilen kann, welche Infos benötigt werden ... Die Infos, die du hier lieferst, sind aus meiner Sicht noch immer zu fragmentiert.
Ist Nachvollziehbar. Auch da versuch ich das mal koordinierter mit list's und direkteren Antworten.

> Es ist im Grunde egal, ob du dir zutraust, selbst zu entscheiden, was wichtig ist, warum das so ist, hast du hier gesehen.
Da widerspreche ich dir, auch wenn du im Kern recht hast. Ich nehme mal das Beispiel sub's. Was nützt es, mehrere 100 Zeilen Code des subs zu posten, wenn ich feststelle, das ich auch einen komplett andere Funktion aufrufen kann und der gleiche "Fehler" passiert. Somit liegt es eindeutig nicht an der sub. Ich hätte euch aber mit ner Menge Code zugeballert, der nix zu Sache beiträgt. Da haben wir alle besseres zu tun, als uns durch Code zu wühlen, der nicht mal was mit der Ursache zu tun hat.
Das ist denke ich schon eine Entscheidung, (natürlich mit kurzer Begründung), die ich treffen kann.


Abgesehen von diesem Einwand, ich verstehe deine Einwände, finde sie nachvollziehbar und werde mich versuchen mehr daran zu halten. Dank dir.


Edit : Oh, das noch :
>  Davon auszugehen, dass der Helfer deinen Post nicht richtig gelesen hat, ist erstmal falsch. Das heißt nicht, dass es nicht sein kann, denn es kommt vor, davon auszugehen ist aber falsch.
Bevor das falsch verstanden wird: Ich meinte das ich in anderen Foren oft die Erfahrung gemacht habe, das Leute ohne zu lesen einfach irgendwas geantwortet haben. Und das bei einigen Antworten hier mir schnell mal der selbe Gedanke kommt (zB. EventMonitor vs Logs) . Deswegen meine "Verweigerungshaltung" ... hat sich schönerweise als mein Fehler rausgestellt. Schön im Sinne von: Nein, es war keine sinnlose Frage nach dem EventMonitor und hier wird gelesen.


ftsinuglarity

#32
Zitat von: Wzut am 09 März 2018, 07:50:26
Das EDIPLUG Modul macht das auch so, es wird in der Callback Funktion des http Aufrufs die XML Antwort des Device ausgewertet und zusammen mit den anderen Readings in einem  readingsBulkUpdate Block gesetzt.

Mal zurück zum eigentlichen "Problem" ;)
Danke für die Spezifizierung Wzut. Das bei den Ediplugs zumindest eine Rückantwort abzuwarten ist, und das auf die zeitliche Abfolge einen Einfluß hat, dachte ich mir dann im Laufe der Ausführungen hier.
Von den IT's kommt im Gegenbeispiel ja nix. Da wird gesendet, obs ankommt weiß man nicht, es gibt keine Antwort. Somit muß auf die Antwort auch nicht gewartet werden. Sollte dann ein wenig schneller durchlaufen.




Zitat von: CoolTux am 09 März 2018, 05:58:26
Guten Morgen,
Zu erst einmal, schön das Du den Fehler weg bekommen konntest.

Wie das gelesen hatte wusste ich was Du eigentlich wolltest und das Deine Regex nicht zur Aussage passt. Ich hatte ja versucht es Dir schon ein paar Posts weiter oben zu erklären.
Allerdings hast Du Recht mit der Aussage das die Regex nicht hätte früher anspringen dürfen. Um das nun ganz genau zu klären müsste man sich die Timestamps im Device, im Notify und im Eventmonitor anschauen.

Noch mal kurz
Readings haben in der Regel folgenden Event (kurz gefasst)
DEVICE READING: VALUE

Daraus ergibt sich eine Regex
DEVICE:READING:.VALUE

Um nun auf alle VALUES zu reagieren
DEVICE:READING:.*

Die große Ausnahme bildet das state Reading. Hier ist es eigentlich
DEVICE VALUE
Was ja zu Deiner ersten Deiner Regex passen sollte
DEVICE.(VALUE1|VALUE2)

Was da nun genau schief lief damit da noch mehr passiert kann ich Dir leider nicht sagen. Möglich wären nicht sichtbare Sonderzeichen durch das direkte editieren der Konfigdatei. Aber das bringt zu 99,9 Prozent eher eine Fehlermeldung.
Grüße


Wenn ich dich dazu nochmal mit ein, zwei Fragen nerven darf... das Problem ist zwar gefixt, aber ich verstehe immer noch nicht so ganz warum.
Ich gehe es mal von vorn, mit deiner Erläuterung an.

>Readings haben in der Regel folgenden Event (kurz gefasst)
> DEVICE READING: VALUE
Check

>Daraus ergibt sich eine Regex
> DEVICE:READING:.VALUE
Warum der Punkt nach :. ?

> Um nun auf alle VALUES zu reagieren
> DEVICE:READING:.*
Check. Hier gehört der Punkt zur Perl-Wildcard: .* => entspricht allen Values von Reading: READING

> Die große Ausnahme bildet das state Reading. Hier ist es eigentlich
> DEVICE VALUE
> Was ja zu Deiner ersten Deiner Regex passen sollte
> DEVICE.(VALUE1|VALUE2) 
Check. Prinzipiell. (und wieder der Punkt nach DEVICE?) Hier wird auf "state" "on/off" reagiert. 
Ich hätte schreiben müssen:
> DEVICE:onoff:*
Wie wäre das in deiner Notation?  DEVICE:onoff:(VALUE1|VALUE2) ? (noch nicht probiert)

Bis hierher ist mir der Punkt unklar. Die korrekte Notation ist mir auch nicht wirklich zugänglich. Irgendwas macht da noch nicht richtig klick im Kopf, obwohls ersteinmal funktioniert.
Auch ist mir unklar, warum das Notify überhaupt reagiert hat. Das Device "Musik" hat doch eindeutig definiert, was als Event gilt:
event-on-change current,last_Toggle,onoff,power

"state" ist hier nicht definiert. Somit sollte das Event von "state" nicht beim Notify ankommen, und Musik:(on|off|error) hätte ohne Event eigentlich gar nichts machen dürfen.

Eine Erklärung für mich wäre, das "state" auch in der Hinsicht ein Ausnahmefall ist und einfach immer ein Event schickt, egal ob definiert oder nicht.

marvin78

Das ist ein Regex. Der Punkt steht für ein beliebiges Zeichen (auch Leerzeichen). Enthält das Event ein Leerzeichen hinter dem Doppelpunkt regext man das am besten mit dem Punkt (oder \<LEER>).

Ich empfehle:

https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/

ftsinuglarity

Zitat von: ftsinuglarity am 09 März 2018, 00:45:52
Was ist dieses ominöse " Event des Schaltbefehls" ?. Anders gefragt ist mir nicht ganz klar, WAS ich da eigentlich abgefangen habe. Ich hab die RegEx eigentlich nur deutlicher definiert und damit irgendwas draußen gelassen. Mir ist nur noch nicht klar was.

Um mir meine eigene Frage zu beantworten: Wenn ich das jetzt mal gecheckt habe, habe ich damit "state" außen vor gelassen.

CoolTux

Zitat von: ftsinuglarity am 09 März 2018, 14:21:17
"state" ist hier nicht definiert. Somit sollte das Event von "state" nicht beim Notify ankommen, und Musik:(on|off|error) hätte ohne Event eigentlich gar nichts machen dürfen.

Eine Erklärung für mich wäre, das "state" auch in der Hinsicht ein Ausnahmefall ist und einfach immer ein Event schickt, egal ob definiert oder nicht.

Ein Event wird so gut wie immer erzeugt, es sei denn der User unterdrückt es.


READINGS:
     2018-03-08 21:55:12   current         0.0055 A
     2018-03-08 21:55:12   last_Toggle_Time 22:55:18 08.03.2018
     2018-03-08 16:00:33   oldstate        off
     2018-03-08 21:55:12   onoff           on
     2018-03-08 21:55:12   power_day       0.130 kWh
     2018-03-08 21:55:12   power_month     1.854 kWh
     2018-03-08 21:55:12   power_now       0.07 W
     2018-03-08 21:55:12   power_week      1.215 kWh
     2018-03-08 21:55:12   state           ON / 0.07 W / 0.0055 A


Musik:(on|off|error)

Deine Regex hätte hier nicht triggern dürfen, hat sie aber auch nicht. Zu mindest nicht auf das Event zum schreiben des Readings state.
Ich bin der festen Meinung das es auf den Event des set Befehles reagiert hat. Und der kommt noch bevor überhaupt der Code im Modul die Verbindung zum Endgerät aufbaut. So wie mein Beispiel mit dem Volume.
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

ftsinuglarity

Zitat von: marvin78 am 09 März 2018, 14:23:39
Das ist ein Regex. Der Punkt steht für ein beliebiges Zeichen (auch Leerzeichen). Enthält das Event ein Leerzeichen hinter dem Doppelpunkt regext man das am besten mit dem Punkt (oder \<LEER>).

Ich empfehle:

https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/

Danke erstmal für den Link. Mit Perl hab ich zum ersten Mal so direkt hier in fhem zu tun. Gute Tuts sind mir sehr willkommen, ich kratze da immer noch an der Oberfläche.

Klar soweit ist die Perl RegEx:
Punkt . = ein beliebiges Zeichen oder auch kein Zeichen
Punkt Stern .* = ein beliebiges Zeichen, beliebig oft wiederholt... sprich alles was gibt

Dann dient der Punkt als "Sicherheitsplatzhalter" , falls es vor dem eigentlichen Wert noch ein Leerzeichen oder ähnliches gibt. Mehr heist's nicht. Korrekt ?

marvin78

Nicht ganz. . steht immer für ein Zeichen. Er steht nicht für kein oder ein Zeichen.

ftsinuglarity

#38
Zitat von: marvin78 am 09 März 2018, 14:57:23
Nicht ganz. . steht immer für ein Zeichen. Er steht nicht für kein oder ein Zeichen.

Oh. Stimmt. Gerade in deinem Tut nachgelesen.
> Marius .*Osterhase 
> Die im Einzelnen bedeutet: "Marius", danach ein Leerzeichen gefolgt von einem beliebigen Zeichen (dafür steht der Punkt!) beliebig oft (also evtl. auch gar keins) und anschließend der Nachname. Das trifft auf
> "Marius Osterhase" genau so wie auf "Marius Müller Osterhase".

"Gar keins" bezieht sich also nur auf die kombinierte Verwendung mit Wildcard .*

Aber dann macht doch der Punkt als allg. Definiton keinen Sinn ?
DEVICE:READING:.VALUE
Nicht jedes Reading hat ein Leerzeichen an erster Stelle im Value

ftsinuglarity

#39
Zitat von: CoolTux am 09 März 2018, 14:39:00
Ein Event wird so gut wie immer erzeugt, es sei denn der User unterdrückt es.

Ok, hab mich falsch ausgedrückt. Genauer meinte ich : Ein Event, das auch zum Notify durchgelassen wird.
Mit event-on-change sag ich welche ich möchte. Deswegen meine bisherige Vorstellung: "state" erzeugt zwar ein Event (wie so ziemlich alles andere auch), das Notify reagiert aber nur auf die definierten.
Was ja prinzipiell möglich wäre durch Musik:(on|off|error)
... weiter ..

Zitat von: CoolTux am 09 März 2018, 14:39:00
Deine Regex hätte hier nicht triggern dürfen, hat sie aber auch nicht. Zu mindest nicht auf das Event zum schreiben des Readings state.
Ich bin der festen Meinung das es auf den Event des set Befehles reagiert hat. Und der kommt noch bevor überhaupt der Code im Modul die Verbindung zum Endgerät aufbaut. So wie mein Beispiel mit dem Volume.

Genau da hakts bei mir.
Ich gebe den Befehl:
set Musik on
Das Event "on" wäre " Event des set Befehles", was mein Notify und damit meine Funktion vermutlich ausglöst hat. Möglich war das durch die Definition:
Musik:(on|off|error)

Nur warum kommt das set Event überhaupt beim Notify durch? Es ist doch anders definiert in "Musik". Ist das "set Musik on" irgendwie mehr Low-Level oder sowas ?

CoolTux


2018-03-08 23:33:22 EDIPLUG Musik on

Beispiel aus deinem Eventmonitor. Das ist das Event zum set Befehl. Behaupte ich mal mit großer Sicherheit.


Musik:(on|off|error)

Das Regex würde auf alle Fälle auf das obere Event reagieren.


Denn Dein state sieht ja ganz anders aus

2018-03-08 21:55:12   state           ON / 0.07 W / 0.0055 A

Das ist Dein state Reading
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

marvin78

#41
Zitat von: ftsinuglarity am 09 März 2018, 15:09:24

Nicht jedes Reading hat ein Leerzeichen an erster Stelle im Value

Das Reading oder sein Wert ist belanglos. Es geht um das Event. Deshalb immer der Hinweis auf den Eventmonitor. Dort sieht man das entsprechende Event. Wenn du ausdrücken willst, dass ein beliebiges Zeichen da sein könnte oder nicht, dann verwende das ?

Peter.?Muster

matcht  "Peter Muster" aber auch "PeterMuster".

Bitte meinem Link folgen und durchlesen. Das erübrigt viele Fragen hier. Regex hat NICHTS mit Perl direkt zu tun. Es ist aber wichtig, um richtig auf Events zu reagieren.

ftsinuglarity

#42
Zitat von: marvin78 am 09 März 2018, 15:25:54
Bitte meinem Link folgen und durchlesen. Das erübrigt viele Fragen hier. Regex hat NICHTS mit Perl direkt zu tun. Es ist aber wichtig, um richtig auf Events zu reagieren.
Ist vollkommen richtig. Ich muß mich mal genauer ausdrücken. Sorry. Dann sag ich mal besser Perl Substitutionen oder sowas. Ich bin zwar relativ frisch in Perl, es hat aber viele Anlehnungen an andere Programiersprachen oder auch der bash. Neu ist mir das Thema nicht. Nur mal so als Abholpunkt. Aber Perl ist auch .. herrje... da geht was. Der Blick ins Tut tut not. (scheiß Witz)

Zitat von: marvin78 am 09 März 2018, 15:25:54
Das Reading oder sein Wert ist belanglos. Es geht um das Event. Deshalb immer der Hinweis auf den Eventmonitor. Dort sieht man das entsprechende Event. Wenn du ausdrücken willst, dass ein beliebiges Zeichen da sein könnte oder nicht, dann verwende das ?
Peter.?Muster
matcht  "Peter Muster" aber auch "PeterMuster".
Ebenso richtig.

Ich war nur verwirrt durch die anscheinend als allg. gütlig gedachte Definition mit Punkt DEVICE:READING:.VALUE. Hat dann also keine besondere Bedeutung in der gezeigten Definition. Ok. Danke!

marvin78

Es ist alles kein Hexenwerk, wenn man die entsprechende Doku liest und ein wenig Regex kann. Man muss den Unterschied zwischen Event und Reading verstehen, Events generell verstehen, ein wenig logisch denken können. Mehr ist es nicht. Mach es nicht so kompliziert, denn das ist es schlicht nicht.

ftsinuglarity

#44
Zitat von: marvin78 am 09 März 2018, 15:36:17
Es ist alles kein Hexenwerk, wenn man die entsprechende Doku liest und ein wenig Regex kann. Man muss den Unterschied zwischen Event und Reading verstehen, Events generell verstehen, ein wenig logisch denken können. Mehr ist es nicht. Mach es nicht so kompliziert, denn das ist es schlicht nicht.

Offen gesagt macht mir diese Art zu programmieren echt Schwierigkeiten. Das ist mal komplett anders zu verstehen als sequenzielle oder statische Abläufe. Je mehr ich in fhem stecke, um so mehr wird mir klar, aber um so mehr Detailfragen stellen sich dann. Ich geb dir Recht, eigentlich ist zu Events und Readings nicht viel zu sagen. Und dann laufe ich auf solche Probleme wie hier im Thread, und ich merke das mir da doch noch was fehlt und es mehr Feinheiten gibt, als mir klar war.
Vieles umgehe ich sicher mit alten Methoden, die eigentlich überflüssig wären oder anders viel einfacher funktionieren würden. Oft genug festgestellt. Ich bin jetzt seit rund 5 Monaten dabei ... das wird ;)

Was ich anfangs in Schleifen gelaufen bin, weil ich das getrigger noch nicht so auf dem Schirm hatte ..man man .. Struckturen sind da richtig geil :D