FHEM Forum

FHEM => Automatisierung => Thema gestartet von: heinzfo am 03 August 2017, 13:51:52

Titel: Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 13:51:52
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
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: Otto123 am 03 August 2017, 14:27:29
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
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: dev0 am 03 August 2017, 14:35:03
Alternativ regex capture groups: https://perldoc.perl.org/perlre.html#Capture-groups
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: rabehd am 03 August 2017, 14:54:22
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));
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 14:58:58
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?

Titel: Antw:Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 15:19:45
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
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: nils_ am 03 August 2017, 15:26:38
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.

Titel: Antw:Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 15:30:28
Mit dem x wollte ich den HASH in ein dec umwandeln, was auch geht, aber nicht richtig zerlegt wird.
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 15:33:51
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.
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: CoolTux am 03 August 2017, 15:43:57
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.
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 15:57:52
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.

Titel: Antw:Werte eines Readings zerlegen
Beitrag von: Otto123 am 03 August 2017, 17:10:25
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
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: heinzfo am 03 August 2017, 17:37:17
Hab's erst mal aufgegeben.
Werd's die kommenden Tage nochmals versuchen.

Danke Euch

Gesendet von meinem SM-G930F mit Tapatalk

Titel: Antw:Werte eines Readings zerlegen
Beitrag von: skyifx am 08 August 2017, 12:05:17
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
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: Benni am 08 August 2017, 12:17:42
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!
Titel: Antw:Werte eines Readings zerlegen
Beitrag von: skyifx am 08 August 2017, 12:41:07
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.  ::)