FHEM Forum

Verschiedenes => Bastelecke => Thema gestartet von: peko3006 am 04 Dezember 2015, 10:56:45

Titel: WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 04 Dezember 2015, 10:56:45
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.


Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: papa am 04 Dezember 2015, 11:38:40
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/'
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 04 Dezember 2015, 12:07:43
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?

Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: papa am 04 Dezember 2015, 13:33:11
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 04 Dezember 2015, 13:45:44
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?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 07 Dezember 2015, 08:53:08
Kann keine dazu was sagen bzw. noch nen Tip geben?!
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: frank am 07 Dezember 2015, 11:22:00
solange sich der state nicht ändert triggert auch das userreading nicht. siehe commandref userreading.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 07 Dezember 2015, 13:20:56
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 07 Dezember 2015, 13:36:58
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 07 Dezember 2015, 13:49:38
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;;}
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: frank am 07 Dezember 2015, 13:52:25
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
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 07 Dezember 2015, 13:55:38
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 07 Dezember 2015, 14:14:39
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;;}
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: frank am 07 Dezember 2015, 14:55:21
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 07 Dezember 2015, 15:24:27
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

Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: stromer-12 am 07 Dezember 2015, 18:11:36
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;}
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 08 Dezember 2015, 10:54:02
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?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 08 Dezember 2015, 11:04:33
Teste es doch mal selbst mit einem dummy Device. Du bist noch ein list vom Device WattmeterBernd schuldig. Oder habe ich das übersehen?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 08 Dezember 2015, 14:38:20
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?



Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: frank am 08 Dezember 2015, 16:58:37
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?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 08 Dezember 2015, 17:29:51

Zitat von: peko3006 am 08 Dezember 2015, 14:38:20
Was meinst du mit List.
Siehe command reference.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag 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.

@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.


Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 09 Dezember 2015, 08:54:18
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 09 Dezember 2015, 09:22:52
siehe Anhang.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 09 Dezember 2015, 09:50:59
Ein list vom device war gefragt: list [devspec]
list WattmeterBernd
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 09 Dezember 2015, 10:48:56
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;}
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 09 Dezember 2015, 11:16:49
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?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 09 Dezember 2015, 11:28:58
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 09 Dezember 2015, 11:49:57
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?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 09 Dezember 2015, 12:51:31
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?
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: frank am 09 Dezember 2015, 13:28:40
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 09 Dezember 2015, 13:40:29
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: viegener am 09 Dezember 2015, 13:43:54
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...

Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: dev0 am 09 Dezember 2015, 13:45:10
Zitat von: viegener am 09 Dezember 2015, 13:43:54
Damit werden die userReadings nicht getriggert...
Tippe ich auch drauf.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: viegener am 09 Dezember 2015, 13:52:48
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...

Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 09 Dezember 2015, 15:22:49
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.
Titel: Antw:WBS Sensor - Daten zerlegen
Beitrag von: peko3006 am 21 Juni 2016, 15:22:05
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