Ich möchte die aktuelle Leistung eines Stromverbrauchers in STATE haben, das z-wave-Gerät hat aber nur ein Reading, also flux mal ein readingsProxy definiert, hier das Listing:
Internals:
CFGFN
DEF ez_eingang:power
DEVICE ez_eingang
NAME en_power_ez_eingang
NOTIFYDEV ez_eingang,global
NR 29361
NTFY_ORDER 50-en_power_ez_eingang
READING power
STATE 0 W previous: 0 delta_time: 301 s
TYPE readingsProxy
CONTENT:
ez_eingang 1
READINGS:
2019-09-23 15:54:00 state 0 W previous: 0 delta_time: 301 s
Attributes:
room AATTEESSTT
Ich möchte aber nur den ersten Zahlenwert haben! In Perl gibt es so eine schöne split-Funktion, aber mir ist nicht klar, wie ich diese in das Attribut stateFormat eintrage. In perl kann ich programmieren
my @allewerte = split /\s+/,Value("en_power_ez_eingang");
my $gewuenschterWert = $allewerte[0];
nun muss das ja aber in FHEM via:
attr en_power_ez_eingang stateFormat {...}
Anstelle der 3 Pünktchen muss nun der ein perl-Ausdruck - geht das überhaupt? Oder gibt es eine andere ganz einfache Lösung? Wenn nicht werde ich ja in "99_utils" was programmieren.
Danke für eure Tipps.
Zitat von: ujaudio am 23 September 2019, 16:11:11
Ich möchte die aktuelle Leistung eines Stromverbrauchers in STATE haben, das z-wave-Gerät hat aber nur ein Reading, also flux mal ein readingsProxy definiert, hier das Listing:
Internals:
CFGFN
DEF ez_eingang:power
DEVICE ez_eingang
NAME en_power_ez_eingang
NOTIFYDEV ez_eingang,global
NR 29361
NTFY_ORDER 50-en_power_ez_eingang
READING power
STATE 0 W previous: 0 delta_time: 301 s
TYPE readingsProxy
CONTENT:
ez_eingang 1
READINGS:
2019-09-23 15:54:00 state 0 W previous: 0 delta_time: 301 s
Attributes:
room AATTEESSTT
Ich möchte aber nur den ersten Zahlenwert haben! In Perl gibt es so eine schöne split-Funktion, aber mir ist nicht klar, wie ich diese in das Attribut stateFormat eintrage. In perl kann ich programmieren
my @allewerte = split /\s+/,Value("en_power_ez_eingang");
my $gewuenschterWert = $allewerte[0];
nun muss das ja aber in FHEM via:
attr en_power_ez_eingang stateFormat {...}
Anstelle der 3 Pünktchen muss nun der ein perl-Ausdruck - geht das überhaupt? Oder gibt es eine andere ganz einfache Lösung? Wenn nicht werde ich ja in "99_utils" was programmieren.
Danke für eure Tipps.
attr en_power_ez_eingang stateFormat { (split /\s+/,Value("en_power_ez_eingang"))[0] }
Das hat leider nicht auf Anhieb funktioniert, aber durch probieren habe ich es herausgefunden:
attr en_power_ez_eingang stateFormat { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
Jetzt gibt es aber doch noch ein Problem: ich habe den Wert extrahiert, um mit dem verbleibenden Zahlenwert eine Logdatei zu beschreiben. Leider wird das Reading "state" geloggt und nicht das Internal "STATE". Naja, dachte ich mir, dann definierst du dir ein UserReading - doch das wird auch nicht geloggt.
define userReadings leistung { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
Nach nochmaligem Lesen des Wikis habe ich die Definition verändert
define userReadings leistung:state.* { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
aber das hat auch nicht geholfen, im Gegnteil, nun wurde das userReading gar nicht mehr aktualisiert.
Irgendwie habe ich heute einen Knoten im Hirn...
Hier noch das Listing des Logfiles:
Internals:
CFGFN
DEF /media/usb0/log/energy-%Y-%m.log en_power_ez_eingang:leistung:.*
FD 19
NAME log_en_power_ez_eingang
NOTIFYDEV en_power_ez_eingang
NR 31990
NTFY_ORDER 50-log_en_power_ez_eingang
REGEXP en_power_ez_eingang:leistung:.*
STATE active
TYPE FileLog
currentlogfile /media/usb0/log/energy-2019-09.log
logfile /media/usb0/log/energy-%Y-%m.log
READINGS:
2019-09-24 15:27:07 linesInTheFile 9
Attributes:
room Diagnose
Zitat von: ujaudio am 24 September 2019, 15:42:20
Jetzt gibt es aber doch noch ein Problem: ich habe den Wert extrahiert, um mit dem verbleibenden Zahlenwert eine Logdatei zu beschreiben. Leider wird das Reading "state" geloggt und nicht das Internal "STATE". Naja, dachte ich mir, dann definierst du dir ein UserReading - doch das wird auch nicht geloggt.
define userReadings leistung { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
Nach nochmaligem Lesen des Wikis habe ich die Definition verändert
define userReadings leistung:state.* { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
aber das hat auch nicht geholfen, im Gegnteil, nun wurde das userReading gar nicht mehr aktualisiert.
Irgendwie habe ich heute einen Knoten im Hirn...
userReadings leistung:en_power_ez_eingang:.* { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
Leider funktioniert das auch nicht - wobei 2 Dinge zu separieren sind:
Wenn ich das userReadings wie folgt definiere
define userReadings leistung { (split /\s+/,ReadingsVal("en_power_ez_eingang", "state", 0))[1] }
dann wird ein Reading "leistung" immer mit dem richtigen Zahlenwert beschrieben. Nur diese Definition funktioniert, die beiden anderen leider nicht.
Aber dieses Reading wird nicht in das Logfile geschrieben, welches ich wie folgt definiert habe (hier nochmals das Listing):
Internals:
CFGFN
DEF /media/usb0/log/energy-%Y-%m.log en_power_ez_eingang:leistung:.*
FD 19
NAME log_en_power_ez_eingang
NOTIFYDEV en_power_ez_eingang
NR 31990
NTFY_ORDER 50-log_en_power_ez_eingang
REGEXP en_power_ez_eingang:leistung:.*
STATE active
TYPE FileLog
currentlogfile /media/usb0/log/energy-2019-09.log
logfile /media/usb0/log/energy-%Y-%m.log
READINGS:
2019-09-24 15:27:07 linesInTheFile 9
Attributes:
room Diagnose
Mir ist bekannt, dass ich für ein svg-Plot den Zahlenwert nicht extrahieren muss, ich möchte aber kein Plot, sondern den Zahlenwert zukünftig mit einer eigenen Funktion auswerten.
Ich logge von anderen Definitionen gezielt Readings, das funktioniert, aber userReadings funktionieren nicht - bzw. habe ich da noch etwas falsch gemacht?
warum hast du das userReading an den readingsProxy gebastelt statt gleich an die Quelle ez_eingang ?
IMHO sollte dort das Logging klappen, aber bitte verpass dem userReading dort noch einen Trigger ala leistung:power.*
Zitat von: Wzut am 24 September 2019, 16:09:28
warum hast du das userReading an den readingsProxy gebastelt statt gleich an die Quelle ez_eingang ?
Eine gute Idee, um es einfacher zu machen, werde ich gleich mal umsetzen!
Zitat von: Wzut am 24 September 2019, 16:09:28
IMHO sollte dort das Logging klappen, aber bitte verpass dem userReading dort noch einen Trigger ala leistung:power.*
Ok
Ich habe die Änderung gemacht - aber ich bekomme kein userReading erezugt.
userReadings leistung:power.* { (split /\s+/,ReadingsVal("ez_eingang", "state", 0))[1] }
Das komplette Listing von ez_eingang sieht so aus:
Internals:
DEF cb8262d3 10
IODev zwusb0
LASTInputDev zwusb0
MSGCNT 14189
NAME ez_eingang
NR 194
STATE off
TYPE ZWave
ZWaveSubDevice no
cmdsPending 0
homeId cb8262d3
isWakeUp
lastMsgSent 1569335536.77054
nodeIdHex 0a
zwusb0_MSGCNT 14189
zwusb0_RAWMSG 0004000a0a3202a1425c9e00105caa
zwusb0_TIME 2019-09-24 16:32:33
OLDREADINGS:
READINGS:
2019-09-24 13:49:59 UNPARSED METER 0a3222a1425b93010d5ba5
2019-09-23 20:13:46 configButtonOnOff Enable
2019-09-23 20:13:47 configConfigureMaximumAlarmCurrent 12
2019-07-19 19:18:53 configConfigureMaximumOverLoadCurrent 13
2019-05-27 14:21:44 configConfigurePlugTimeSwitchFunction Disable
2019-07-19 19:18:57 configConfigurePowerReport 5
2019-09-23 20:13:48 configConfigureTimeSwitchPeriod 150
2019-09-23 20:13:48 configLedDisplay Enable
2019-09-23 20:13:48 configMeterReportInterval 300
2019-09-23 20:13:48 configRememberRelayONOFFStatus Enable
2019-09-23 20:13:49 configSendMeterReport Enable
2019-09-24 16:32:09 current 0.1 A previous: 0 delta_time: 38 s
2019-09-24 16:32:33 energy 0.11 kWh previous: 0.11 delta_time: 16 s
2019-01-13 14:03:56 model Neo CoolCam Power plug 12A
2019-01-13 14:03:56 modelConfig shenzen_neo/nas-wr01z.xml
2019-01-13 14:03:56 modelId 0258-0003-1087
2019-01-13 17:31:29 neighborList wk_kaminofen
2019-07-19 19:19:42 neighborUpdate done
2019-09-24 16:32:33 power 0 W previous: 10.69 delta_time: 16 s
2019-09-23 20:24:32 reportedState off
2019-09-24 16:32:16 state off
2019-09-24 16:32:17 timeToAck 0.537
2019-09-24 16:32:17 transmit OK
2019-09-24 16:32:33 voltage 237.1 V previous: 237.22 delta_time: 16 s
Attributes:
IODev zwusb0
classes ZWAVEPLUS_INFO MANUFACTURER_SPECIFIC VERSION ASSOCIATION ASSOCIATION_GRP_INFO DEVICE_RESET_LOCALLY POWERLEVEL CONFIGURATION SWITCH_BINARY SWITCH_ALL ALARM METER BASIC
devStateIcon off:20_k_steckdose0 on:20_k_steckdose1
event-on-change-reading .*
fp_zw_eisenbahnzimmer 300,200,0
room Eisenbahn
userReadings leistung:power.* { (split /\s+/,ReadingsVal("ez_eingang", "state", 0))[1] }
vclasses ALARM:8 ASSOCIATION:2 ASSOCIATION_GRP_INFO:1 BASIC:1 CONFIGURATION:1 DEVICE_RESET_LOCALLY:1 MANUFACTURER_SPECIFIC:2 METER:4 POWERLEVEL:1 SWITCH_ALL:1 SWITCH_BINARY:1 VERSION:2 ZWAVEPLUS_INFO:2
Nachtrag:
Da war natürlich noch ein copy-paste-Fehler drin, jetzt korrigiret ("power" statt "state"):
userReadings leistung:power.* { (split /\s+/,ReadingsVal("ez_eingang", "power", 0))[1] }
Funktioniert aber immer noch nicht! Aus obiger Erfahrung also geändert in
userReadings leistung { (split /\s+/,ReadingsVal("ez_eingang", "power", 0))[1] }
und schon funktioniert es. Nur dass ich das mit dem Trigger nin nicht mehr verstehe...
Ein userReading wird im gebildet aus Name des Readings und Funktion zum Befüllen.
Leistung:power.* ist kein gültiger Name. Diese Kombination, welche eine Regular Expression ist, wird z.B. beim at genutzt.
Grüße Jörg
Gesendet von iPhone mit Tapatalk
Zitat von: JoWiemann am 24 September 2019, 17:28:14
Leistung:power.* ist kein gültiger Name. Diese Kombination, welche eine Regular Expression ist, wird z.B. beim at genutzt.
da wage ich mal zu widersprechen, ich setze immer einen Trigger bei userReadings, siehe command.ref :
ZitatuserReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:
<reading>[:<trigger>] [<modifier>] { <perl code> }
Diese benutzerdefinierte Readings werden bei jeder Aktualisierung der Gerätereadings gesetzt, indem das spezifizierte perl code { <perl code> } ausgeführt wird, und dessen Wert dem Reading zugewiesen wird. Falls <trigger> spezifiziert ist, dann findet diese Ausführung nur dann statt, falls einer der aktualisierten Readings dem regexp <trigger> entspricht (matched).
Beispiele:
attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
attr myMultiMeter userReadings energy1:counters.A.* {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B.*
Hast recht. Gedächtnisschwund im Alter.
Grüße Jörg
Gesendet von iPhone mit Tapatalk
Danke,
mein Fehler: ich habe nur das Wiki gelesen, nicht die Commandref. Das, was in der Commandref steht, ist für mich eindeutig und klar. Mein Code
userReadings leistung { (split /\s+/,ReadingsVal("ez_eingang", "power", 0))[1] }
funktioniert nicht nur, er ist auch richtig:
* er benennt das userReading
* er definiert der perl-Code
Trigger und Modifier sind optional und bei mir nicht vorhanden.
Wenn ich den optionalen Trigger aber angeben möchte, dann wäre nach meinem Verständnis in meinem Beispiel
:power*
zu ergänzen. Denn das Reading, auf welches getriggert werden soll heißt power und es soll auf alle Änderungen triggern, also .*
Das wäre auch im Einklang mit den Beispielen. Jetzt muss ich mal überlegen, warum
userReadings leistung:power.* { (split /\s+/,ReadingsVal("ez_eingang", "power", 0))[1] }
bei mir nicht funktioniert - denn das Reading power ändert sich definitiv.
nur nochmal zum besseren Durchblick :
du hast das userReading jetzt direkt im Device ez_eingang ?
wenn ja :
dann sollte der Trigger eigentlich genau so funktionieren bzw. hast du noch event Attribute dort definiert ?
(btw. kannst dann auch "ez_eingang" in ReadingsVal durch $name ersetzen )
wenn nein :
klar man kann ein userReading aus einem Fremd Reading bauen, aber dann klappt das natürlich so mit dem Trigger nicht
Zitat von: Wzut am 25 September 2019, 09:29:26
nur nochmal zum besseren Durchblick :
du hast das userReading jetzt direkt im Device ez_eingang ?
ja!
Hier das aktuelle Listing (so wie es funktioniert):
Internals:
CHANGED
DEF cb8262d3 10
IODev zwusb0
LASTInputDev zwusb0
MSGCNT 15242
NAME ez_eingang
NR 194
STATE off
TYPE ZWave
ZWaveSubDevice no
cmdsPending 0
homeId cb8262d3
isWakeUp
lastMsgSent 1569336028.78157
nodeIdHex 0a
zwusb0_MSGCNT 15242
zwusb0_RAWMSG 0004000a0a3202a14a0000012d0000
zwusb0_TIME 2019-09-25 11:47:30
OLDREADINGS:
READINGS:
2019-09-24 16:37:03 UNPARSED METER 0e322201440000000b011a0000000b
2019-09-23 20:13:46 configButtonOnOff Enable
2019-09-23 20:13:47 configConfigureMaximumAlarmCurrent 12
2019-07-19 19:18:53 configConfigureMaximumOverLoadCurrent 13
2019-05-27 14:21:44 configConfigurePlugTimeSwitchFunction Disable
2019-07-19 19:18:57 configConfigurePowerReport 5
2019-09-23 20:13:48 configConfigureTimeSwitchPeriod 150
2019-09-23 20:13:48 configLedDisplay Enable
2019-09-23 20:13:48 configMeterReportInterval 300
2019-09-23 20:13:48 configRememberRelayONOFFStatus Enable
2019-09-23 20:13:49 configSendMeterReport Enable
2019-09-25 11:47:30 current 0 A previous: 0 delta_time: 301 s
2019-09-25 11:47:27 energy 0.11 kWh previous: 0.11 delta_time: 301 s
2019-09-25 11:47:30 leistung 0
2019-01-13 14:03:56 model Neo CoolCam Power plug 12A
2019-01-13 14:03:56 modelConfig shenzen_neo/nas-wr01z.xml
2019-01-13 14:03:56 modelId 0258-0003-1087
2019-01-13 17:31:29 neighborList wk_kaminofen
2019-07-19 19:19:42 neighborUpdate done
2019-09-25 11:47:28 power 0 W previous: 0 delta_time: 301 s
2019-09-24 16:52:00 reportedState off
2019-09-24 16:52:00 state off
2019-09-24 16:40:29 timeToAck 0.614
2019-09-24 16:40:29 transmit OK
2019-09-25 11:47:29 voltage 233.8 V previous: 234.09 delta_time: 301 s
Attributes:
IODev zwusb0
classes ZWAVEPLUS_INFO MANUFACTURER_SPECIFIC VERSION ASSOCIATION ASSOCIATION_GRP_INFO DEVICE_RESET_LOCALLY POWERLEVEL CONFIGURATION SWITCH_BINARY SWITCH_ALL ALARM METER BASIC
devStateIcon off:20_k_steckdose0 on:20_k_steckdose1
event-on-change-reading .*
fp_zw_eisenbahnzimmer 300,200,0
room Eisenbahn
userReadings leistung { (split /\s+/,ReadingsVal("ez_eingang", "power", 0))[1] }
vclasses ALARM:8 ASSOCIATION:2 ASSOCIATION_GRP_INFO:1 BASIC:1 CONFIGURATION:1 DEVICE_RESET_LOCALLY:1 MANUFACTURER_SPECIFIC:2 METER:4 POWERLEVEL:1 SWITCH_ALL:1 SWITCH_BINARY:1 VERSION:2 ZWAVEPLUS_INFO:2