FHEM2FHEM Synchronisierung nach Ausfall?

Begonnen von Adimarantis, 05 Juni 2025, 13:39:50

Vorheriges Thema - Nächstes Thema

Adimarantis

Hallo,

falls das nicht irgendwie schon geht hätte ich einen Feature Request für FHEM2FHEM:

Einen "set" oder "get" Befehl, der eine Synchronisierung aller betroffenen Devices/Readings erzwingt.

Use Case: Ich hatte neulich eine Instanz neu installiert und dabei vergessen das fhem.save zu retten. Als ich die neue Instanz hochgefahren habe, hagelte es nur so an Fehlern aus DOIFs die Readings benötigten, die über FHEM2FHEM synchronisiert wurden, aber eben selten (oder im Fall eines "Settings" Device, welches  statische Einstellungen enthält, die sehr selten und nur manuell geändert werden eher gar nicht) Events erzeugen.
Ist sicherlich auch bei einem längeren Systemaufall einer beteiligten Instanz hilfreich. Am Besten wäre das als "pull" auf der Instanz der Werte fehlen.

Gruß,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

betateilchen

  • Mit JsonList2 auf der Quellinstanz aller Devices/Readings erzeugen und exportieren.
  • Auf der Zielinstanz das JSON-Objekt importieren und verarbeiten.
  • Fertig.

Oder mit configDB arbeiten, da wird auch das statefile mit versioniert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Hallo Jörg,

FHEM2FHEM ist doch kein Tool zur Synchronisation. So wie ich es verstanden habe:
  • registriert es sich bei der Remote Instanz per Telnet an der "Event Schnittstelle"
  • es filtert die Events entsprechend des RegExp in der Definition
  • die gefilterten Events werden in der lokalen Instanz als Events empfangen und können verarbeitet werden.
    ZitatFalls man lokal Geräte mit dem gleichen Namen (z.Bsp. als dummy) angelegt hat, dann werden die Readings von dem lokalen Gerät aktualisiert.
Da gibt es doch überhaupt keinen Ansatz für deinen Wunsch? Du könntest für Dein Vorhaben in der Remote Instanz alle Readings neu setzen und dabei Events erzeugen.

Den Use Case den Du beschreibst würde ich eher als persönlichen Designfehler bezeichnen  ;D

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Adimarantis

Mir geht es um den Fall, dass man (warum auch immer - spielt eigentlich keine Rolle) Events von der "master" Instanz verpasst hat, die sehr selten kommen und man würde die gerne aktualisieren, damit beide Instanzen wieder synchron sind.
Beholfen habe ich mir, indem ich die "setstate" Kommandos aus der "Raw Definition" einfach auf der anderen Instanz ausgeführt hab. Das ging jetzt, weil es nur wenige betroffene Devices waren.
Praktischer wäre halt ein Feature, dass anhand des FHEM2FHEM Filters alle Readings durchrattert - aber wohl nur wenn das mit wenig Aufwand zu implementieren ist. Ich gebe zu dass der Use Case wohl eher selten vorkommen wird.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Guybrush


Adimarantis

Mein Ziel war eine userfreundliche Lösung an der Stelle (FHEM2FHEM) an der man als erstes sucht.
Klar gibt es für fortgeschrittene User immer einen Weg.

Um den Vorschlag mit JsonList2 zu vertiefen:
Wie importiert man das wieder?
Kann ich nur die Readings importieren? (denn auf der "anderen Seite" sind üblicherweise nur Dummys - also andere Devicetypen und hier auch Attribute etc. zu importieren oder gar die Device identisch zu erzeugen würde das Chaos nur vergrößeren)
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

passibe

Zitat von: Adimarantis am 05 Juni 2025, 21:10:18Mein Ziel war eine userfreundliche Lösung an der Stelle (FHEM2FHEM) an der man als erstes sucht.
Die userfreundlichste Lösung ist hier wohl, dass die User Sorge dafür tragen, dass das Problem gar nicht erst entsteht.

Aber siehe unten zu meinem Vorschlag, vielleicht wars das ja schon. Man könnte das dann auch einfach irgendwo in einem Helper-Skript ablegen, damit man es bei Notwendigkeit schnell ausführen kann. Theoretisch kann man das, sofern sich zwischen den beiden Geräten eine SSH-Verbindung aufbauen lässt, auch komplett automatisieren.

Generell ist das hier aber etwas, das nicht unbedingt so häufig vorkommt – es scheint dir ja auch erst 1x passiert zu sein, und das einerseits beim Neuaufsetzen und andererseits auch vermeidbar, weil fhem.save nicht gebackuped wurde. Dass man in so einem Fall vielleicht zu einer etwas komplizierteren Lösung greifen muss, und selbst ein bisschen was skripten muss, ist jetzt meiner Meinung nach kein Weltuntergang.

Hier mein Vorschlag:
1. Auf dem Quellsystem (DEVSPEC natürlich entsprechend setzen):
/opt/fhem/fhem.pl 7072 "jsonlist2 <DEVSPEC>" > /tmp/saved_readings.json2. saved_readings.json auf das Zielsystem übertragen
3. Auf dem Zielsystem (natürlich Pfad zu saved_readings.json anpassen):while read -r cmd; do
    echo "executing $cmd"
    /opt/fhem/fhem.pl 7072 "$cmd"
done < <(jq -r \
    '.Results[] | .Name as $name | .Readings | to_entries[] | "setreading \($name) \(.key) \(.value.Value)"' \
    /tmp/saved_readings.json)

Nr. 3 geht natürlich auch als Einzeiler ...while read -r cmd; do echo "executing $cmd" && /opt/fhem/fhem.pl 7072 "$cmd"; done < <(jq -r '.Results[] | .Name as $name | .Readings | to_entries[] | "setreading \($name) \(.key) \(.value.Value)"' /tmp/saved_readings.json)