Autor Thema: [10_SOMFY.pm] Rolling Code Verlust bei FHEM Neustart ohne aktuelle fhem.save  (Gelesen 2255 mal)

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
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

  • Gast
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

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
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.

Offline Dev

  • New Member
  • *
  • Beiträge: 8
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

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
Kannst du mir bitte sagen (vielleicht Schritt für Schritt) wo und wie ich dein Skript anlegen kann
Zitat
Im 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.
Zitat
Rolling Code wieder auf einem höheren Niveau ist
Du kannst einfach in der Definition des Rolladen einen höheren Wert angeben.



Offline Dev

  • New Member
  • *
  • Beiträge: 8
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
« Letzte Änderung: 01 Oktober 2018, 08:23:05 von Dev »

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
Ein Zeichen wird nicht erkannt.

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

Offline Dev

  • New Member
  • *
  • Beiträge: 8
Danke hat geklappt.

Offline RonnyRJM

  • New Member
  • *
  • Beiträge: 3
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?

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
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
« Letzte Änderung: 21 November 2018, 16:12:08 von Ellert »

Offline mycroft2k

  • New Member
  • *
  • Beiträge: 45
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.

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
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

Offline Dia81

  • Full Member
  • ***
  • Beiträge: 119
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 :>
« Letzte Änderung: 11 Januar 2020, 16:13:26 von Dia81 »

Offline Ellert

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3627
Die Daten werden in die Datei uniqueID geschrieben. Bei einer Standartinstallation unter /opt/fhem/FHEM/FhemUtils.