Sonoff - subscribeReading und RegEx

Begonnen von litronics, 06 Januar 2018, 18:47:34

Vorheriges Thema - Nächstes Thema

litronics

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!

litronics

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

Reinerlein

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

SamNitro

(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

hexenmeister

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.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

litronics

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.

hexenmeister

fhem() an dieser Stelle aufzurufen ist keine so gute Idee.
was funktionieren sollte:
readingsSingleUpdate($hash,'Feuchte_RAW',$message,1);
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy