stateFormat - wie kann ich die Fkt "split" von perl nutzen?

Begonnen von ujaudio, 23 September 2019, 16:11:11

Vorheriges Thema - Nächstes Thema

ujaudio

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.


Einen lieben Gruß
Jürgen

CoolTux

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] }
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

ujaudio

#2
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] }
Einen lieben Gruß
Jürgen

ujaudio

#3
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
Einen lieben Gruß
Jürgen

CoolTux

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] }
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

ujaudio

#5
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?
Einen lieben Gruß
Jürgen

Wzut

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.*
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

ujaudio

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
Einen lieben Gruß
Jürgen

ujaudio

#8
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...
Einen lieben Gruß
Jürgen

JoWiemann

#9
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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Wzut

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.*
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

JoWiemann

Hast recht. Gedächtnisschwund im Alter.

Grüße Jörg


Gesendet von iPhone mit Tapatalk
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

ujaudio

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.
Einen lieben Gruß
Jürgen

Wzut

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
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

ujaudio

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


Einen lieben Gruß
Jürgen