Hauptmenü

state file auslesen

Begonnen von ThomasFh, 17 Juni 2019, 23:45:52

Vorheriges Thema - Nächstes Thema

ThomasFh

Hallo,

gibt es eine Art API Doku wo das Auslesen des state files beschrieben ist?

Ich hätte gerne nach dem init einen Wert aus dem Statefile gelesen und in einem Modul gesetzt.

Danke
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

amenomade

Was in statefile steht is auch beim Start im entspr. Device direkt als Reading abzulesen. Was willst Du genau machen?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

ThomasFh

in meinem statefile stehen: die Werte von EM1010PC Sensor EM1000WZ
Modul: 61_EMWZ.pm

setstate Hauptzaehler 1.28 kW
setstate Hauptzaehler 2019-06-18 08:40:38 5min_pulses 8
setstate Hauptzaehler 2019-06-18 08:40:38 RperKW_EC 75
setstate Hauptzaehler 2019-06-18 08:40:38 alarm_PA 0 Watt
setstate Hauptzaehler 2019-06-18 08:40:38 cum_kWh 7.888     <--- wir beim Neustart leider auf 0 gesetzt
setstate Hauptzaehler 2019-06-18 08:40:38 energy 0.107
setstate Hauptzaehler 2019-06-18 08:40:38 power 1.280
setstate Hauptzaehler 2019-06-18 08:40:38 price_CF 0.250


Beim Neustart von fhem möchte ich den Wert: cum_kWh
aus dem Statefile in das Reading übernehmen.

Im genannten Modul sehe ich, dass beim ersten Aufruf (Zeile 80)
der Wert von:
$hash->{READINGS}{cum_kWh}{VAL}
uninitialisiert ist und auf 0 gesetzt wird.
ich wollte statt 0 den Wert aus dem Statefile einlesen und als Startwert setzen.

EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

CoolTux

Dann bei Dir ein userreadings welches den Wert in ein neues Reading schreibt und füge eine Bedingung ein dem zu Folge nicht das userreadings geschrieben werden soll wenn der Wert null ist.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ThomasFh

@CoollTux

meinst Du, dass ich dem EM1000WZ ein userReading hinzugügen soll:

attr Hauptzaehler userReadings Zaehlerstand:12


???
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

CoolTux

Nicht so, aber vom Sinn her stimmt es.
Gib mal bitte ein list von dem Device
list ist ein FHEM Befehl der in der Kommandozeile von FHEMWEB eingegeben werden kann.

list Hauptzaehler
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Hier mal ein Beispiel wie es ausschauen könnte

Internals:
   FUUID      5d08d610-f33f-d1da-62e5-4edee4e96e10648d
   NAME       Hauptzaehler
   NR         149
   STATE      ???
   TYPE       dummy
   OLDREADINGS:
     2019-06-18 14:27:26   cum_kWh         445.45
     2019-06-18 14:26:22   userCum_kWh     4.945
   READINGS:
     2019-06-18 14:27:36   cum_kWh         0
     2019-06-18 14:27:36   userCum_kWh     445.45
Attributes:
   oldreadings cum_kWh
   readingList cum_kWh
   room       Test
   setList    cum_kWh
   userReadings userCum_kWh:cum_kWh:.* {
               if (ReadingsNum($name,'cum_kWh',0) > 0) {
       ReadingsNum($name,'cum_kWh',0);
   }
               else {
       OldReadingsNum($name,'cum_kWh',0);
   }
}
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ThomasFh

#7
@CoolTux, erstmal danke ..

So sieht es bei mir aus:


list Hauptzaehler

Internals:
   DEF        1
   DEVNR      1
   FUUID      5d07eda7-f33f-8871-44ac-50c6b7318edae112
   IODev      EM1010PC
   NAME       Hauptzaehler
   NR         15
   STATE      0.48 kW
   TYPE       EMWZ
   READINGS:
     2019-06-18 15:42:26   5min_pulses     3
     2019-06-18 15:42:26   RperKW_EC       75
     2019-06-18 15:42:26   alarm_PA        0 Watt
     2019-06-18 15:42:26   cum_kWh         1.572
     2019-06-18 15:42:26   energy          0.040
     2019-06-18 15:42:26   power           0.480
     2019-06-18 15:42:26   price_CF        0.250
     2019-06-18 15:42:26   summary         Pulses: 3 Energy: 0.040 Power: 0.480 Cum: 1.572
Attributes:
   IODev      EM1010PC
   room       ENERGY




Mit userreadings habe ich noch nie gearbeitet und werde auch nicht aus der cmdref und wiki für userReading schlau.

Ich hatte bisher nur mit dummy devices und setreadings gearbeitet.
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

CoolTux

Hallo Thomas,

Bitte immer Codetags verwenden wenn Du Code oder Logausgaben postest.
Das ist in der Editorsymbolleiste das Raute Zeichen.

Schau Dir mal mein obiges Beispiel an.

userReadings userCum_kWh:cum_kWh:.* {
               if (ReadingsNum($name,'cum_kWh',0) > 0) {
       ReadingsNum($name,'cum_kWh',0);
   }
               else {
       OldReadingsNum($name,'cum_kWh',0);
   }
}


userReadings userCum_kWh:cum_kWh:.*
Das "userCum_kWh" soll Dein neues Reading werden. Damit dieses Reading gefüllt wird muss ein interner Trigger verwendet werden. Das sagt das "cum_kWh:.*"
userReadings userCum_kWh:cum_kWh:.*
bedeutet also, wenn ein Event für cum_kWh:.* kommt dann schreibe das neue Reading (userReadings).

Der Rest ist Perl, wir müssen dem userReadings ja noch sagen mit was wir ihn füllen wollen

{
               if (ReadingsNum($name,'cum_kWh',0) > 0) {
       ReadingsNum($name,'cum_kWh',0);
   }
               else {
       OldReadingsNum($name,'cum_kWh',0);
   }
}


Wir verwenden eine Abfrage.
if (ReadingsNum($name,'cum_kWh',0) > 0)
ReadingsNum ist eine FHEM Interne Funktion welche uns Hilft den Wert des Readings aus zu lesen, da wir lediglich mit Zahlen arbeiten wollen nehmen wir ReadingsNum statt ReadingsVal.
Wenn also der Wert welchen wir mit der Funktion ReadingsNum erhalten größer 0 ist dann soll er diesen Wert in unser neues Reading userCum_kWh schreiben.
Wenn nicht, dann passiert leider auch etwas. Und zwar würde er dann einen leeren String zurück geben, da wir aber den alten Wert behalten wollen in diesem Reading müssen wir diesen neu aus dem original Reading wieder ein lesen.
Leider ist das ja nun 0, aber dafür gibt es die Möglichkeit von OldReadings. OldReadings beinhaltet immer den Vorgänger Wert vom aktuellen Reading. Daher setzen wir erst das Attribut oldreadings mit dem Wert unseres Readingsnamen von welchen wir auch den Vorgängerwert brauchen.
Und in unserem else {} verwenden wir dann die Funktion zum auslesen des oldreadings.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ThomasFh

Danke CoolTux,

aber das wird dann aber für meinen Zweck nur funktionieren, wenn das betreffende userReading auch im Statefile gespeichert wird, denn ich möchte fhem auch (mal) herunterfahren und den aktuellen Zählerstand des physischen Zählers in das Statefile schreiben. Dann soll fhem beim Starten den Wert aus dem statfile einlesen.

Wenn ich aber ein userReading setzte, dann wird selbiges doch nicht im Statefile abgelegt, oder sehe ich das falsch?
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

Otto123

Zitat von: ThomasFh am 18 Juni 2019, 17:16:20
oder sehe ich das falsch?
ich würde sagen ja. Schau doch einfach in die Raw Def, dort siehst Du was im statefile steht.

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

CoolTux

Zitat von: ThomasFh am 18 Juni 2019, 17:16:20
Danke CoolTux,

aber das wird dann aber für meinen Zweck nur funktionieren, wenn das betreffende userReading auch im Statefile gespeichert wird, denn ich möchte fhem auch (mal) herunterfahren und den aktuellen Zählerstand des physischen Zählers in das Statefile schreiben. Dann soll fhem beim Starten den Wert aus dem statfile einlesen.

Wenn ich aber ein userReading setzte, dann wird selbiges doch nicht im Statefile abgelegt, oder sehe ich das falsch?

Auch userreadings werden ins statefile geschrieben. Wäre sonst auch mehr wie ungünstig.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

justme1968

alle readings werden gesichert wenn fhem beendet wird oder save aufgerufen wird und beim start wieder eingelesen. sobald ein reading gesetzt ist gibt es keinerlei unterscheidung mehr über welchen weg das reading ursprünglich mal angelegt wurde.

das statefile ist etwas internes das niemand anfassen sollte / braucht.

für den anwendungsfall eines monoton steigenden zählers gibt es den user readings typ monotonic:userReadings userCum_kWh:cum_kWh:.* monotonic { ReadingsNum($name,'cum_kWh',0) }

es wäre besser beim modul anzusetzen und dort das gewünschte verhalten einzubauen wenn dort etwas nicht sinnvoll ist. und bei der gelegenheit gleich den direkt zugriff auf ...{READINGS}... abstellen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

ThomasFh

#13
OK, dann bin ich auf dem vollkommen falschen Dampfer.

wenn ich ein userReading erstellen will, dachte ich, selbiges sei so richtig (was es aber nicht ist):


attr Hauptzaehler  userReadings userCum_kWh:cum_kWh:.* monotonic { ReadingsNum($name,'cum_kWh',0) }


Das userReading erscheint dann bei mir (mal abgesehen davon, dass es auch hier falsch als string erscheint und nicht ausgewertet wird) in fhem hier:

Attributes
IODev   EM1010PC deleteattr
room   ENERGY    deleteattr
userReadings   userCum_kWh:cum_kWh:.* monotonic { ReadingsNum($name,'cum_kWh',0) }   deleteattr


D.h., ich mache schon beim Erstellen einen Fehler ..


--

PS: wäre noch nett, wenn mir jemand sagen würde, ob $name eine interen fhem Variable ist, oder ob ich die setzen muss und wenn ja, womit.
EM1010PC, EM1000WZ, WS300PC, S300TH, Fritz Dect 200, Victron MPII, Cerbo GX, US3000C

CoolTux

$name ist eine interne Variable.

Wie genau setzt Du denn das userreadings Attribut? Ich hoffe doch schwer Du machst es mit Hilfe des FHEMWEB Interfaces und nicht von Hand in der Konfig.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net