FHEM Forum

FHEM - Hausautomations-Systeme => MQTT => Thema gestartet von: litronics am 06 Januar 2018, 18:47:34

Titel: Sonoff - subscribeReading und RegEx
Beitrag von: litronics am 06 Januar 2018, 18:47:34
Hallo Zusammen!

ich spiele gerade mit einem Sonoff Schalter an den ich einen Analogen Feutesensor angeschlossen hab. Die Tasmota FW habe ich mir so angepasst, dass der analoge Anschluss ausgewertet und in MQTT als Sensor ausgegeben wird.

Jetzt wollte ich mit subscribeReading den Sensorwert erhalten und hab da anscheinend ein Verständnisproblem mit der Commandref zum MQTT_DEVICE.

Laut Commandref kann ich ja eine Perl-expression ausführen in der ich die Message als Variable zur Verfügung habe. Daher meine Idee ich filter mir hier mit einer RegEx exakt den Wert raus, den ich haben möchte und gut ist. Jetzt hab ich schon einiges versucht - aber das will irgendwie nicht klappen.

Hier mal eine Variante, von der ich dachte, die muss funktionieren:
{my ($value) = $message=~Analog0":(\d+); return $value;} tele/sonoff-3188/SENSOR

Falls das so nicht klappt, wäre ich über jede Idee dankbar welche mein Vorhaben einem Einzeiler erledigt :)
Hier was ich vor habe:

Als Message bekomme ich folgenden String:    
{"Time":"2018-01-06T18:42:05", "Analog0":265}

Davon möchte ich im Reading lediglich den Wert des Analog0 Sensors haben.

Wäre super, wenn jemand eine Idee dazu hätte!
Titel: Antw:Sonoff - subscribeReading und RegEx
Beitrag von: litronics am 06 Januar 2018, 19:36:35
Nachdem ich die Commandref nochmal genau gelesen habe, vermute ich, dass man die Perl-Expression nur zum Validieren der Message verwenden kann und sie an dieser Stelle nicht über schreibbar ist.

Jetzt habe ich das (aus meiner Sicht etwas unschön) über das subscribeReading und ein userReading gelöst.

Das userReading sieht dann folgendermaßen aus:

Feuchte {
  my $message =ReadingsVal("Sonoff_Schalter2", "Feuchte_RAW", "0");
  my $value = $message=~/Analog0.:(\d*)/;
  return $1 ;
}


Erfüllt insofern meine Anforderung, dass ich den Wert bekomme - unschön ist es deswegen, da ich zwei Readings habe, wovon eines erst über ein Update-Event getriggert wird und damit unnötig Rechenleistung braucht. Hätte man eigentlich schön in der Perl-Expression bei dem subscribeReading erledigen können :)
Titel: Antw:Sonoff - subscribeReading und RegEx
Beitrag von: Reinerlein am 06 Januar 2018, 20:16:06
Hi litronics,

du könntest natürlich, um diesen Extra-Event-Aufruf über userReadings zu vermeiden, direkt ein setreading ausführen:

{ my $value = $message=~/Analog0.:(\d*)/; fhem("setreading $name Feuchte $value"); } tele/sonoff-3188/SENSOR
Geht das denn?

Grüße
Reinerlein
Titel: Antw:Sonoff - subscribeReading und RegEx
Beitrag von: SamNitro am 06 Januar 2018, 20:46:50
Lass dir doch automatisch alles ,,zerlegen"


https://forum.fhem.de/index.php?topic=69067.0
(https://forum.fhem.de/index.php?topic=69067.0)
Titel: Antw:Sonoff - subscribeReading und RegEx
Beitrag von: hexenmeister am 07 Januar 2018, 00:36:08
vor der return-Value der Expression hängt up, ob Message verarbeitet, oder verworfen wird.
Was Du natürlich machen kannst, die Variable $message nach Deinen Wünschen zu ändern.
Habe jetzt nicht getestet, sollte aber eigentlich funktionieren.
Titel: Antw:Sonoff - subscribeReading und RegEx
Beitrag von: litronics am 08 Januar 2018, 09:39:04
Dank hexenmeister hab ich die Lösung:

{my ($value) = $message=~/Analog0.:(\d*)/;; fhem("setreading $name Feuchte_RAW $message") ;;$message=$1;; return $1} tele/sonoff-3188/SENSOR

Wenn man $message entsprechend aktualisiert, dann wird dieser Wert in das Reading geschrieben - hätte ich auch selbst drauf kommen können :)

Ich wollte mir eigentlich zum Testen parallel noch die ursprüngliche Nachricht als "Feuchte_RAW" Reading speichern - aber diese Anweisung wird einfach geflissentlich ignoriert von FHEM - warum auch immer.
Titel: Antw:Sonoff - subscribeReading und RegEx
Beitrag von: hexenmeister am 08 Januar 2018, 23:44:05
fhem() an dieser Stelle aufzurufen ist keine so gute Idee.
was funktionieren sollte:
readingsSingleUpdate($hash,'Feuchte_RAW',$message,1);