FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ThomasFh am 17 Juni 2019, 23:45:52

Titel: state file auslesen
Beitrag von: ThomasFh am 17 Juni 2019, 23:45:52
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
Titel: Antw:state file auslesen
Beitrag von: amenomade am 18 Juni 2019, 08:24:02
Was in statefile steht is auch beim Start im entspr. Device direkt als Reading abzulesen. Was willst Du genau machen?
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 08:56:09
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.

Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 09:07:51
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.
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 13:52:48
@CoollTux

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

attr Hauptzaehler userReadings Zaehlerstand:12


???
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 14:03:31
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
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 14:29:00
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);
   }
}
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 15:49:57
@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.
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 16:24:39
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
Titel: Antw:state file auslesen
Beitrag 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?
Titel: Antw:state file auslesen
Beitrag von: Otto123 am 18 Juni 2019, 17:26:28
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
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 17:30:47
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.
Titel: Antw:state file auslesen
Beitrag von: justme1968 am 18 Juni 2019, 17:31:34
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.
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 17:42:05
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.
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 18:01:14
$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.
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 18:05:27
über das fhem web interface.

Ist die obige code Zeile richtig?


Habe verbose auf 5 und im logfile stehen keine Fehler.
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 18:16:06
Legt er kein Reading an? Also das neue userreadings?
Andre sein Code sollte zu mindest klappen. Geht aber nur wenn auch ein Event entsprechend kommt für das normale Reading was wir ja kopieren wollen.
Schau mal in Eventmonitor ob überhaupt ein Event für cum_kWh kommt.
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 18:26:12
im eventlog:

Events (Filter: .*)   FHEM log   

2019-06-18 18:22:26 EMWZ Hauptzaehler power: 0.800
2019-06-18 18:22:26 EMWZ Hauptzaehler price_CF: 0.250
2019-06-18 18:22:26 EMWZ Hauptzaehler cum_kWh: 3.195
2019-06-18 18:22:26 EMWZ Hauptzaehler alarm_PA: 0 Watt
2019-06-18 18:22:26 EMWZ Hauptzaehler energy: 0.067
2019-06-18 18:22:26 EMWZ Hauptzaehler summary: Pulses: 5 Energy: 0.067 Power: 0.800 Cum: 3.195
2019-06-18 18:22:26 EMWZ Hauptzaehler 5min_pulses: 5
2019-06-18 18:22:26 EMWZ Hauptzaehler RperKW_EC: 75


Legt er ein Reading an?

Da ich noch nie gesehen habe wie das auszusehen hat, kann ich nur mutmaßen.

unter Attribues
steht

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

aber in den Readings selbst steht nur

Readings
5min_pulses   5   2019-06-18 18:22:26
RperKW_EC   75   2019-06-18 18:22:26
alarm_PA   0 Watt   2019-06-18 18:22:26
cum_kWh   3.195   2019-06-18 18:22:26
energy   0.067   2019-06-18 18:22:26
power   0.800   2019-06-18 18:22:26
price_CF   0.250   2019-06-18 18:22:26
summary   Pulses: 5 Energy: 0.067 Power: 0.800 Cum: 3.195   2019-06-18 18:22:26


ich schätze mal, dass hier das userReading erscheinen müsste? Oder liege ich falsch?




-----

RAW DEFINITION


defmod Hauptzaehler EMWZ 1
attr Hauptzaehler IODev EM1010PC
attr Hauptzaehler room ENERGY
attr Hauptzaehler userReadings userCum_kWh:cum_kWh:.* monotonic { ReadingsNum($name,'cum_kWh',0) }

setstate Hauptzaehler 0.64 kW
setstate Hauptzaehler 2019-06-18 18:32:26 5min_pulses 4
setstate Hauptzaehler 2019-06-18 18:32:26 RperKW_EC 75
setstate Hauptzaehler 2019-06-18 18:32:26 alarm_PA 0 Watt
setstate Hauptzaehler 2019-06-18 18:32:26 cum_kWh 3.275
setstate Hauptzaehler 2019-06-18 18:32:26 energy 0.053
setstate Hauptzaehler 2019-06-18 18:32:26 power 0.640
setstate Hauptzaehler 2019-06-18 18:32:26 price_CF 0.250
setstate Hauptzaehler 2019-06-18 18:32:26 summary Pulses: 4 Energy: 0.053 Power: 0.640 Cum: 3.275

Titel: Antw:state file auslesen
Beitrag von: krikan am 18 Juni 2019, 19:03:37
Das Modul https://svn.fhem.de/trac/browser/trunk/fhem/FHEM/61_EMWZ.pm nutzt nicht die reading.*update- Funktionen zum Readings-Setzen/Event-Auslösung. Darum wird afaik das Attribut userReadings nicht aktualisiert/unterstützt.

Gruß, Christian
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 19:31:44
Danke Christian,

Was ich nicht verstehe ist, wieso wird userreadings in der Attribut Liste angeboten obwohl laut Code
$readingFnAttributs nicht verwendet wird?


Grüße
Titel: Antw:state file auslesen
Beitrag von: krikan am 18 Juni 2019, 19:47:03
In https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl ist userReadings eben nicht bei $readingFnAttributes enthalten, sondern bei $AttrList. Warum das so ist, entzieht sich meinem Kenntnisstand, aber die Besonderheit hatte mich irgendwann schon einmal beschäftigt.
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 19:51:43
Ah daher also. Danke Dir.
Leider ist dem User damit immer noch nicht geholfen. Das Modul scheint Rudi zu gehören, eventuell sollte der User sein Anliegen im entsprechenden Modulforum vorbringen.
Titel: Antw:state file auslesen
Beitrag von: Otto123 am 18 Juni 2019, 20:22:24
Mal abgesehen von der letzten Erkenntnis:
So würde ich das Userreadings machen:
userReadings userCum_kWh monotonic { ReadingsNum($name,'cum_kWh',0) }
Das es im Modul nicht geht, fällt mir als Würgaround ein:
Mach ein Dummydefine Hauptzaehler_dum dummy
Und ein notify
define n_Hauptzaehler notify Hauptzaehler:cum_kWh.* setreading Hauptzaehler_dum cum_kWh $EVTPART1
Und spiegel quasi das Gerät und mach dort das UserReadings

Gruß Otto
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 23:09:35
Vielen Dank an alle.

Das ich mir für diesen Zweck bereits ein dummy device erstellt habe, hatte ich nicht weiter erwähnt, da es mir zu umständlich erscheint. Das funktioniert natürlich.
Das ist mir für diesen Zweck aber einfach too much (alles läuft auf einem alten Raspi) und die Werte landen noch dazu wieder in einem anderen Gerät und somit auf einer anderen Anzeigeebene. D.h., ich muss dann wieder etwas "anstricken".

Eine abschließende Frage habe ich allerdings noch.

Woran erkenne ich, welches Modul ein userReading unterstützt?

Ich habe ja noch Alexa, Zigbee, Fritzbox und diverse andere ELV Komponenten, die ich ans Rennen bringen möchte.

Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 23:11:47
Das kannst Du nicht so einfach erkennen.
Du kannst aber davon ausgehen das fast alle Module userReadings unterstützen. Dieses Modul dürfte eine Ausnahme sein von denen es nur sehr sehr wenige geben sollte.


Grüße
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 18 Juni 2019, 23:17:08
sind das die Funktionen:

3.1 readingsBeginUpdate
3.2 readingsBulkUpdate
3.3 readingsBulkUpdateIfChanged
3.4 readingsEndUpdate
3.5 readingsSingleUpdate

?
Titel: Antw:state file auslesen
Beitrag von: CoolTux am 18 Juni 2019, 23:40:50
Ja das sind sie.
Titel: Antw:state file auslesen
Beitrag von: betateilchen am 19 Juni 2019, 00:40:59
Zitat von: CoolTux am 18 Juni 2019, 23:11:47
Das kannst Du nicht so einfach erkennen.

eigentlich schon... wenn im device das Attribut "stateFormat" angeboten wird, sollten auch userReadings funktionieren.
Zumindest wenn der Modulentwickler ordentlich gearbeitet hat.
Titel: Antw:state file auslesen
Beitrag von: ThomasFh am 19 Juni 2019, 13:07:39
Vielen Dank an alle für die Infos.

tolles Forum  :)