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
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
Alternativ regex capture groups: https://perldoc.perl.org/perlre.html#Capture-groups
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));
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?
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
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.
Mit dem x wollte ich den HASH in ein dec umwandeln, was auch geht, aber nicht richtig zerlegt wird.
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.
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.
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.
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
Hab's erst mal aufgegeben.
Werd's die kommenden Tage nochmals versuchen.
Danke Euch
Gesendet von meinem SM-G930F mit Tapatalk
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
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!
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. ::)