join(" ", @structChangeHist) und Verhalten

Begonnen von 87insane, 06 Dezember 2021, 20:32:05

Vorheriges Thema - Nächstes Thema

87insane

Hallo zusammen,

aktuell teste ich ein wenig mit der lieben join(" ", @structChangeHist) Funktion. Allerdings finde ich ihr Verhalten komisch. Ggf könnt ihr mir den Weg zeigen :)
Normal zeigt die Funktion die letzten x (maxLog) Einträge an. Wenn man aber nun ein Gerät in FHEM löscht. Beispiel bei mir ein Shelly der über den MQTT2 Server kommt.
Dann wird dieser zwar via autocreate neu angelegt und im EventMonitor ist zu sehen das da ein Gerät DEFINED wird da UNDEFINED.

ABER es wird in der Funktion und auch über Abfrage über das Web-IF "?" in FHEM, sieht man kein define mehr. Ist das neu? Normal hätte ich darauf wetten können, das dies vor kurzem noch möglich war.

Also kurz: Wie bekomme ich nun einfach die letzten (nur als Beispiel) 3 define / Geräte via Fhem?
Aktuell wird alles mögliche an Attributen über die Funktion angezeigt, was ein Shelly via Server ja automatisch gesetzt bekommt (readingsList usw.). Leider aber keine defines mehr.

Danke für Eure Hilfe!
Gruß,
87Insane

betateilchen

Das Attribut maxChangeLog sorgt dafür, dass nur die darin angegebene Anzahl der neuesten Änderungen gespeichert werden. Dabei ist es unerheblich, ob es sich bei der Änderung um ein "define" oder ein "attr" handelt.

Wenn Du im genannten Attribut drei angibst, dann werden also die drei letzten Änderungen gespeichert. Beim define eines Shelly, das automatisch eine Reihe von Attributen bekommt, führt dies dazu, dass zuerst ein "define" und danach beispielsweise fünf "attr" ausgeführt werden. Von diesen insgesamt sechs Änderungen bleiben nur die drei letzten "attr" erhalten, deshalb siehst Du das "define" nicht (mehr).

Dieses Verhalten ist aber nicht neu.

--
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

87insane

Hey und guten Morgen,

das attr hatte ich schon verstanden. Die drei hatte ich als Beispiel für zb 3 letzte defines, was dann bei shelly vermutlich die letzten 25-30 Änderungen wären. Hab maxlog aktuell zum testen auf 100. Das war mein verzweifelter Versuch define wieder zu sehen.

Also entweder, werden Geräte, die bereits schon mal da waren, trotz löschen noch irgendwo vorgehalten oder aber define wurde raus genommen (update/bug).

Gruß,
87insane

betateilchen

Folgende Dinge werden in @structChangeHist geführt:


define...
modify...
delete...
deleteAttr...
rename...
attr...



Zitat von: 87insane am 07 Dezember 2021, 08:51:48
Die drei hatte ich als Beispiel für zb 3 letzte defines, was dann bei shelly vermutlich die letzten 25-30 Änderungen wären.

Nochmal zur Klarstellung:


  • was siehst Du aktuell?
  • was möchtest Du sehen?

Zitat von: 87insane am 07 Dezember 2021, 08:51:48
Hab maxlog aktuell zum testen auf 100

Das Attribut heißt maxChangeLog

Zitat von: 87insane am 06 Dezember 2021, 20:32:05
Also kurz: Wie bekomme ich nun einfach die letzten (nur als Beispiel) 3 define / Geräte via Fhem?

Das geht nicht. Zumindest nicht auf diesem Weg, den Du da gerne gehen möchtest.

Alternative Lösungsansätze:


  • Verwende ein notify, das auf global:DEFINED triggert und sich die entsprechenden Aktionen merkt
  • Verwende ein loop über @structChangeHist und gib nur die Zeilen aus, die mit "define" beginnen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

87insane

ZitatFolgende Dinge werden in @structChangeHist geführt:
Ja - Das dachte ich auch. Aber nicht bei wiederkehrenden Geräten!

ZitatNochmal zur Klarstellung:

was siehst Du aktuell?
was möchtest Du sehen?
Aktuell sehe ich bei einem Gerät, welches gelöscht wurde und via autocreate neu angelegt wurde: Alles außer ein define. (attr, wie Du schon sagtest kommen ja bei Shelly immer einige).
Ich möchte bei wiederkehrenden Geräten auch define sehen.

INFO: Wenn man daneben einen EventMonitor offen hat, sieht man auch alles, was passieren soll. Dies ist aber nicht in der Funktion zu sehen.

ZitatDas Attribut heißt maxChangeLog
Ja, für die Nachwelt ist es besser in komplett!

ZitatVerwende ein notify, das auf global:DEFINED triggert und sich die entsprechenden Aktionen merkt
Verwende ein loop über @structChangeHist und gib nur die Zeilen aus, die mit "define" beginnen
Zu 1) Danke für den Ansatz. So mache ich das aktuell auch. Allerdings empfinde ich das als Umweg, wenn es bereits eine Funktion gibt, die dies können sollte.
Zu 2) Das würde ich gerne.

betateilchen

Zitat von: 87insane am 07 Dezember 2021, 12:19:06
Allerdings empfinde ich das als Umweg, wenn es bereits eine Funktion gibt, die dies können sollte.

Um das klarzustellen: es gibt keine offizielle Funktion in FHEM, die das können sollte.

Zitat von: 87insane am 07 Dezember 2021, 12:19:06
Ich möchte bei wiederkehrenden Geräten auch define sehen.

Eine Unterscheidung nach "wiederkehrendem" device ist aus dem vorhandenen code in fhem.pl und 98_autocreate.pm für mich nicht ableitbar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

87insane

Hey nochmal,

Du bist doch einer der erfahreneren Fhem Nutzer. Was spricht dagegen das nach zu stellen? Ich habe das nun in 3 verschiedenen Systemen getan.
Neu installiertes FHEM genau wie ein prod System.

Immer wieder gibt es in FHEM sonderbehandlungen. Ohne so ein großer Programmierer zu sein, glaube ich es hängt mit der Einführung der FUUID zusammen.

Probier es bitte mal aus... Gerät (keinen dummy) wie shelly ins autocreate laufen lassen. Beim ersten mal wirst du ein define sehen in der structChangeHist. Dann löscht du das Gerät. Nun einfach neu rein laufen lassen in autocreate. Du wirst diesmal aber kein define sehen.

Meine frage ist, warum?
Ich hatte mir die PL vor dem Post auch angesehen. Da ich keine idee mehr habe, die frage hier.

betateilchen

Das kann ich nicht nachstellen, weil es bei mir außer bei Homematic keine devices gibt, die ich per autocreate anlegen lassen.

Übrigens gehe ich davon aus, dass Du nach dem Löschen des Gerätes Dein FHEM jeweils neu gestartet hattest.

Kommentiere mal in der fhem.pl die Zeile 5783+5784.


#  return if(defined($dev) &&
#            (!$defs{$dev} || $defs{$dev}{TEMPORARY} || $defs{$dev}{VOLATILE}));


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

87insane

Hatte auch mit Neustart getestet, natürlich nicht jedes mal. Da es leider auch nichts brachte.

Ich habe die Zeilen auskommentiert und Fhem neu gestartet. Danach nochmal das Szenario - ohne Erfolg.
Im Log sind auch keine zusätzlichen Einträge erschienen.

87insane


rudolfkoenig

ZitatABER es wird in der Funktion und auch über Abfrage über das Web-IF "?" in FHEM, sieht man kein define mehr. Ist das neu?
Nein. Autocreate fuehr ein save aus, was wiederum structChangeHist loescht.

ZitatAlso kurz: Wie bekomme ich nun einfach die letzten (nur als Beispiel) 3 define / Geräte via Fhem?
Mit der von betateilchen schon vorgeschlagene notify Methode.