save restore einzelner readings oder devices

Begonnen von Hackstall, 17 Mai 2019, 22:54:15

Vorheriges Thema - Nächstes Thema

Hackstall

Hallo,
ich würde gern zur Laufzeit einige readings oder auch devices speichern und spaeter per command wieder einlesen.

Zwischen speichern und restore würde ich operationell andere Werte benutzen.

ich habe bereits gegoogelt bin aber nicht so richtig schlüssig.

Hat hier jemand einen Tip.




Otto123

Hi,

list -r device liefert Dir die Raw Definition. Da ist alles drin.
Du müsstest also irgendwie den Befehl absetzen und die Ausgabe speichern.

Wie willst Du das machen? Extern? In FHEM? Automatisch? Interaktiv?
Kann leicht aufwendig werden.  ;)
Nur Idee, nicht getestet: {my $devcontent=fhem("list -r device");FileWrite("DevContent.txt", $devcontent)}

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

Hackstall

Danke fuer die Antwort.

Ich benoetige das speichern und einlesen aus Fhem heraus.

Gruss Andreas

Frank_Huber

Bescbreibe doch mal den use case.
Damit wird es einfacher dir zu helfen.

Gesendet von meinem Doogee S60 mit Tapatalk


Hackstall

Der use case ist wie folgt:

ich habe meine Haussteuerung auf Haus, Zimmer und Device Basis via SmartVisu implementiert.

Bei der Zimmersteuerung und Haussteuerung selektiere ich zwischen:
Auto, Norm und Off.

Fuer alle Steuerungen (Auto, Off und Norm) habe ich verschiedene Settings. Fuer Auto und off sind diese statisch.
Die Normstellung moechte ich mir bei jeder Auto oder Off Selektion zwischenspeichern und diese moechte ich daher nicht verlieren. Daher wird vor umkonfiguration auf auto oder off  die norm-konfiguration gespeichert. wenn dann wieder von auto oder off wieder auf norm geschaltet wird würde ich ein restore machen.

Ueber alles moechte ich zum Beispiel wenn ich in Urlaub fahre einfach Haus auf off konfigurieren und
wenn ich wiederkomme auf norm zurückkonfigurieren.

Hackstall

Hallo,

habe mir mal dein Vorschlag bzgl save angeschaut und bin der Meinung, dass das genau das ist was ich brauche.

Aber wie sieht der restore aus?

Danke Andreas

MadMax-FHEM

Eine andere Variante (ohne Datei) wäre:

mittels ReadingsVal die Originalwerte abzufragen und dann per setreading auf einen (Zwischenspeicher)Dummy zu übertragen.

Beim Zurückstellen dann eben andersrum:

auslesen per ReadingsVal aus dem (Zwischenspeicher)Dummy und setzen per setreading beim Original-Device

Wenn es keine Readings, sondern Attribute sind: AttrVal (abfragen) bzw. attr ("setzen")

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Otto123

Moin,

fürs restore fällt mir auf die Schnelle eine shell Variante ein:
{qx(cat DevContent.txt|nc localhost 7072)}
In Perl kannst Du natürlich einfach umkehren, ich weiß nicht ob das funktioniert.
{my $devcontent=FileRead("DevContent.txt");fhem("$devcontent")}

Ansonsten muss man den String zeilenweise zerlegen und in fhem("") ausführen.

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

Beta-User

Mobil, daher kurz:Im heating_control-Modul habe ich jüngst was eingecheckt, das so ähnlich ist.
ABER: mir kommt das ganze Konzept suboptimal vor.  Bei unbedachten save-Anweisungen kann auch mal was verloren gehen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Hackstall

Hallo was meinst du mit unbedachten Save.
Der save erfolgt automatisch durch fhem wenn ich
aus dem Norm Mode hinausgehen. Der restore soll
nur dann wieder erfolgen wenn ich in den Norm
Mode wieder reingehe.

Gruss Andreas

Beta-User

Hmmm,

also: "früher" gab es Module, die automatisch save-Anweisungen ausgeführt haben, wenn sie z.B. neue Hardware entdeckt hatten. Dabei sind einigen Leuten schon mal Definitionen "verloren" gegangen, z.B. weil bestimmte Dinge beim Neustart von FHEM nicht verfügbar waren, der Modul-Code kaputt usw....

Daher hat Rudi irgendwann das Speichern der Konfiguration aus FHEM heraus jedenfalls in den Fällen unterbunden, in denen nicht alles geladen werden konnte (autosave müßte das Suchwort dazu sein).

Meine persönliche Schlußfolgerung aus dem ganzen war, dass es eben ganz grundsätzlich ein gefährliches Konzept ist, die Konfiguration zwischendurch automatisch zu speichern. Ich vermeide daher auch "rote Fragezeichen" wo es geht, und käme gar nicht mehr auf die Idee, die Konfig zwischendurch automatisiert speichern zu wollen.

M.E. ist das auch nicht notwendig. Viele Module beinhalten z.B. Optionen, auf An- oder Abwesenheit zu reagieren (AutoShuttersControl, WeekdayTimer), auch notify lassen sind mit disabled-"Zeiten" (de-)aktivieren oder man kann Bedingungen bei Ausführung prüfen etc.. Manche Module scheinen gerade den Zweck zu haben, auf den Bewohnerstatus zu reagieren (YAAHM nach meiner Lesart).

Aber zurück zu deiner Ausgangsfrage: list nutzt intern zwei Funktionen, die Arrays mit aktuellen cfg und statefile-Auszügen liefern. Die kann man wegspeichern mit filewrite und mit fileread wieder einlesen. Dann einfach zeilenweise anwenden.

Kurzauszug (ohen die fileanweisungen):
    my @a = GetDefAndAttr($hcName);
    my @b = GetAllReadings($hcName);

    foreach my $linesa  ( @a ){
       AnalyzeCommand(undef, "$linesa");
    }
    foreach my $linesb  ( @b ){
       AnalyzeCommand(undef, "$linesb");
    }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Hackstall

sorry aber ich bin mit Deinem Kurzauszug überfordert. Anfänger halt.
Könntst Du mir bitte dennoch noch kurz Dein Weg erläutern.

Danke Andreas

Beta-User

Zitat von: Hackstall am 17 Mai 2019, 23:41:01
Der use case ist wie folgt:

ich habe meine Haussteuerung auf Haus, Zimmer und Device Basis via SmartVisu implementiert.

Bei der Zimmersteuerung und Haussteuerung selektiere ich zwischen:
Auto, Norm und Off.

Fuer alle Steuerungen (Auto, Off und Norm) habe ich verschiedene Settings. Fuer Auto und off sind diese statisch.
Die Normstellung moechte ich mir bei jeder Auto oder Off Selektion zwischenspeichern und diese moechte ich daher nicht verlieren. Daher wird vor umkonfiguration auf auto oder off  die norm-konfiguration gespeichert. wenn dann wieder von auto oder off wieder auf norm geschaltet wird würde ich ein restore machen.

Ueber alles moechte ich zum Beispiel wenn ich in Urlaub fahre einfach Haus auf off konfigurieren und
wenn ich wiederkomme auf norm zurückkonfigurieren.
...das sah irgendwie nicht nach "Anfängerlevel" aus...

Jetzt weiß ich nicht, wo anfangen ??? .

Generell: irgendwie klingt das auch nach "Lightscene", vielleicht solltest du dir das mal ansehen ("Light" ist m.E. irreführend, da geht es um das Abspeichern von ganzen Schaltungsszenarien, was nicht auf Licht beschränkt ist).

Also mal ein konkretes Beispiel: Es ist ein Ferientag, alle sind zuhause, es soll daher mollig warm sein:
defmod Heizung_Ferienmodus notify BW_Ferientag  { Value("BW_Ferientag") ? \
fhem "set Thermostat_Wohnzimmer_.*_Clima tempListTmpl restore FHEM/9999_tempList_edit.cfg:Wohnzimmer_Ferien,\\
set Thermostat_Esszimmer_.*_Clima tempListTmpl restore FHEM/9999_tempList_edit.cfg:Esszimmer_Ferien,\\
set Thermostat_Buero_Clima tempListTmpl restore FHEM/9999_tempList_edit.cfg:Buero_Ferien,\\
set Thermostat_EssZi_Climate regSet weekPrgSel prog2"\
: fhem "set Thermostat_Wohnzimmer_.*_Clima tempListTmpl restore FHEM/9999_tempList_edit.cfg:Wohnzimmer,\\
set Thermostat_Esszimmer_.*_Clima tempListTmpl restore FHEM/9999_tempList_edit.cfg:Esszimmer,\\
set Thermostat_Buero_Clima tempListTmpl restore FHEM/9999_tempList_edit.cfg:Buero,\\
set Thermostat_EssZi_Climate regSet weekPrgSel prog1" }

Damit wird beim Wechsel von Ferien auf nicht-Ferien und andersrum auf alle Thermostate eine andere Temperaturliste geschrieben.

Dann habe ich notify, die bei (längerer) Abwesenheit der Kinder eben die desiredTemp ändern und auf manual stellen, selbst wenn Ferien sind...

Es gibt aber viele Wege, sowas umzusetzen (schau mal z.B. im Wiki nach Heating_Control, ist zwar veraltet, geht aber ganz genauso mit WeekdayTimer), es wäre daher gut, du würdest deine konkreten use-cases noch etwas konkreter darstellen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

justme1968

warum möchtest du readings speichern und wieder herstellen? das hätte keinerlei auswirkung ausser in der anzeige. das überschreiben eines readings bewirkt nichts. ausser vielleicht das device durcheinander zu bringen.

möchtest du nach dem urlaub wirklich den zustand wieder herstellen der vor dem urlaub vorhanden war? oder vielleicht doch eher einen definierten 'default' zustand?

beides wäre aber mit LightScene möglich. entweder mit dem LightScene save eine temporäre szene mit dem aktuellen zustand speichern und dann wieder herstellen, oder bestimmte default szenen anlegen die sich dann gezielt wieder herstellen lassen.


aber: ist das wirklich was du willst? es geht doch um hausautomation. nicht darum von hand so viel wie möglich zu machen. schau dir mal an ob du es nicht hin bekommst das fhem automatisch erkennt das keiner da ist und entsprechend reagiert. und wenn jemand zurück kommt ebenfalls.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Hackstall

Ja das moechte ich.
Im urlaub moechte ich auf off gehen und nach dem Urlaub wieder auf norm.
Der Knackpunkt ist die Speicherung des Norm- Wochenplans der sich doch
bei Norm Betrieb immer wieder mal aendert je nachdem wie die Familie drauf
Ist. Daher sind die festen lightscenes nicht optimal fuer mich

Gruss Andreas

justme1968

da steht nichts von fest. du kannst mit dem lightscene save den aktuellen zustand speichern und später wieder herstellen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Hackstall

Hallo nochmals etwas näher mein Use Case mit meiner derzeitigen Implementierung:

a) Den Mode selektiere ich via SmartVisu per Zimmer oder fürs ganze Haus (siehe Code1)

b) In meiner Util habe ich für jedes Zimmer folgende Implementierung (siehe Code 2)

c) Wie ihr seht steuere ich meinen Wochenplan mit UZSU aus SmartVisu heraus und
eigentlich ist diese Konfiguration zu sichern, da Sie sich ändern könnte.
Ich nutze UZSU für Heizung, FB Heizung, Rollos und Licht.

d) Urlaubs Mode wäre (ev Auto oder Off) Wenn Auto dann möchte ich zufällig immer
mal wieder ein Licht einschalten oder ein Rollo hochfahren um zu suggerieren dass jemand zuhause ist.

Hoffe das hilft.

Gruss Andreas


Code1:

define ntfy_Haus_Mode notify Haus_Mode_Select:(EG|OG|DG).+?Mode:.* {\
   my @myModeEvent = split(":",$EVENT);;\
   my $myModeName = $myModeEvent[0];;\
   my $myModePrevName = $myModeEvent[0]."Prev";;\
   my $myMode = ReadingsVal("Haus_Mode_Select",$myModeName,"Norm");;\
   my $myPrevMode = ReadingsVal("Haus_Mode_Select",$myModeName."Prev","Norm");;\
\
       if ($myModeName eq "EG.Wz.Mode") \
          { \
            EG_Wz_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "EG.Ez.Mode") \
          { \
            EG_Ez_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "EG.Ku.Mode") \
          { \
            EG_Ku_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "EG.Fl.Mode") \
          { \
            EG_WC_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "EG.WC.Mode") \
          { \
            EG_WC_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "OG.KiA.Mode") \
          { \
            OG_KiA_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "OG.KiM.Mode") \
          { \
            OG_KiM_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "OG.AzA.Mode") \
          { \
            OG_AzA_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "OG.AzS.Mode") \
          { \
            OG_AzS_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "OG.Bad.Mode") \
          { \
            OG_Bad_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "DG.Sz.Mode") \
          { \
            DG_Sz_ModeControl($myPrevMode,$myMode);;\
          } \
       if ($myModeName eq "DG.Bad.Mode") \
          { \
            DG_Bad_ModeControl($myPrevMode,$myMode);;\
          } \
\
    fhem ("sleep 0.1;;setreading Haus_Mode_Select $myModePrevName $myMode");;\
}
setuuid ntfy_Haus_Mode 5cd34c13-f33f-b8ba-b838-5a3d17af43523744
attr ntfy_Haus_Mode DbLogExclude .*
attr ntfy_Haus_Mode group Grp-System-Notify
attr ntfy_Haus_Mode icon remotecontrol/black_btn_PLAYgreen
attr ntfy_Haus_Mode room 9.6_System


define ntfy_Haus_Alle_Zimmer notify Haus_Mode_Select:Haus.Mode:.* {\
   my @myModeEvent = split(":",$EVENT);;\
   my $myModeName = $myModeEvent[0];;\
   my $myModePrevName = $myModeEvent[0]."Prev";;\
   my $myMode = ReadingsVal("Haus_Mode_Select",$myModeName,"Norm");;\
   my $myPrevMode = ReadingsVal("Haus_Mode_Select",$myModeName."Prev","Norm");;\
\
       if ($myModeName eq "Haus.Mode") \
          { \
fhem ("sleep 0.1;;setreading Haus_Mode_Select EG.Wz.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select EG.Ez.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select EG.Ku.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select EG.Fl.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select EG.WC.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select OG.KiA.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select OG.KiM.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select OG.AzA.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select OG.AzS.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select OG.Bad.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select DG.Sz.Mode $myMode");;\
fhem ("sleep 0.1;;setreading Haus_Mode_Select DG.Bad.Mode $myMode");;\
          } \
}
setuuid ntfy_Haus_Alle_Zimmer 5cddd813-f33f-b8ba-857c-505a5f0159b2a4eb
attr ntfy_Haus_Alle_Zimmer DbLogExclude .*
attr ntfy_Haus_Alle_Zimmer group Grp-System-Notify
attr ntfy_Haus_Alle_Zimmer icon remotecontrol/black_btn_PLAYgreen
attr ntfy_Haus_Alle_Zimmer room 9.6_System



Code2:

sub EG_Wz_ModeControl ($$) {
my ($from,$to) = @_;
fhem("set teleBotAK msg \@Andreas_Krause EG_Wz_ModeControl $from $to");    
    if ($from eq "Norm")
       {
     #save current configuration
#read Wochenplan Setting Heizung
#read Wochenplan Setting Rollo
#save Config
       }
    if ($to eq "Norm")
       {
         #restore saved configuration
#read saved Config and restore
       }
    if ($to eq "Auto")
       {
         #configure auto mode
       }
    if ($to eq "off")
       {
         #configure off mode
#disable Heizung Wochenplan
fhem ("set wdt_uzsu_EG.Wz.Heizung.uzsuicon_0 disable 1");
#set temperature to 14deg
fhem ("set Tado_EG.Wz.Heizungsthermostat temperature 14.0");
#disable Rollo Wochenplan
fhem ("set wdt_uzsu_EG.Wz.Rollo.RechtsLinks.uzsuicon_0 disable 1");
#set Rollo down
fhem ("EG.Wz.Rollo.RechtsLinks.UpDwn dn");
       }
}

sub EG_Ez_ModeControl ($$) {
   my ($from,$to) = @_;
   fhem("set teleBotAK msg \@Andreas_Krause EG_Ez_ModeControl  $from $to");    
   if ($from eq "Norm")
       {
     #save current configuration
       }
    if ($to eq "Norm")
       {
         #restore saved configuration
       }
    if ($to eq "Auto")
       {
         #configure auto mode
       }
    if ($to eq "off")
       {
         #configure off mode
#disable Heizung Wochenplan
fhem ("set wdt_uzsu_EG.Ez.Heizung.uzsuicon_0 disable 1");
#set temperature to 14deg
fhem ("set Tado_EG.Ez.Heizungsthermostat temperature 14.0");
       }
}

Beta-User

Hmmm,

also irgendwie habe ich den Eindruck, dass du unbedingt das Rad nochmal erfinden willst ??? .

Ich sehe da Ansätze, structure nochmal neu zu erfinden (oder ggf. die RESIDENTS-Geschichte)...

Aber mal ein konkreter Vorschlag; an sich ist alles, was wir dazu bisher gesehen haben ja Pseudocode (der dazu auch noch weiter generalisiert werden könnte, wenn er denn Sinn macht, was ich immer noch nicht glaube).
In Code 2 steht ziemlich am Ende:
fhem ("set wdt_uzsu_EG.Ez.Heizung.uzsuicon_0 disable 1");Der Name klingt danach, als wäre es ein WeekdayTimer. Bedingung, dass er nicht aktiv sein soll, scheint "EG_Ez_ModeControl off" zu sein?
Das kann direkt im WeekdayTimer hinterlegt werden, entweder in der DEF oder als "delayedExecutionCond" (Beipspiele sind in der cref). (K.A., wie man das in der ViSu ggf. visualisiert, aber m.E. braucht es gar nicht visualisiert zu werden, es soll ja einfach "so sein"...)


Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DasQ

#18
Das Problem ist ... wenn man nicht weis, das Rad schon erfunden ist, aber dringend was in der Art Rad braucht, erfindet man eben kurz Rad neu.
Geht mir ständig so. ;) ::)

Aber oft scheiterts  einfach nur am passenden Suchbegriff.

Btw. @TE, mir hat mal mein Dozent gesagt, wenn du 3 mal fast das gleich schreibst, bau ne schleife
Fhem on MacMini/Ubuntu.
Absoluter Befürworter der Konsequenten-Kleinschreibung https://de.wikipedia.org/wiki/Kleinschreibung
Infos zu Klimawandel http://www.globalcarbonatlas.org

Hackstall

Hallo,

ihr habt alle in gewisser Weise Recht und mit den bisherigen Hinweisen kann ich auch mein Problem (so glaube ich) lösen.

Structure oder anderes hat nur ein Nachteil es ist irgendwie statisch.
Ich möchte einem Mode eine sich ändernde (vom Benutzer) Configuration zuordnen und bei Bedarf wieder restaurieren.

In meinem Fall sind die Auto und Off Modes statisch und ändern sich nicht (hardcoded).
Die Temperature, WochenPlanungen, Settings etc von zBsp Heizungen, Rollos (Winkel) wird von meiner geliebten Familie im
Norm Betrieb immer wieder mal geändert. Somit möchte ich wenn ich im Urlaub auf Auto umstelle gerne wieder alle alten/neuen
Einstellungen des Norm Betriebs wiederhaben.

Ihr habt Recht Kopie oder Speichern aber speichern finde ich irgend wie besser und nachhaltiger. Ich speichere ja nur die Settings
des Norm Mode. Ich sehe noch etwas Arbeit bei meinen vielen wdt Settings die mal weniger mal mehr sind. Hier müsste ich (sofern
Norm Mode aktiviert wird sicherlich erst alle Zeilen löschen und dann den Norm wieder includieren.

Gruss Andreas und vielen Dank für Eure Hilfe

Gruss Andreas