JSON -> Readings

Begonnen von dev0, 09 Februar 2017, 11:31:43

Vorheriges Thema - Nächstes Thema

jlu

Zitat von: carlos am 31 Januar 2018, 13:32:56
Hi,
addReadingsPrefix funktioniert bei mir aber nur für den ersten level.
Wenn ich so ein JSON habe:

ENERGY {"Time":"2018-01-31T13:22:52","ENERGY":{"Total":0.000,"Yesterday":0.000,"Today":0.000,"Period":0,"Power":0,"Factor":0.00,"Voltage":0,"Current":0.000}}
dann wird trotz addReadingsPrefix = 0 folgendes generiert.

Time 2018-01-31T13:27:54
ENERGY_Current 0 2018-01-31 13:22:57
ENERGY_Factor 0 2018-01-31 13:22:57
ENERGY_Period 0 2018-01-31 13:22:57
ENERGY_Power 0 2018-01-31 13:22:57
ENERGY_Today 0 2018-01-31 13:22:57
ENERGY_Total 0 2018-01-31 13:22:57
ENERGY_Voltage 0 2018-01-31 13:22:57
ENERGY_Yesterday 0 2018-01-31 13:22:57


Geht das auch anders?


Mir haben die Namen von expandJson auch nicht gefallen (u.a. weil ich einen Sensor von NodeMCU auf Tasmota umgestellt habe und die Namen der Readings beibehalten wollte).

Ich hab das ähnlich wie in https://forum.fhem.de/index.php/topic,82293.msg745190.html#msg745190 gelöst:


define WohnzimmerKlima MQTT_DEVICE
attr WohnzimmerKlima stateFormat temperatur °C/luftfeuchtigkeit %
attr WohnzimmerKlima subscribeReading_JSON { main::myUtils_tasmotaSensorParse( $hash, $name, $topic, $message ) } wohnung/wohnzimmer/klima/tele/SENSOR


und in der 99_myUtils.pm:

use JSON::XS;

sub myUtils_tasmotaSensorParse {
    my ( $hash, $name, $topic, $message ) = @_;

    my $json = decode_json( $message );
    readingsBeginUpdate( $hash );
    readingsBulkUpdate( $hash, 'temperatur', $json->{SI7021}->{Temperature} );
    readingsBulkUpdate( $hash, 'luftfeuchtigkeit', $json->{SI7021}->{Humidity} );
    readingsEndUpdate( $hash, 1 );
}


Könnte man bei mehreren unterschiedlichen Sensoren natürlich noch ergänzen.

Gear

Guten Morgen,

ich wollt enoch mal auf das Thema "expandJSON", ich verstehe das einfach nicht.
Kann sein dass ich einfach zu dumm dazu bin oder nur auf dem Schlauch stehe...

Das ist deine "Vorlage":
define <name> expandJSON <source_regex> [<target_regex>]

Das ist meine JSON: (Sen.TemperatureHumidity)
{"Time":"2018.02.24 05:43:58","AM2301":{"Temperature":20.0,"Humidity":37.6},"TempUnit":"C"}

Das würde Ich daraus machen, bzw. ich hab einfahc keine Ahnung was bei "<source_regex>" rein soll, da nichts funktioniert.....
define eJ3 expandJSON <source_regex> (Temperature|Humidity)

Es tut mir leid das ich das frage, aber ich bekomme es einfach nicht hin und was ich bis jetzt im www gefunden habe, das bringt mich nicht weiter.
Ich verstehe es einfach nicht... :(

Grüße und Danke
Gear
> ODroid H3 => OMV => Docker => FHEM <
Fritz!Box 7590, Fritz!Repeater 6000, MQTT, RaspberryMatic, Zigbee2MQTT, ESP32, ESP8266, Shelly, Grafana ...
> 3D-Druck <

dev0

Mit der source_regex definierst Du, in welchem Device und Reading sich die JSON Zeichenkette befindet, die benutzt werden soll. Da Du kein list von Deinem Device gezeigt hast, kann ich Dir das nicht genauer sagen. Die Regex ist genau so aufgebaut wie bei einem Notify.

dev0

Ich schließe diesen Thread jetzt, da er seine Schuldigkeit getan hat.

Wenn es Supportbedarf zum expandJSON Modul gibt, dann bitte einen Thread im Bereich "Unterstuetzende Dienste" öffnen.