[10_SOMFY.pm] Rolling Code Verlust bei FHEM Neustart ohne aktuelle fhem.save

Begonnen von Ellert, 12 Juli 2018, 16:13:42

Vorheriges Thema - Nächstes Thema

Ellert

Wenn der FHEM-Server gestartet wird und die fhem.save Datei nicht aktuell ist, dann kann es sein, dass ein veralteter Rolling Code in einem SOMFY Device gespeichert wird. Ein veralteter Rolling Code führt dazu, dass die Somfy Hardware die empfangenen Befehle nicht ausführt, siehe auch https://wiki.fhem.de/wiki/SOMFY#Bekannte_Probleme

FHEM stellt PERL-Funktionen bereit (setKeyValue, getKeyValue), die es ermöglichen einzelne Werte in einer separaten Datei zu speichern und zu lesen.
Das folgende DOIF nutzt diese Funktionen, um bei jeder Statusänderung eines SOMFY Devices den aktuellen Rolling Code zu speichern.
Bei jedem Neustart des FHEM Servers werden die gespeicherten Rolling Codes in die SOMFY Devices zurück geschrieben.

Im nachstehenden Code müssen statt der spitzen Klammern, eigene Gerätenamen angegeben werden. Erst dann sollte der Code über Raw definition importiert werden.
Dieser Hinweis betrifft diese Zeilen
Zitat
(["^(<device name 1>|<device name 2>|<usw.>)$:^state"])

my @d = qw(<device name 1> <device name 2> <usw.>);;


defmod rwRollingCode DOIF ## 1 setkeyValue\
(["^(<device name 1>|<device name 2>|<usw.>)$:^state"]) \
{\
  my $rc = ReadingsVal("$DEVICE","rolling_code","0000");;\
  my $rc1 = substr(sprintf("%04X",1 + hex $rc),-4);;\
  my $err = setKeyValue("$DEVICE_rolling_code",$rc1);;\
  Log 1, "$SELF:  setKeyValue $DEVICE rolling_code ($rc) $rc1 with $err" if($err);;\
}\
## 2 getkeyValue\
DOELSEIF (["^global$:^INITIALIZED$"])\
{\
  my @d = qw(<device name 1> <device name 2> <usw.>);;\
  my $err = "";;\
  my $val = "";;\
  foreach my $key (@d) {\
    ($err,$val) = getKeyValue($key."_rolling_code");;\
    if (!$err and $val ne "0000") {\
      fhem("setreading $key rolling_code $val",1);;\
    } else {\
      Log 1, "$SELF: getKeyValue for $key, error is $err, value is $val";;\
    }\
  }\
}\

attr rwRollingCode addStateEvent 1
attr rwRollingCode do always


FHEM16

Hi Ellert,

vielen Dank für das DOIF & Deine Idee.
Ich speichere die Konfiguration automatisiert ab und habe über einen cron ein extra Backup am laufen, welches mir die fhem.cfg und fhem.save extra sichert ... würde aber gerne Deine Lösung mit einbinden.
Da ich mir nicht sicher bin, wollte ich Dich vorher folgendes fragen:

1. Ich meine es reicht nicht aus nur den rolling_code zu sichern und es müsste auch der enc_key gesichert werden
2. Kann es möglich sein, dass der rolling_code/enc_key noch der alte Wert sein könnte, wenn sich state geändert hat und wäre es nicht besser Änderungen direkt über den rolling_code/enc_key zu erkennen?

Viele Grüße
Fhem16

Ellert

Es reicht der Rolling Code, https://forum.fhem.de/index.php/topic,53319.msg786652.html#msg786652

Es ist der alte Wert, daher addiere ich 1. Um zu sagen, ob Dein Vorschlag besser ist oder nur anders, fehlt mir eine Bewertungssystematik.

Dev

Hallo Ellert

ich bin ein absoluter Rookie auf PERL und FHEM. Kannst du mir bitte sagen (vielleicht Schritt für Schritt) wo und wie ich dein Skript anlegen kann damit ich in Zukunft den Rolling Code nicht verliere. Das ist derzeit mein Problem mit meinen Somfy Rollos.
Auch habe ich bei einer Rollo vollkommen im offset. Wie muss ich das mit dem at Befehl machen, damit sich der Rolling Code wieder auf einem höheren Niveau ist....
Vielen Dank für dein Verständnis und Hilfe.

Grüße Dev

Ellert

Zitat von: Dev am 29 September 2018, 18:19:26
Kannst du mir bitte sagen (vielleicht Schritt für Schritt) wo und wie ich dein Skript anlegen kann
ZitatIm nachstehenden Code müssen statt der spitzen Klammern, eigene Gerätenamen angegeben werden(1). Erst dann sollte der Code über Raw definition importiert werden(2).
Es sind nur diese 2 Schritte notwendig.
ZitatRolling Code wieder auf einem höheren Niveau ist
Du kannst einfach in der Definition des Rolladen einen höheren Wert angeben.



Dev

Danke hab's verstanden. Danke fürs direkt darauf Hinweisen.... manchmal sind meine Gedankenwege zu kompliziert

Jedoch bekomme ich noch folgende Error-Meldung:

Unrecognized character \xE2; marked by <-- HERE after ([<-- HERE near column 3 at ./FHEM/99_myUtils.pm


Kann damit nichts anfangen.

Das mit dem höheren Wert für den Rolling Code hat leider noch nicht funktioniert.... werde mich einfach weiter spielen.

Danke fürs Erste.
DEV

Ellert

Ein Zeichen wird nicht erkannt.

Der Code ist nicht für die 99_myUtils, sondern für Raw definition.


RonnyRJM

Hallo,

Ich habe den Code per RAW Definition eingefügt, bekomme jedoch eine ähnliche Fehlermeldung bei der Ausführung wie Dev:

ERROR evaluating {   my $rc = ReadingsVal("Terassenrollo","rolling_code","0000");   my $rc1 = substr(sprintf("%04X",1 + hex $rc),-4);   my $err = setKeyValue("Terassenrollo_rolling_code",$rc1);   Log 1, "rwRollingCode:  setKeyValue Terassenrollo rolling_code ($rc) $rc1 with $err" if($err); }: Unrecognized character \xC2; marked by <-- HERE after { <-- HERE near column 3 at (eval 297469) line 1.


Was mache ich falsch?

Ellert

Zitat von: RonnyRJM am 21 November 2018, 15:32:18
Hallo,

Ich habe den Code per RAW Definition eingefügt, bekomme jedoch eine ähnliche Fehlermeldung bei der Ausführung wie Dev:

ERROR evaluating {   my $rc = ReadingsVal("Terassenrollo","rolling_code","0000");   my $rc1 = substr(sprintf("%04X",1 + hex $rc),-4);   my $err = setKeyValue("Terassenrollo_rolling_code",$rc1);   Log 1, "rwRollingCode:  setKeyValue Terassenrollo rolling_code ($rc) $rc1 with $err" if($err); }: Unrecognized character \xC2; marked by <-- HERE after { <-- HERE near column 3 at (eval 297469) line 1.


Was mache ich falsch?
Wenn Du den Code nur eingefügt hast, dann hast Du die Anleitung nicht richtig befolgt und wenn Du sie befolgt hast, dann hat sich ein Fehler eingeschlichen. Gibt es Probleme beim Lesen und Verstehen der Fehlermeldung?

Siehe auch https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche

mycroft2k

gibt es eine möglichkeit das das sofort gespeichert wird?

aktuell funktoniert es nur bei einen shutdown / reboot das die daten gespeichert werden
bei strom ausfall sind die daten leider weg.

Ellert

Zitat von: mycroft2k am 11 Juni 2019, 15:47:52
gibt es eine möglichkeit das das sofort gespeichert wird?

aktuell funktoniert es nur bei einen shutdown / reboot das die daten gespeichert werden
bei strom ausfall sind die daten leider weg.

Entweder Du rufst die Funktion WriteStateFile() des FHEM-Servers bei jeder Änderung eines Rollingcodes auf oder Du nutzt den Vorschlag aus diesem Beitrag https://forum.fhem.de/index.php/topic,89337.0.html

Dia81

Zitat von: Ellert am 12 Juli 2018, 16:13:42
Wenn der FHEM-Server gestartet wird und die fhem.save Datei nicht aktuell ist, dann kann es sein, dass ein veralteter Rolling Code in einem SOMFY Device gespeichert wird. Ein veralteter Rolling Code führt dazu, dass die Somfy Hardware die empfangenen Befehle nicht ausführt, siehe auch https://wiki.fhem.de/wiki/SOMFY#Bekannte_Probleme

FHEM stellt PERL-Funktionen bereit (setKeyValue, getKeyValue), die es ermöglichen einzelne Werte in einer separaten Datei zu speichern und zu lesen.
Das folgende DOIF nutzt diese Funktionen, um bei jeder Statusänderung eines SOMFY Devices den aktuellen Rolling Code zu speichern.
Bei jedem Neustart des FHEM Servers werden die gespeicherten Rolling Codes in die SOMFY Devices zurück geschrieben.

Im nachstehenden Code müssen statt der spitzen Klammern, eigene Gerätenamen angegeben werden. Erst dann sollte der Code über Raw definition importiert werden.
Dieser Hinweis betrifft diese Zeilen

defmod rwRollingCode DOIF ## 1 setkeyValue\
(["^(<device name 1>|<device name 2>|<usw.>)$:^state"]) \
{\
  my $rc = ReadingsVal("$DEVICE","rolling_code","0000");;\
  my $rc1 = substr(sprintf("%04X",1 + hex $rc),-4);;\
  my $err = setKeyValue("$DEVICE_rolling_code",$rc1);;\
  Log 1, "$SELF:  setKeyValue $DEVICE rolling_code ($rc) $rc1 with $err" if($err);;\
}\
## 2 getkeyValue\
DOELSEIF (["^global$:^INITIALIZED$"])\
{\
  my @d = qw(<device name 1> <device name 2> <usw.>);;\
  my $err = "";;\
  my $val = "";;\
  foreach my $key (@d) {\
    ($err,$val) = getKeyValue($key."_rolling_code");;\
    if (!$err and $val ne "0000") {\
      fhem("setreading $key rolling_code $val",1);;\
    } else {\
      Log 1, "$SELF: getKeyValue for $key, error is $err, value is $val";;\
    }\
  }\
}\

attr rwRollingCode addStateEvent 1
attr rwRollingCode do always


Hi,

hatte auch das Problem 2er Abstürze und langem Probieren den Code wieder abzustimmen. Leider konnte ich die Absturzursache nicht finden die wohl nicht in FHEM liegt oder lag daher wollte ich meine Rollingcodes gerne "speichern" falls es zu solchen Problemen nochmal kommt.

Habe dein Code eingefügt, bin aber noch zu minderbemittelt im Code und verstehe nicht was nun genau passiert. Es scheint in soweit zu gehen, dass wenn ich ein Rollo schalte das CMD1 ausgeführt wird und beim Wiederherstellen durch FHEM neustart das CMD2. Soweit so gut. Kann ich denn die Codes jetzt in einer Art Datei sehen? Nur um zu kapieren was hier passiert :> Wenn ich erst cmd1 das speichern ausführe und dann das 2. werden auf jedenfall die Rollingcodes in das Device geschrieben, zumindest schein ich alles richtig gemacht zu haben :>

Ellert

Die Daten werden in die Datei uniqueID geschrieben. Bei einer Standartinstallation unter /opt/fhem/FHEM/FhemUtils.

Steigerbalett

Ist ab heute im Modul enthalten.
Vielen Dank Ellert für die Arbeit.

https://forum.fhem.de/index.php/topic,53319.msg1045614.html#msg1045614

einfach in den Devices das Attribut autoStoreRollingCode auf 1 setzen.

attr TYPE=SOMFY autoStoreRollingCode 1