Werte eines Readings zerlegen

Begonnen von heinzfo, 03 August 2017, 13:51:52

Vorheriges Thema - Nächstes Thema

heinzfo

Hallo

Ist es möglich Werte eines Readings zu zerlegen bzw. wie macht man das?
Evtl. kann man die Werte dann in einen dummy schreiben oder sich zusenden lassen.
Ich möchte z.B. Avg: und den Wert separieren : Avg: 48.08


download 48.44
ping 21.323
statDownloadDay           Min: 46.65 Avg: 48.08 Max: 48.57 (since: 2017-08-03_10:59:07 )
statDownloadHour     Min: 48.44 Avg: 48.54 Max: 48.54
statDownloadHourLast    Min: 46.65 Avg: 47.41 Max: 48.54
statDownloadMonth     Min: 46.65 Avg: 48.08 Max: 48.57 (since: 2017-08-03_10:59:07 )
statDownloadYear     Min: 46.65 Avg: 48.08 Max: 48.57 (since: 2017-08-03_10:59:07 )
state ok
upload 9.59


Danke für Eure Hilfe!

Grüße
Heinz

Otto123

Hallo Heinz,

ja, z.B. so {(split " ", (ReadingsVal("<Devicenname>","statDownloadDay","")))[3]} Sollte Dir 48.08 liefern.

split erzeugt ein Array bei 0 beginnend. Trenner in dem Fall " "

Es ein wenig statisch und ohne Komfort, also nur vom Prinzip. Vielleicht findest Du besseres...

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

dev0


rabehd

sicher nicht die beste Lösung, so habe ich mal angefangen.

$tempa = ReadingsVal("Wetterstation", "statTemperatureDay", "--");
my $pos = rindex($tempa, "Max:");
fhem("set TemperaturHeuteMax " .substr($tempa,$pos +5,4));
fhem("set TemperaturHeuteMin " .substr($tempa,5,4));
Auch funktionierende Lösungen kann man hinterfragen.

heinzfo

#4
Hallo Otto123

Leider kommt das hier zurück: HASH(0x55a5660)
{(split" ",(ReadingsVal("MySpeedtest","statDownloadDay","")))[3]}

Damit kommen diese Werte zurück, Min: 46.65 Avg: 48.21 Max: 48.69 (since: 2017-08-03_10:59:07 ) wie erwartet.
ReadingsVal("MySpeedtest","statDownloadDay","")


Was kann das sein?


heinzfo

Hallo Otto123

Mit einem x{split...
steht der richtige Wert im Logfile aber auch eine Fehlermeldung die mir nichts sagt, kannst Du helfen?

WhatsappHeinz return value: Can't locate object method "x" via package "48.04" (perhaps you forgot to load "48.04"?) at ./FHEM/99_WhatsAppUtils.pm line 356

nils_

wie kommst du auf das "x" ??

anscheinend zerlegt er aber richtig.
Zitatperhaps you forgot to load "48.04"
48.04 ist ja aus einem deiner readings??


du hast da irgendwo noch einen anderen fehler drin.

{(split" ",(ReadingsVal("MySpeedtest","statDownloadDay","")))[3]}
zwischen split und den " " muss auch ein leerzeichen.

viele Wege in FHEM es gibt!

heinzfo

Mit dem x wollte ich den HASH in ein dec umwandeln, was auch geht, aber nicht richtig zerlegt wird.

heinzfo

Das ist die kpl, Meldung im LogFile

2017.08.03 15:32:14 1: ERROR evaluating my $EVTPART0='message:';my $EVENT='message: Sp';my $SELF='WhatsappHeinz';my $NAME='HeinzMobil';my $EVTPART1='Sp';my $TYPE='yowsup';{WhatsappAnswer($NAME,$EVENT)}: Can't locate object method "x" via package "47.99" (perhaps you forgot to load "47.99"?) at ./FHEM/99_WhatsAppUtils.pm line 356.

2017.08.03 15:32:14 3: WhatsappHeinz return value: Can't locate object method "x" via package "47.99" (perhaps you forgot to load "47.99"?) at ./FHEM/99_WhatsAppUtils.pm line 356.

CoolTux

Als was genau trägst Du denn Deinen Code ein?
userReadings?


{ my @a = split ' ',ReadingsVal($name,'fs_root',0);$a[6] }


Fallbeispiel bitte an Deine Gegebenheiten anpassen.
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

heinzfo

Das ist der kpl. code, macht aber schon bei speicher probleme.
Das Reading kommt vom statistics module.


### Speedtest
elsif( $EVENT eq 'message: Sp' )
{ my $Speedtest =
"\xF0\x9F\x8F\x84 *Speedtest*\xF0\x9F\x8F\x84 ###" ."###"
.{ my @a = split ' ',ReadingsVal('MySpeedtest','statDownloadDay',0);$a[6] }
# .x{(split " ",(ReadingsVal("MySpeedtest","statDownloadDay","")))->[3]} ."###"
.ReadingsVal("MySpeedtest","statDownloadDay","") ."###"
."Download: " .ReadingsVal("MySpeedtest","download","") ." Mbit/s###"
."Upload: " .ReadingsVal("MySpeedtest","upload","") ." Mbit/s###"
."Ping: " .ReadingsVal("MySpeedtest","ping","") ." ms###"
.ReadingsTimestamp("MySpeedtest","download","");
fhem "set $NAME send $Speedtest"}


beim speichern

syntax error at ./FHEM/99_WhatsAppUtils.pm line 356, near ";$a" Global symbol "@a" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 356. Global symbol "$Speedtest" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 363. syntax error at ./FHEM/99_WhatsAppUtils.pm line 366, near "elsif" Global symbol "$EVENT" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 366. syntax error at ./FHEM/99_WhatsAppUtils.pm line 376, near ""set $NAME send $FB"}" Global symbol "$EVENT" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 379. syntax error at ./FHEM/99_WhatsAppUtils.pm line 382, near ""set $NAME send $IP"}" Global symbol "$EVENT" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 385. Global symbol "$EVENT" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 388. Global symbol "$EVENT" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 391. Global symbol "$EVENT" requires explicit package name at ./FHEM/99_WhatsAppUtils.pm line 394. syntax error at ./FHEM/99_WhatsAppUtils.pm line 409, near ""set $NAME send $RPI"}" ./FHEM/99_WhatsAppUtils.pm has too many errors.


Otto123

Zitat von: nils_ am 03 August 2017, 15:26:38
zwischen split und den " " muss auch ein leerzeichen.
Ist bei mir egal funktioniert trotzdem.
Teste das doch alles erstmal in der Kommandozeile.
im übrigen wäre {(split" ",(ReadingsVal("MySpeedtest","statDownloadDay","")))[3]} und { my @a = split ' ',ReadingsVal('MySpeedtest','statDownloadDay',0);;$a[6] }wahrscheinlich in etwa das Gleiche wenn 3 = 6 wäre .

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

heinzfo

Hab's erst mal aufgegeben.
Werd's die kommenden Tage nochmals versuchen.

Danke Euch

Gesendet von meinem SM-G930F mit Tapatalk


skyifx

#13
Hallo

Ich würde es vlt. so probieren...
define <Devicename>_Notify notify <Devicename>:statDownloadDay:.* {\
my @a = split(' ', ReadingsVal('<Devicename>', 'statDownloadDay', ''));;\
if (scalar(@a) gt 3) {\
my $avg = $a[3];;\
...und hier dann was Du mit $avg machen willst
}\
}

...habe es aber jetzt nicht getestet.

Abgesehen davon, kannst Du innerhalb dieser Funktionen nichts auskommentieren "#"... diese Zeilen musst Du entfernen, sonst kommen Fehlermeldungen!!

Gruß, Sky

Benni

Zitat von: skyifx am 08 August 2017, 12:05:17
Ich würde es vlt. so probieren...

Das ist aber auch nichts anderes, als das was Otto ganz oben schon vorgeschlagen hat. Nur eben noch in ein notify verpackt.

Zitat von: skyifx am 08 August 2017, 12:05:17
Abgesehen davon, kannst Du innerhalb dieser Funktionen nichts auskommentieren

Doch! Mit einer Doppelung (##) sollte das eigentlich gehen!

skyifx

Naja... ein ganz klein bissl anders ist es schon...
1. ist das "split" in eine Klammer verpackt, um es einfach sauberer abzutrennen  ;)
2. wird im Anschluss überprüft, ob das Array die nötige Anzahl von Key's enthält, denn man muss auch davon aus gehen, das mal keine Werte drin sind

Das Notify in dieser Form nur deshalb, um gezielt bzw. NUR auf diesen (statDownloadDay) einen Wert zu reagieren.

Mit unter sind es die Feinheiten, oder WIE man den Code schreibt, um es besser zu verstehen oder später leichter wieder rein zu finden. Sicher lässt sich aller Code kürzer fassen oder alles auf eine Zeile schreiben, aber man verliert schneller die Übersicht bzw. das Verständnis dafür... gerade wenn man noch am Anfang steht.  ::)