Hallo Leute so wie es aussieht scheitere ich mal wieder am Perl Syntax für das Zerlegen der Sensordaten eines WBS Nodes.
Gemacht habe ich folgendes:
fhem.cfg:
define WattmeterBernd WBS state 12
Sensor Url Aufruf
http://<meine IP>:8083/fhem/rawmsg?WBS:12:watt;1100|kwh;0.03|zstand;1000.32
Im FHEM kommt dann unter State folgendes an
S: watt;1100|kwh;0.03|zstand;1000.32 | 2015-12-04 10:41:28
Das ganze behandle ich dann so:
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; my @val = split(/\:/, $val);; my @erg = split(/\|/, $val[1]);; my $watt = $erg[1];; return $watt;; }
Aber egal was ich mache, welche Trennzeichen ich verwende er zerlegt mir den String nicht in die Werte.
Steht im UserReading eigentlich auch das drin was ich annehme?
Ich hänge mal noch einen Screenshot an zum besseren Verständnis.
Nimm doch einfach nen Ersetzen mit RegEx.
my $val = ReadingsVal($name,"state",0);
$val =~ s/.*watt;(\d+).*/$1/;
return $val;
RegEx testen sich am besten in der Commandzeile - z.B. so
echo "S: watt;1100|kwh;0.03|zstand;1000.32 | 2015-12-04 10:41:28" | perl -pe 's/.*watt;(\d+).*/$1/'
Ok mit RegEx geht es natürlich viel besser das stimmt. Das ich da nicht drauf gekommen bin.
Auf der Kommandozeile klappt es ja auch aber in der FHEM.conf geht es so nicht.
Folgendes habe ich eingetragen:
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt;(\d+).*/$1/; return $val;;}
Der Befehl wird aber irgendwie abgeschnitten (siehe Screenshot)
Sicher ein syntaktischer Fehler!?
Wie kann ich herausbekommen was wirklich in State steht?
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt;;(\d+).*/$1/;; return $val;;}
In der Config müssen alle Semikolon dopplet geschrieben werden. Am besten nie direkt in der Config arbeiten, sondern die Editoren im Webfrontend benutzen.
Ok die Formel wird erstmal direkt übernommen. Aber zerlegt wird der String trotzdem nicht.
Bei CUL_WS Snesoren klapt das so wunderbar.
Kann es sein das im State was anderes steht?
Kann keine dazu was sagen bzw. noch nen Tip geben?!
solange sich der state nicht ändert triggert auch das userreading nicht. siehe commandref userreading.
Naja das ändert sich schon jedes mal. Nur leider kann ich mit dem Aufruf
watt { my $val = ReadingsVal($name,"state",0); $val =~ s/.*watt;(\d+).*/$1/; return $val;}
Den state nicht zerlegen, noch sonst irgendwie verarbeiten. Deshalb meine Vermnutung das in state gar nicht das drinnen steht was anzeigt wird.
Zitat von: peko3006 am 07 Dezember 2015, 13:20:56
Deshalb meine Vermnutung das in state gar nicht das drinnen steht was anzeigt wird.
Kann eigentlich nicht sein, aber lass Dir das doch anzeigen:
{ReadingsVal("WattmeterBernd","state",0)}
In die FHEM Befehlszeile eingeben.
Und zeig doch mal ein list vom Device.
Ok das kommt folgendes Ergebnis:
watt;989|kwh;0.03|zstand;1000.32
Das wäre ja ok so. Nur warum zerlegt er mir dann die Werte nicht entsprechend in die Variablen.
Manuell geht es ja mit folgendem Aufruf.
echo "watt;1100|kwh;0.03|zstand;1000.32 | 2015-12-04 10:41:28" | perl -pe 's/.*watt;(\d+).*/$1/'
Nur in der Konfig so nicht:
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt;(\d+).*/$1/; return $val;;}
da kein watt reading zu sehen war, hatte ich die vermutung, dass state noch nicht getriggert hatte.
was sagt denn fhem.log? wahrscheinlich noch ein syntax fehler. beim editieren in der fhem.cfg müssen die semicolon verdoppelt werden.
vor dem return ist noch ein einzelnes semicolon
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt;(\d+).*/$1/; return $val;;}
Vor dem return ist das ; nicht verdoppelt. Die anderen schon.
Im Log ist nichts aufälliges zu finden.
In der Konfig hab ich folgendes geschrieben:
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt;;(\d+).*/$1/;; return $val;;}
ich könnte mir vorstellen, dass das semikolon in der regex nach dem watt probleme macht.
lösche dort mal beide semicolon und nimm dafür nur einen punkt.
Ohne Ergebnis leider. Ich fasse nochmal zusammen. Vielleicht kann es mal jemand nachbauen.
Definition in FHEM.cfg
define WattmeterBernd WBS state 12
define FileLog_WattmeterBernd FileLog ./log/WattmeterBernd-%Y.log WattmeterBernd
attr FileLog_WattmeterBernd logtype text
attr WattmeterBernd userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt,(\d+).*/$1/;; return $val;;}
Hier der aufruf im Browser:
http://<IP FHEM Server>/fhem/rawmsg?WBS:12:watt,989|kwh,0.03|zstand;1000.32
Folgendes kommt dann unter State in FHEM an
-> watt,989|kwh,0.03|zstand;1000.32
Bei mir funktioniert mit einen Dummy das userReadings. Es wird watt mit entsprechenden Wert angelegt.
Im STATE steht natürlich der Wert aus dem reading state.
aus der fhem.cfg:
attr myTest userReadings watt { my $val = ReadingsVal($name,"state",0);; $val =~ s/.*watt;;(\d+).*/$1/;; return $val;;}
aus dem Attribut im Webinterface:
watt { my $val = ReadingsVal($name,"state",0); $val =~ s/.*watt;(\d+).*/$1/; return $val;}
Bei mir will das ganze leider nicht. Das UserReading wird einfach nicht zerlegt.
Im Log ist dazu auch nichts zu finden.
Kann es an der 18_WBS.pm Datei liegen. Die habe ich leicht angepasst um mehr als 8 Zeichne übertragen zu können.
Aber die Daten stehe ja eigentlich auch sauber im UserReading, werden nur nicht zerlegt und sperat gespeichert.
Hat noch jemand eine Idee?
Teste es doch mal selbst mit einem dummy Device. Du bist noch ein list vom Device WattmeterBernd schuldig. Oder habe ich das übersehen?
Was meinst du mit List. Also ich habe folgendes Device in der fhem.cfg angelegt:
define myTest WBS gas 12
attr myTest userReadings watt { my $val = ReadingsVal($name,"gas",0);; $val =~ s/.*watt;;(\d+).*/$1/;; return $val;;}
Dann benutze ich folgenden Aufruf um die Werte zu übertragen:
http://<IP FHEM>:8083/fhem/rawmsg?WBS:12:watt;4433|kwh;0.03|zstand;1000.32
Wenn ich nun {ReadingsVal("myTest","gas",0)}
in FHEM eingebe erhalte ich
watt;4433|kwh;0.03|zstand;1000.32
Was ja so auch richtig ist.
Und wenn ich nun in FHEM auf den Sensor gehe sehe ich das. (siehe Screenshot)
Das UserReading wird also augenscheinlich nicht behandelt. Im Log ist auch nichts zu finden.
Ich denke ich habe alles richtig gemacht oder?
du hast userreadings auch noch nicht verstanden.
es verändert nicht dein gas reading, sondern es sollte ein neues reading watt erzeugen, mit entsprechendem inhalt.
du kennst commandref?
Bevor ich das List Poste muss ich erstmal aufräumen ;)
Dort steht aber nichts drin was zielführend wäre denke ich. Der Sensor an sich läft ja.
@Frank - na ich denke schon das ich das verstanden habe.
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).
Das Gerätereading heisst also "gas" bei mir. Wird dieses aktualisiert kann ich mit Hilfe von userReadings einen Wert extrahieren oder manipulieren.
Und genau das klappt eben nicht bei mir.
Zitat von: peko3006 am 09 Dezember 2015, 08:29:22
Bevor ich das List Poste muss ich erstmal aufräumen ;)
Dort steht aber nichts drin was zielführend wäre denke ich. Der Sensor an sich läft ja.
Da hast Du bestimmt recht. Entschuldige bitte, dass ich nach so sinnlosen Details gefragt habe.
siehe Anhang.
Ein list vom device war gefragt: list [devspec]
list WattmeterBernd
Ok das macht natürlich mehr Sinn. Der Node heißt jetzt myTest.
Hier das List:
Internals:
CGI_RAWMSG_MSGCNT 1
CGI_RAWMSG_RAWMSG WBS:12:watt;1200|kwh;0.03|zstand;1000.32
CGI_RAWMSG_TIME 2015-12-09 10:47:33
CODE 12
DEF gas 12
LASTInputDev CGI_RAWMSG
MSGCNT 1
NAME myTest
NR 346
STATE G: watt;1200|kwh;0.03|zstand;1000.32 | 2015-12-09 10:47:33
TYPE WBS
WBS_TYPE gas
CHANGETIME:
Helper:
Dblog:
State:
Mydblog:
TIME 1449654453.76318
VALUE gas:watt;1200|kwh;0.03|zstand;1000.32
Readings:
2015-12-09 10:47:33 gas watt;1200|kwh;0.03|zstand;1000.32
Attributes:
userReadings watt { my $val = ReadingsVal($name,"gas",0); $val =~ s/.*watt;(\d+).*/$1/; return $val;}
Was ist WBS für ein Device? Weder in der command ref noch unter ./FHEM finde ich das Modul.
Hast Du das userReadings Attribut in die fhem.cfg geschrieben oder über die GUI angelegt?
Das Modul habe ich von hier https://github.com/mhop/fhem-mirror/blob/master/fhem/contrib/WBS/18_WBS.pm
Das Attribut habe ich direkt in der fhem.cfg angelegt.
Zitat von: peko3006 am 09 Dezember 2015, 11:28:58
Das Attribut habe ich direkt in der fhem.cfg angelegt.
Und danach auch jeweils ein rereadcfg oder shutdown restart ausgeführt?
Ich mache nach Änderungen immer
sudo service fhem stop|start
Einzigstes was ich im PM File geändert habe, ist die Beschränkung auf 8 Zeichen heraus genommen habe,
da dort im Original nur scheinbar nur ein Sensorwert transportiert werden sollte.
Da aber im userReading alles ankommt sollte das unerheblich sein oder?
ZitatDa aber im userReading alles ankommt sollte das unerheblich sein oder?
du hast es immer noch nicht ganz verstanden, denn bei dir gibt es dein definiertes userreading
watt immer noch nicht.
du hast nur ein reading
gas, dass dein modul erzeugt. der inhalt wird nie zerlegt werden.
eventuell unterstützt das wbs modul keine userreadings.
Zitat von: peko3006 am 09 Dezember 2015, 12:51:31
Da aber im userReading alles ankommt sollte das unerheblich sein oder?
Was kommt alles im userReading an?
Zitat von: frank am 09 Dezember 2015, 13:28:40
eventuell unterstützt das wbs modul keine userreadings.
Die Vermutung hatte ich auch, aber zumindest mit einem setreading funktioniert es in meiner Testumgebung.
Edit:@peko3006: teste mal mit setreading den Wert in gas oder state zu ändern, den du im userReading verarbeitest.
Das Problem könnte sein, dass das verwendete Modul nicht die offiziellen Funktionen zum ReadingsUpdate verwendet, sondern direkt die Readings im hash setzt. Damit werden die userReadings nicht getriggert...
Zitat von: viegener am 09 Dezember 2015, 13:43:54
Damit werden die userReadings nicht getriggert...
Tippe ich auch drauf.
Ich habe mal als quick hack das 18_WBS.pm umgestellt, sodass ReadingsSingleUpdate verwendet wird. Das findet sich anbei.
Da ich das jetzt nicht testen konnte, auf eigene Gefahr! Wenn jemand testen will, runterladen 18_WBS.pm im FHEM-Directory umbennen (...sav oder so) angehängte Datei ins FHEM-Verzeichnis und FHEM neu starten. Dann mal abwarten...
Super. Es klappt. Da muss man erstmal drauf kommen.
Das das noch kein Anderer moniert hat wundert mich.
Wie bekommt ihr denn eure WLAN/LAN Nodes Daten ins FHEM?
Vielleicht bietet sich da ja auch noch etwas anderes an.
Hallo Leute ich muss das Thema noch einmal aufgreifen. Ich habe jetzt ein Tablet im Korridor postioniert was mittels Bewegunsgmelder aktiviert wird (Strom an/aus -> Display aktiv) und Daten aus dem FHEM und paar Bilder aus einem Fotoordner anzeigt. Funktioniert soweit auch ganz hervorragend.
Nun zum Problem. Um den Ladezustand zu monitoren lasse ich mit per Automate bei Display ON per URL Aufruf diesen übertragen.
Die definition sieht so aus.
define PIRMotion WBS motion 99
attr PIRMotion userReadings motion { my $val = ReadingsVal($name,"motion",0);; $val =~ s/.*M;;(\d+).*/$1/;; return $val;;}, \
battlevel { my $val = ReadingsVal($name,"motion",0);; $val =~ s/.*batt;;(\d+).*/$1/;; return $val;;}
und in FHEm kommt beim Aufruf von
{ReadingsVal("PIRMotion","motion",0)}
folgendes an
M;0|batt;46
Leider werden die Werte nicht den Varibalen battlevel und Motion zueordnet.
Sieht jemand den Fehler?
Wenn ich es in der Konsole ausführe geht es
echo "M;0|batt;62" | perl -pe 's/.*batt;(\d+).*/$1/'
ergibt : 62