CGI_RAWMSG von CUL_WS nach Readings zerlegen

Begonnen von peko3006, 30 September 2015, 09:47:37

Vorheriges Thema - Nächstes Thema

peko3006

Hallo Leute ich tüfftel nun schon eine Weile mit FHEM und slebstgebauten Sensoren herum. Anfangs nur mit Jeenodes und mittlerweile auch mit dem tollen ESP8266.
Und genau damit hab ich so meine Probleme. Es geht um das zerlegen des Readings nach Temperatur Luftfeuchte Spannung etc. ähnlich der Jeenodes.

Meine Definiton in fhem.cfg:
define esp8266Kuehlschrank CUL_WS 1
define FileLog_esp8266Kuehlschrank FileLog ./log/esp8266Kuehlschrank-%Y.log esp8266Kuehlschrank


Einlaufende Readings:
state   ->  T:6.57 Vcc:3.20 Uptime:00:21:04

Ich hätte nun gern diese Werte ähnlich den Jeenodes zerlegt nach Temperatur Spannung etc.
Wo und wie muss ich das machen?
Bei den Jeenodes  musste die entsprechend PM Datei mit den Definitionen für die Werte versehen werden.
Nur hier weiß ich nicht wo ich ansetzen muss.

Danke und Gruß
Peter

PeMue

Hallo Namenskollege,

mach doch ein userreading und hole Dir den state mit getReading und zerlege (Beispiel aus meiner 00_myUtils.pm), wobei in $result der Inhalt von State drinsteht:
my @val = split("-",$result);
my $fb_type = $val[0]." Annex ".$val[1]." Revision ".$val[8]." ".$val[9];


Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

peko3006

Hi. Das ging ja schnell. Danke erstmal für den Tip, aber ich glaube bei der Umsetzung brauche ich noch etwas Hilfe.
Kannst du mir anhand meines Beispiels erklären wie das UserReading in der fhem.cfg aussehen muss.
Und was in welchem PM File stehe muss.

Ich stehe mit dem Syntax in FHEM manchmal auf Kriegsfuss.

PeMue

Hier eine Lösung von mir:
attr HM_Bad_HKT userReadings battery { my $batlimitstr = ReadingsVal($name,"R-lowBatLimitRT",0);; my @batlimit = split(/ /, $batlimitstr);; my $batstate = (ReadingsVal($name, "batteryLevel",0) >= $batlimit[0]) ? "ok" : "low";; return $batstate;; }
Kurz auf Dich umgebaut (ohne Garantie):
attr esp8266Kuehlschrank userReadings temperature { my $val = ReadingsVal($name,"state",0);; my @val = split(/ /, $val);; my $temperature = $val[0];; return $temperature;; }
Ggf. noch das T: wegfiltern, wenn Du nur die Zahl willst ...

Der Rest sollte analog gehen.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

peko3006

Danke so geht es erstmal. Leider komme ich beim rausfiltern des "T:" auch nicht so zurecht. Kannst du dir nochmal meinen Code anschauen.

#state -> T:15.00 Vcc:2.51 Uptime:00:00:07
attr esp8266tempSandra userReadings temperature { \
my $val = ReadingsVal($name,"state",0);; \
my @val = split(/ /, $val);; \
my @erg = split(/:/, $val[0]);; \
my $temperature = $erg[1];; return $temperature;; }


Das ganze soll dann noch sauber in die SQL DB fließen, nur leider stimmt dort die Zuordnung im moment auch noch nicht.
In der Spalte Reading steht "state" und in Value steht "temperature:"
Kannst du mir da auch weiter helfen?

PeMue

Hallo,

ich bin mir nicht sicher, ob man den Doppelpunkt maskieren muß, siehe
http://www.perlunity.de/perl/forum/thread_013588.shtml

Probiers einfach mal aus.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

peko3006

Hallo Peter,
danke das funktioniert jetzt so super. Es wird auch sauber in die Datenbank eingetragen, wie ich es wollte.

Eine Frage hab ich dennoch. Wie komme ich an weitere Readings aus der URL ran, hier zB die Spannung(Vcc)
Eine komplett neue Zeile mit einem anderen Reading funktioniert leider nicht.
Kann ich nach userReadings auch eine Liste angeben?

PeMue

siehe commandref, suche nach userReadings:
userReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:

    <reading>[:<trigger>] [<modifier>] { <perl code> }

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).
Beispiele:

    attr myEnergyMeter userReadings energy { ReadingsVal("myEnergyMeter","counters.A",0)/1250.0;; }
    attr myMultiMeter userReadings energy1:counters.A {ReadingsVal("myMultiMeter","counters.A",0)/1250.0}, energy2:counters.B {ReadingsVal("myMultiMeter","counters.B",0)/1250.0}

<modifier> kann die folgenden Werte haben:

    none: als ob man es gar nicht spezifiziert hätte.
    difference: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert gesetzt.
    differential: das Reading wird auf die Differenz zw. dem aktuellen und dem vorherigen Wert, geteilt durch die Sekunden zw. der aktuellen Zeit und der letzten Auswertung, sekundengenau. Kein Wert wird berechnet, falls der Unterschied unter eine Sekunde liegt.
    integral: das Gegenteil von differential. Das Ergebnis wird um das Produkt aus der Zeit-Differenz und der Durschnittswert der letzten zwei Readings erhöht.
    result += (time - timeold) * (oldval + value) / 2
    offset: wenn der aktuellen Wert kleiner als der vorherige Wert ist wird der vorherige Wert zum Reading addiert. Das Reading kann dann als offset verwendet werden um einen Zähler der durch Sromverlust zurückgesetzt wird zu korrigieren.
    monotonic: wenn die Differenz zw. dem aktuellen und dem vorherigen Wert positiv ist wird diese Differenz zum Reading addiert. Damit lässt sich von einem Zähler der bei Stromverlust zurückgesetzt wird ein monoton wachsender Zähler ableiten.

Beispiel:

    attr myPowerMeter userReadings power differential { ReadingsVal("myPowerMeter","counters.A",0)/1250.0}

Achtung:

    Falls difference oder differential spezifiziert ist, dann werden für die Berechnung ältere Werte benötigt, d.h. der Wert wird frühestens beim zweiten Änderung gesetzt.
    der Name der definierten Readings besteht aus alphanumerischen Zeichen, Unterstrich (_) und Minus-Zeichen (-).


Einfach nächsten Ausdruck mit Komma getrennt anhängen.

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

peko3006

Funktioniert perfekt. Danke  ;)

Kann ich den Eintrag "state", der die den kompletten Datenstring enthält, noch irgendwo unterdrücken?