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
Was in statefile steht is auch beim Start im entspr. Device direkt als Reading abzulesen. Was willst Du genau machen?
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.
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.
@CoollTux
meinst Du, dass ich dem EM1000WZ ein userReading hinzugügen soll:
attr Hauptzaehler userReadings Zaehlerstand:12
???
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
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);
}
}
@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.
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
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?
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
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.
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.
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.
$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.
über das fhem web interface.
Ist die obige code Zeile richtig?
Habe verbose auf 5 und im logfile stehen keine Fehler.
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.
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
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
Danke Christian,
Was ich nicht verstehe ist, wieso wird userreadings in der Attribut Liste angeboten obwohl laut Code
$readingFnAttributs nicht verwendet wird?
Grüße
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.
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.
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
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.
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
sind das die Funktionen:
3.1 readingsBeginUpdate
3.2 readingsBulkUpdate
3.3 readingsBulkUpdateIfChanged
3.4 readingsEndUpdate
3.5 readingsSingleUpdate
?
Ja das sind sie.
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.
Vielen Dank an alle für die Infos.
tolles Forum :)