FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: GammaTwin am 26 August 2025, 10:57:56

Titel: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 26 August 2025, 10:57:56
Grüße,

gibt es eine Möglichkeit die "Last unsaved structural changes" zu erkennen/abzufragen? Ich meine nicht mit dem Auge - das kann ich  ;)
Z.B. per DOIF, per irgendeinem Kommando, um es dann z.B. Nachricht als Auflistung zu versenden.

Besten Dank.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 26 August 2025, 11:06:55
Es wird für die dort abgelegten Einträge selbst kein event erzeugt, auf das man per notify o.ä. reagieren könnte.

Die Dinge, die für das Auftauchen des roten Fragezeichens sorgen, erzeugen aber in der Regel selbst ein event, auf das man reagieren kann.

Aber wofür braucht man das wirklich?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: JoWiemann am 26 August 2025, 11:19:51
Hallo,

wenn ich ein Attribut in einem Device ändere bekomme ich im Event-Monitor z.B. einen Eintrag:

2025-08-26 11:16:45 Global global ATTR FritzBox enableBoxReadings box_energyMode,box_led,box_pwr,box_notify

Damit müsste man doch weiter kommen.

Grüße Jörg
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 26 August 2025, 12:23:01
Zitat von: JoWiemann am 26 August 2025, 11:19:51wenn ich ein Attribut in einem Device ändere bekomme ich im Event-Monitor z.B. einen Eintrag:

Das ist doch genau das, was ich hier schon meinte:

Zitat von: betateilchen am 26 August 2025, 11:06:55Die Dinge, die für das Auftauchen des roten Fragezeichens sorgen, erzeugen aber in der Regel selbst ein event, auf das man reagieren kann.

Das passiert auch bei einem DEFINE oder einem DELETE oder anderen Aktionen.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: RalfRog am 26 August 2025, 16:14:38
Erzeugt nicht "global" Events wie MODIFIED|DEFINED|ATTR|RENAMED|Deleted etc. auf die per notify reagiert werden kann?

Ich logge damit Änderungen. Falls ich mal versehentlich was wegschmeiße kann ich nachschauen.
Filelog:
DEF ./log/configChangeHistory.log global:(MODIFIED|DEFINED|ATTR|RENAMED|DELETED).*


Gruß Ralf
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 27 August 2025, 10:01:08
Grüße,

Danke für die Antworten.

Ich habe folgendes probiert
defmod di_ConfigChanges DOIF ([global:".*"]) (\
 set TelegramBot message @xxxxxxxxx <b>Änderung erkannt:</B>\n$EVENT\
)
attr di_ConfigChanges do always

Heute Nacht, gegen 02:00 Uhr wurde ich geweckt ;D
Da erstelle ich einige notifty (at), die dann etwas abarbeiten. Diese werden "DEFINED" und "DELETED"

Das bringt uns betateilchen, "Aber wofür braucht man das wirklich?"

Das eigentliche Problem tritt bei Zeitschaltuhren auf. UZSU
Ändert man eine Einstellung der UZSU werden zu speichernde Änderungen angelegt.

Meine ganz ursprüngliche Frage ist:
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 27 August 2025, 10:12:25
Zitat von: GammaTwin am 27 August 2025, 10:01:08Meine ganz ursprüngliche Frage ist:
  • Wie speichere ich nur diese?
  • Und wenn das "nur" nicht geht,

Das "nur" geht nicht. Ein "save" speichert immer die komplette Konfiguration, die FHEM gerade benutzt.

Aber ich glaube immer noch nicht, dass Du Deine Aufgabe nicht anders lösen kannst. Wie sehen denn die Änderungen aus, die UZSU anlegt und die gespeichert werden müssen? WO treten diese Änderungen auf?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: JoWiemann am 27 August 2025, 15:14:59
Zitat von: GammaTwin am 27 August 2025, 10:01:08Da erstelle ich einige notifty (at), die dann etwas abarbeiten. Diese werden "DEFINED" und "DELETED"

Hallo,

warum nutzt Du für diesen Anwendungszweck nicht den Paramater -silent, dann bekommst Du auch kein ?

Grüße Jörg
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 27 August 2025, 15:59:08
Vielleicht, weil es gar nicht um das rote Fragezeichen geht?
Sondern darum, zu wissen, ob die Änderungen eine oder mehrere Änderungen an Zeitschaltuhren beinhalten.

Mich interessiert immer noch, wie fie Änderungen entstehen und ob dabei events erzeugt werden.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 27 August 2025, 16:39:49
Es gibt FHEM-intern ein array, das die letzten 10 structural changes enthält. Man könnte regelmäßig prüfen, ob das array Elemente enthält und ob diese sich auf Zeitschaltuhren beziehen.

Aber ich glaube nach wie vor, dass sich die Aufgabe viel einfacher lösen lässt.
Leider fehlen nach wie vor qualifizierte Informationen, um das wirklich zu beurteilen.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: mi.ke am 27 August 2025, 18:52:35
Ich hatte in der Vergangenheit mal ein notify gebastelt, das Events abfängt um diese dann in ein LOG zu schreiben.

defmod system notify global:(INITIALIZED|SHUTDOWN|UPDATE|DEFINED.*|DELETED.*|MODIFIED.*|RENAMED.*|CANNOT_FORK) {fhem("trigger $SELF change: ".("$EVENT"))}
vielleicht kannst Du ja damit was anfangen
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 27 August 2025, 18:54:15
Grüße,

ich glaube, ich kann nicht mit Eurer Antwortgeschwindigkeit nicht mithalten :) Daher schon mal großen Dank.

Vielleicht erkläre ich nochmal, welche UZSU ich verwendet und die daraus entstehenden Änderungen.
Die UZSU ist der smartVISU und fronthem: https://wiki.fhem.de/wiki/SmartVISU/Universelle_ZeitSchaltUhr_(UZSU) (https://wiki.fhem.de/wiki/SmartVISU/Universelle_ZeitSchaltUhr_(UZSU))

Wenn man die UZSU in der smartVISU einstellt, passiert folgendes:

Diese muss dann logischerweise speichern, damit die Zeitschaltuhr einen Neustart von FHEM übersteht.

Wenn also jemand anderes als ich die Zeitschaltuhren ändert, muss ich das ja irgendwie handhaben. Daher meine Frage.
Zitat von: betateilchen am 27 August 2025, 16:39:49Leider fehlen nach wie vor qualifizierte Informationen, um das wirklich zu beurteilen.
Passt die Erklärung?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: mi.ke am 27 August 2025, 19:06:06
Zitat von: GammaTwin am 27 August 2025, 18:54:15Diese muss dann logischerweise speichern, damit die Zeitschaltuhr einen Neustart von FHEM übersteht.


Ganz pragmatisch:
warum setzt Du nicht am Ende ein "save" ein?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 27 August 2025, 20:03:53
Es ist ein Irrtum, anzunehmen, dass das Hinzufügen eines readings noch keine Änderung sei. Allerdings sind neue readings kein structural change.
Aber zumindest das statefile sollte dann gesichert werden, denn dort stehen die readings drin, die nach einem Neustart wieder eingelesen werden.
Außerdem hast Du doch schon ein notify, das auf die Änderung reagiert. Dort kannst Du doch Aktionen ausführen, soviele Du möchtest.

Was brauchst Du denn noch mehr?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 27 August 2025, 20:04:43
Zitat von: betateilchen am 27 August 2025, 16:39:49Es gibt FHEM-intern ein array, das die letzten 10 structural changes enthält. Man könnte regelmäßig prüfen, ob das array Elemente enthält ...
Das finde ich interessant. Dann wüsste man, ob etwas zu Speichern anliegt oder nicht.

Zitat von: mi.ke am 27 August 2025, 19:06:06
Zitat von: GammaTwin am 27 August 2025, 18:54:15Diese muss dann logischerweise speichern, damit die Zeitschaltuhr einen Neustart von FHEM übersteht.
Ganz pragmatisch:
warum setzt Du nicht am Ende ein "save" ein?
Weil ich dann ja alles andere auch speichern würde. Da habe ich kein gutes Gefühl.

Zitat von: mi.ke am 27 August 2025, 18:52:35Ich hatte in der Vergangenheit mal ein notify gebastelt, das Events abfängt um diese dann in ein LOG zu schreiben.
defmod system notify global:(INITIALIZED|SHUTDOWN|UPDATE|DEFINED.*|DELETED.*|MODIFIED.*|RENAMED.*|CANNOT_FORK) {fhem("trigger $SELF change: ".("$EVENT"))}vielleicht kannst Du ja damit was anfangen
Zitat von: RalfRog am 26 August 2025, 16:14:38Erzeugt nicht "global" Events wie MODIFIED|DEFINED|ATTR|RENAMED|Deleted etc. auf die per notify reagiert werden kann?

Ich logge damit Änderungen. Falls ich mal versehentlich was wegschmeiße kann ich nachschauen.
Filelog:
DEF ./log/configChangeHistory.log global:(MODIFIED|DEFINED|ATTR|RENAMED|DELETED).*
Die beiden Sachen schaue ich mir auf jeden Fall mal an. Sind alle Dinge, das ? erzeugen damit erfasst?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 27 August 2025, 20:06:25
Du denkst nach wie vor viel zu kompliziert.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 27 August 2025, 20:11:30
Zitat von: betateilchen am 27 August 2025, 20:03:53Es ist ein Irrtum, anzunehmen, dass das Hinzufügen eines readings noch keine Änderung sei. Allerdings sind neue readings kein structural change.
Aber zumindest das statefile sollte dann gesichert werden, denn dort stehen die readings drin, die nach einem Neustart wieder eingelesen werden.
Außerdem hast Du doch schon ein notify, das auf die Änderung reagiert. Dort kannst Du doch Aktionen ausführen, soviele Du möchtest.

Was brauchst Du denn noch mehr?
Ich möchte eine Fallunterscheidung.
Meine Idee: Ich müsste also wissen, dass "Structural changes" vorliegen.

Zitat von: betateilchen am 27 August 2025, 20:06:25Du denkst nach wie vor viel zu kompliziert.
Lass hören :D
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: betateilchen am 27 August 2025, 20:34:52
Zitat von: GammaTwin am 27 August 2025, 20:11:30Ich möchte eine Fallunterscheidung.
  • Speichern der Änderungen, wenn vorher keine Änderungen aufgelaufen sind
  • Nicht Speichern, wenn bereits Änderungen vorliegen.

Das macht keinen Sinn. Aber vermutlich musst/willst Du das selbst rausfinden.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: passibe am 27 August 2025, 21:26:27
Zitat von: GammaTwin am 27 August 2025, 20:04:43Weil ich dann ja alles andere auch speichern würde
Was ist denn "alles andere"? Ich habe auch an ein-zwei Stellen ein "save" im Code. Aber außer manuellen Änderungen, die ich sowieso manuell speichere, gibt es bei mir nichts "anderes", was dadurch mitgespeichert werden könnte.

Wie ist das bei dir?
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 28 August 2025, 08:13:02
Ist vielleicht eine Philosophiefrage. Mal drei Fälle in denen es mich stören würde. Immer mit der Idee, irgendjemand im Haushalt ändert zu einem beliebigen Zeitpunkt eine  Zeitschaltuhr:

Admin Otto123 schreibt:
Zitat von: Otto123 am 25 Juli 2023, 12:46:27[...] Die Erklärung, warum ein "blindes" - vom Programm ausgeführtes - save keine gute Lösung ist, [...]

Aber es gibt bestimmt sinnvolle Situationen für ein (save). Aber ich denke, in einer Funktion, die jeder Anwender im Haushalt nutzen kann, ist es kein passender Ort.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: tobi01001 am 28 August 2025, 08:56:56
Moin,

Aus meiner Sicht muss es für Endanwender möglich sein fhem zu benutzen, ohne structual changes zu verursachen und auch so, dass es einem Neustart überlebt.
Ich hab auch vereinzelt Stellen, wo mal ein at definiert wird. die sind aber so unkritisch, das da selbst bei einem crash oder Neustart nichts verloren ginge.
Bei deinen Zeitschaltuhren würden aber die "Änderungen" bis zum Schaltpunkt (und bei Wiederholungen darüber hinaus bis zum "save") in der Schwebe hängen.

Ich hab jetzt mal kurz im Link zum WiKi geschaut und in 99_fronthemUtils.pm geschaut - also evtl. nicht konkret in deinem Anwendungsfall der aber ähnlich gelagert scheint?

Zitat von: GammaTwin am 27 August 2025, 18:54:15Vielleicht erkläre ich nochmal, welche UZSU ich verwendet und die daraus entstehenden Änderungen.
Die UZSU ist der smartVISU und fronthem: https://wiki.fhem.de/wiki/SmartVISU/Universelle_ZeitSchaltUhr_(UZSU) (https://wiki.fhem.de/wiki/SmartVISU/Universelle_ZeitSchaltUhr_(UZSU))

Also, wenn es um die WeekDayTimer geht, werden die so wie ich das sehe "nur" erstellt und dann per Attribute disable entweder aktiviert oder deaktiviert.


fhem('defmod wdt_uzsu_'.$device.' WeekdayTimer '.$device.' en '.$weekdays_part);
 if ($uzsu->{active}){
 fhem('attr wdt_uzsu_'.$device.' disable 0');
} else {
 fhem('attr wdt_uzsu_'.$device.' disable 1');
}
 fhem('attr wdt_uzsu_'.$device.' room UZSU');
 #fhem('save');   # use only if you want to save WDT settings immediately.
 
}

Dann kann man das "Problem" auch an der Ursache lösen indem man die enable und disable setter von WeekDayTimer nutzt anstatt der Attribute. Diese sollten ohne "structual change" funktionieren.

Wie gesagt, nur aus dem verlinkten Wiki und daher evtl. nicht ganz aktuell aber vll ein Lösungsansatz.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 28 August 2025, 09:45:34
Auch ein sehr guter Ansatzpunkt. Es wäre natürlich das beste, structural changes zu vermeiden, besonders wenn es nur diese eine Stelle gibt. Werde ich mir auch anschauen.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: GammaTwin am 28 August 2025, 10:27:45
Ich denke, es ist Zeit für eine Zusammenfassung.

Erkenntnisse:

Philosophien, da gibt es wahrscheinlich kein richtig/falsch:

Die Knobelaufgabe an mich:

Ich werde etwas Zeit brauchen. Wenn ich etwas Zufriedenstellendes produziert habe, werde ich dies nochmal rückmelden.
Titel: Aw: "Last unsaved structural changes" erkennen
Beitrag von: swsmily am 29 August 2025, 22:13:23
Ich hab mir den Thread jetzt zwei mal durchgelesen und verstehe nicht ganz, warum eine Änderung der UZSU (nutze ich selbst nicht) structural changes verursachen.
Werden die Werte nicht nur in Readings geschrieben? So verstehe ich jedenfalls den verlinkten Wiki-Artikel. Das sollten dann ja keine structural changes sein.

Damit Readings oder at-Devices nicht durch einen Crash/Reboot verloren gehen, kann man das Statefile ja extra speichern lassen.
Beispiel mit einem DOIF bei mir:
define Speichern_aktueller_Status DOIF ([+00:15:00]) ({ WriteStatefile() })Dies habe ich bei mir vor einigen Jahren mal eingetragen, weil ich damals auch das Problem regelmäßiger Reboots des Raspi hatte und damit temporäre at-Devices verschwunden waren. Damit hatte ich dann das Problem nicht mehr. Bis heute ist das DOIF integriert ohne Probleme.
Vielleicht hilft das schon weiter?