FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: cerberus am 05 August 2016, 08:45:36

Titel: ReadingsValue und $EVTPART3
Beitrag von: cerberus am 05 August 2016, 08:45:36
Hallo, wie kann ich aus einem solchen Reading Wert


day    D04 E-EnergyB: 32.01 kWh E-EnergyBM: 60.84 kWh E-EnergyL: 12.22 kWh E-EnergyLM: 23.87 kWh

mit der Funktion ReadingsValue und $EVTPART3 eine bestimmten Wert dieses Readings extrahieren und für die Funktion userReadings nutzen um ein neues Reading zu berechnen?

Also angenommen ich möchte von dem Reading "E-EnergyB" den 3. Wert aus dem Reading "day" subtrahieren um z.B. ein userReading "E-EnergyBTD" zu erstellen?

Grüße
cerberus
   
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: DeeSPe am 05 August 2016, 09:23:42
Zitat von: cerberus am 05 August 2016, 08:45:36
Hallo, wie kann ich aus einem solchen Reading Wert


day    D04 E-EnergyB: 32.01 kWh E-EnergyBM: 60.84 kWh E-EnergyL: 12.22 kWh E-EnergyLM: 23.87 kWh

mit der Funktion ReadingsValue und $EVTPART3 eine bestimmten Wert dieses Readings extrahieren und für die Funktion userReadings nutzen um ein neues Reading zu berechnen?

Also angenommen ich möchte von dem Reading "E-EnergyB" den 3. Wert aus dem Reading "day" subtrahieren um z.B. ein userReading "E-EnergyBTD" zu erstellen?

Grüße
cerberus

Probiere es doch einmal mit z.B.:
ReadingsNum(<devicename>,<reading>,<defaultvalue>)

Gruß
Dan

Edit: Sorry hatte die Schreibweise falsch.
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: cerberus am 05 August 2016, 09:59:01
Hallo Dan, danke für die Info, aber ich glaube das funktioniert nicht. Diese Funktion Filtert, so wie ich verstehe, nur die numerischen Werte. Wie kann ich damit definieren (wie z.B. mit $EVTPART), das ich eine bestimmte Stelle des Readings haben will?

so ähnlich wie hier

https://forum.fhem.de/index.php/topic,34914.msg272959.html#msg272959 (https://forum.fhem.de/index.php/topic,34914.msg272959.html#msg272959)

Grüße cerberus
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: JoWiemann am 05 August 2016, 10:27:55
Hallo,

Du könntest es mit split() machen:


(split(" ", "D04 E-EnergyB: 32.01 kWh E-EnergyBM: 60.84 kWh E-EnergyL: 12.22 kWh E-EnergyLM: 23.87 kWh"))[n]


[n] ist durch den Index der Werteposition zu ersetzen.
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: DeeSPe am 05 August 2016, 11:05:18
Zitat von: JoWiemann am 05 August 2016, 10:27:55
Hallo,

Du könntest es mit split() machen:


(split(" ", "D04 E-EnergyB: 32.01 kWh E-EnergyBM: 60.84 kWh E-EnergyL: 12.22 kWh E-EnergyLM: 23.87 kWh"))[n]


[n] ist durch den Index der Werteposition zu ersetzen.
  • für D04, [3] für kWh

    Für Dein Reading würde das dann so aussehen:

    (split(" ", ReadingsVal(<Dein Device>,"day",""))[n]


    Grüße Jörg
Die split Funktion hatte ich extra nicht genannt weil es dazu etwas Erfahrung mit Perl braucht.
Du könntest aber $EVTPART einsetzen, zähle dazu einfach die einzelnen Wörter/Zahlen/Einheiten deines Readings die durch Leerzeichen getrennt sind und setze die ermittelte Zahl hinter $EVTPART.

Also wenn das Reading "day" bei Dir so aussieht:
D04 E-EnergyB: 32.01 kWh E-EnergyBM: 60.84 kWh E-EnergyL: 12.22 kWh E-EnergyLM: 23.87 kWh
dann sollte es $EVTPART3 = 32.01  sein, $EVTPART6 = 60.84, $EVTPART9 = 12.22 und $EVTPART12 = 23.87

Gruß
Dan
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: cerberus am 05 August 2016, 11:18:39
Zitat von: DeeSPe am 05 August 2016, 11:05:18
Die split Funktion hatte ich extra nicht genannt weil es dazu etwas Erfahrung mit Perl braucht.
Du könntest aber $EVTPART einsetzen, zähle dazu einfach die einzelnen Wörter/Zahlen/Einheiten deines Readings die durch Leerzeichen getrennt sind und setze die ermittelte Zahl hinter $EVTPART.

Also wenn das Reading "day" bei Dir so aussieht:
D04 E-EnergyB: 32.01 kWh E-EnergyBM: 60.84 kWh E-EnergyL: 12.22 kWh E-EnergyLM: 23.87 kWh
dann sollte es $EVTPART3 = 32.01  sein, $EVTPART6 = 60.84, $EVTPART9 = 12.22 und $EVTPART12 = 23.87

Gruß
Dan

Danke Dan, wie würde dann der String mit der Funktion readingsValue aussehen? ich weiß nicht genau wo ich dann $EVTPART3 mit Readingsvalue. Oder funktioniert das nur mit Notify?

Gruß
cerberus
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: DeeSPe am 05 August 2016, 11:57:56
Mit ReadingsVal musst Du die von Jörg vorgeschlagene Variante mit split nehmen:
(split(" ", ReadingsVal(<Dein Device>,"day",""))[n]

n ersetzen mit der n-ten Stelle beginnend bei 0 (Null).
Also:
(split(" ", ReadingsVal(<Dein Device>,"day",""))[2]
gleich 32.01

(split(" ", ReadingsVal(<Dein Device>,"day",""))[5]
gleich 60.84

(split(" ", ReadingsVal(<Dein Device>,"day",""))[8]
gleich 12.22

(split(" ", ReadingsVal(<Dein Device>,"day",""))[11]
gleich 23.87

Gruß
Dan
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: cerberus am 05 August 2016, 13:34:46
Danke Dan und Jörg, habe es mit euere Hilfe hin bekommen.

Wenn ich zu Hause bin schreibe noch nochmal hier rein wie genau.

Grüße
cerberus
Titel: Antw:ReadingsValue und $EVTPART3
Beitrag von: cerberus am 05 August 2016, 21:47:46
So hier mal der Code wie ich es gemacht haben

E-EnergyBTD {ReadingsVal("OWC1", "E-EnergyB", 0) - (split ' ', ReadingsVal("OWC1","day","")) [2]}, E-EnergyLTD  {ReadingsVal("OWC1", "E-EnergyL", 0) - (split ' ', ReadingsVal("OWC1","day","")) [8]}

Ich berechne via userReading aus den Readings eines OWCOUNT den Energiebezug und die Energielieferung des Tages als Differenz zwischen dem letztem Zählerstand gestern und dem aktuellem von heute, so erhalte ich den Energie-Tagesbezug bzw. die Tageslieferung.

Grüße
cerberus