JSON -> Readings

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

Vorheriges Thema - Nächstes Thema

dev0

Kannst Du deinen Beitrag zB. mit code tags so formatieren, dass es für mich lesbarer wird?

Mickbaer

Hallo, Dev0
Zitat von: dev0 am 11 Februar 2017, 19:50:07
Kannst Du deinen Beitrag zB. mit code tags so formatieren, dass es für mich lesbarer wird?
Ich vesuch es mal.
hier ein Ausschnitt meiner Logdatei, in die FHEM die EVENTS vom SONOFFPOW schreibt,
um sie dann als Plot anzeigen zu können.
Diese beiden Zeilen sind das original.(kommt so aus Tasmota -> MQTT Broker auf PI -> FHEM)
2017-02-11_17:17:01 sonoffpow1842 transmission-state: incoming publish received
2017-02-11_17:17:01 sonoffpow1842 SENSOR: {"Time":"2017-02-11T17:17:00", "DS18B20":{"Temperature":"16.0"}}


Diese beiden Zeilen sind die vom J2R.pm erzeugt.
2017-02-11_17:17:01 sonoffpow1842 DS18B20_Temperature: 16.0
2017-02-11_17:17:01 sonoffpow1842 Time: 2017-02-11T17:17:00

Also alles gut, so soll es aussehen.

(Ich denke Du wunderst Dich, warum der SONOFFPOW hier die Temperatur vom DS18B20 anzeigt?) 8)
Ich habe an den GPIO4 des SONOOFPOW einen DS18B20 drangehängt und über die online Menüs eingeschaltet.
und siehe da, Tasmota sendet fleißig die oben als original bezeichten Zeilen.(auch alles so wie es sein soll.)

Damit erfüllt
Zitat von: dev0 am 11 Februar 2017, 16:21:12
@Mickbaer,octek0815: Testet mal bitte die angehängte Version. Wenn das Problem damit beseitigt ist, dann werde ich das noch ordentlich einbauen. Zum Testen sollte es reichen, wenn meine Vermutung richtig ist.

Ins Modul Verzeichnis kopieren und 'reload 99_j2r' tippern oder FHEM neu starten.
deine neue Version alles zur vollsten Zufriedenheit.

Ich war auch schon recht weit auf der Spur, die Du, etwas schneller als Ich,
ja nun schon umgesetzt hast.
Hier ein Auszug aus dem Internet, wo beschrieben wird was zu tun ist,
wie du es ja nun auch getan hast,
wenn aus einem NOTIFY heraus, readings erzeugt werden und kein LOG-EVENT ausgelöst wird.
------------------------------------------------------------------------------
setreading <devspec> <reading> <value>
Set the reading <reading> for the device <name> to <value> without sending out commands to the device, but triggering events and eventMap/stateFormat transformations as usual. See the set command documentation for replacement description.

Examples:
setreading lamp state on
Note: setreading won't generate an event for device X,
if it is called from a notify for device X.

Use in this case.
sleep 0.1;
setreading X Y Z


------------------------------------------------------------------------------
Du warst nur schneller mit der Umsetzung als Ich. 8)
Danke für die tolle Unterstützung. 8) 8)

Jetzt kann ich alle meine Sonoff / Sonoffpow auf das Json Format umstellen.

Eine frage bleibt noch:
Ich bekomme in den FEHM Log ( /opt/fhem/log/fhem-2017-02.log)
immer diese Meldung:
2017.02.11 17:15:03 2: MQTT_DEVICE sonoffpow1842: WARNING: deformed JSON data, check your config.
Bei allen von Tasmota gesendeten MQTT Strings im JSON Format.

Bei deinem J2r.pm wurde jetzt ein Bezug zum Code angezeigt.
2017.02.11 17:15:03 2: MQTT_DEVICE sonoffpow1842: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "incoming publish rec...") at ./FHEM/99_j2r.pm line 51.

2017.02.11 17:15:03 3: no_sonoffpow1842 return value: deformed or no JSON
2017.02.11 17:15:03 5: calling readingsSingleUpdate(sonoffpow1842,SENSOR,{"Time":"2017-02-11T17:15:00", "DS18B20":{"Temperature":"16.0"}},1

Das bezieht sich auf den code in deiner ./FHEM/99_j2r.pm line 51. sieht so aus:
eval { $h = decode_json($j); 1; };
  if ( $@ ) {
    Log3 $name, 2, "$type $name: WARNING: deformed JSON data, check your config.";
    Log3 $name, 2, "$type $name: $@";
    return "deformed or no JSON";
  }

Was prüfst Du hier ab?

Ich hatte Theo schon gefragt, der sagt, an seinem MQtt String
SENSOR,{"Time":"2017-02-11T17:15:00", "DS18B20":{"Temperature":"16.0"}},
liegt es nicht.
Denn dort wurde diskutiert, das bei ,{"Time":   {   "2017-02-11T17:15:00"   }   ,
evtl. Klammern fehlen.

Ich nutze die Version 3.9.11, Theo ist schon bei 3.9.14 ganz frisch von heute Nachmittag,
Ich wollte aber erst das mit den Logfiles zum Plotten der Ergebnisse lösen,
ehe ich auf die Version 3.9.14 hoch setze.

Hast Du eine Idee was das sein kann? das diese Fehler Meldung auslöst?
Ich hoffe es ist nun besser zu lesen.
Gruß Mickbaer aus Berlin :D

dev0

#17
Viel Text ;)

Ich lese heraus, dass alle Werte korrekt geschrieben werden, aber diese Fehlermeldung erscheint:
Zitat
2017.02.11 17:15:03 2: MQTT_DEVICE sonoffpow1842: malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "incoming publish rec...") at ./FHEM/99_j2r.pm line 51.
Hier ist zu sehen, dass kein JSON String übergeben wurde, sondern: "incoming publish rec..."
Vermutlich hast Du die regexp für das Notify nicht eng genug gefasst. Zeig mal bitte ein list von Deinem notify (in Code Tags ;) )

Oder hat sonst noch jemand diesen Effekt?

Um die FHEM Systemresourcen zu schonen habe ich das testweise eingebaute "sleep/setreading" Konstrukt wieder ersetzt. Bitte die angehängte Version noch einmal testen. Wenn alles ok ist, dann check ich sie so auf Github ein.

Zitat von: Mickbaer am 11 Februar 2017, 23:20:29
Was prüfst Du hier ab?
Ob eval einen Fehlercode erzeugt hat.

Edit: Anhang entfernt

Mickbaer

Hallo Dev0,
Ich habe deine Version von Heute Morgen ausprobiert,
und es kommt alles wie gewünscht an.
Ich denke wenn das noch jemand bestätigt, kannst Du es einchecken. (Danke coole Arbeit)

Zu dem AufrufFehler:
Ich poste mal hier den Ausschnitt aus meiner FHEM.cfg.
Vielleicht kannst Du daran sehen was Ich da falsch aufrufe.
#############################################################
#Sonoffpow 1842   IP 63 sonoffpow1842
#############################################################
define sonoffpow1842 MQTT_DEVICE
attr sonoffpow1842 IODev MyBroker
attr sonoffpow1842 eventMap ON:on OFF:off
attr sonoffpow1842 icon measure_power
attr sonoffpow1842 publishSet ON OFF cmnd/sonoffpow1842/POWER/set
attr sonoffpow1842 room 0_MQTT1
attr sonoffpow1842 stateFormat {sprintf("akutelle Leistung: %.1f W Tagesverbrauch: %.3f kW/h", ReadingsVal($name,"CURRENT_POWER",undef), ReadingsVal($name,"TODAY_ENERGY",undef))}
attr sonoffpow1842 subscribeReading_AKTUELL stat/sonoffpow1842/POWER
attr sonoffpow1842 subscribeReading_ENERGY tele/sonoffpow1842/ENERGY
attr sonoffpow1842 subscribeReading_SENSOR tele/sonoffpow1842/SENSOR
attr sonoffpow1842 subscribeReading_STATE tele/sonoffpow1842/STATE
attr sonoffpow1842 webCmd ON:OFF

define no_sonoffpow1842 notify sonoffpow1842:.* { j2r($NAME,$EVENT) }
attr no_sonoffpow1842 room 0_MQTT1

#--- Log datei fuer sonoffpow1842 ----------------------
define log_sonoffpow1842 FileLog ./log/sonoffpow-%Y-%m-%d.log sonoffpow1842.*:(DS18B20_Temperature|Power|Voltage|Today|Current|Period|Yesterday|Uptime|Factor|POWER|Wifi_RSS).*
attr log_sonoffpow1842 room 0_MQTT1


Gruß Mickbaer 8)

dev0

Zitat von: Mickbaer am 12 Februar 2017, 09:40:02
define no_sonoffpow1842 notify sonoffpow1842:.* { j2r($NAME,$EVENT) }

Wie ich schon schrieb: die regexp des Notify ist zu weit gefasst, jedes Reading triggert das Notify. Ein korrektes Beispiel findest Du im ersten Beitrag.

dev0

Die aktualisierte Version 1.04 habe ich eingecheckt: https://github.com/ddtlabs/FHEM-Snippets

Mickbaer

Hallo Dev0,
Ich habe die Readings für den Notify angepasst,
und nun sind auch die Fehler Meldungen verschwunden.

Gruß Mickbaer.

dev0

Ich habe die Funktionen aus dem 99er Modul, dass per Norify ausgerufen werden mußte, in ein eigenständiges Modul verpackt:

https://github.com/ddtlabs/expandJSON/

Reinhart

Hallo dev0!

Danke für diese Implementierung in ein eigenes Modul und vor allem für die gut dargestellten Beispiele der unterschiedlichen Regexp im Github Wiki!

Ich bin gerade am Testen der verschiedenen Regexp und am Ausloten ihrer Möglichkeiten, sieht aber gut aus und es kommen alle Readings die ich möchte in Fhem an. Mit den Regexp hat nun wirklich jeder die Möglichkeit genau das zu erhalten was er braucht und der Rest kommt erst gar nicht.

Übrigens, die 4 Links für die Attribute im Wiki gehen noch ins Leere!

LG
Reinhart

FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Billy

Zitat von: Reinhart am 21 Februar 2017, 13:13:26
Ich bin gerade am Testen der verschiedenen Regexp und am Ausloten ihrer Möglichkeiten, sieht aber gut aus und es kommen alle Readings die ich möchte in Fhem an.

@Reinhart
Könntest du wenn du mit dem Testen durch bist die für das 98_expandJSON.pm und den Sonoff POW
notwendige Config mal anhängen?

Gruß
Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

Reinhart

#25
ich bin zwar immer noch mit den vielen Möglichkeiten der Regexp beim Test, aber für mich hat sich diese Variante am Besten und einfachsten geeignet. Meine Module haben alle Namen die mit "Sonoff..." beginnen, also wählte ich die Regexp:

define ej3 expandJSON Sonoff.*:.*:.{.*}
diese Regexp ist ja ziemlich global gehalten und durchforstet alles was für "Sonoff.*" so daherkommt, zum testen ideal. Ich habe noch keine negativen Symptome feststellen können wenn man so global filtert. Vermutlich werden bei vielen unterschiedlichen Sonoff Modulen mit allen möglichen Sensoren auch viele an nicht unbedingt benötigten Readings angelegt, dann sollte man eine andere Regexp wählen. Trotz globaler Filterung hat man ja noch Einfluß mit dem subscribeReading_xxxx. Aber das kann jeder selbst entscheiden was für seinen Anwendungszweck dann besser passt.

Die typische Definition für das POW Modul sieht dann für meine Zwecke so aus:

define Sonoff_Pow2 MQTT_DEVICE
attr Sonoff_Pow2 IODev myBroker
attr Sonoff_Pow2 publishSet ON OFF cmnd/sonoffpow2/LIGHT
attr Sonoff_Pow2 stateFormat {sprintf("aktuell: %.1f W Tag: %.2f Kw/h avg: %.1f W", ReadingsVal($name,"Power",undef), ReadingsVal($name,"Today",undef), ReadingsVal($name,"Power_avg_day",undef))}
attr Sonoff_Pow2 subscribeReading_ENERGY tele/sonoffpow2/ENERGY
attr Sonoff_Pow2 subscribeReading_LIGHT stat/sonoffpow2/LIGHT
attr Sonoff_Pow2 subscribeReading_state cmnd/sonoffpow2/LIGHT

ist eigentlich gegenüber früher sehr schlank geworden, dank JSON sind einige Attribute sehr global gehalten. ENERGY alleine beinhaltet schon 8 Readings.


ENERGY  {"Time":"2017-02-21T17:48:32", "Yesterday":"2.224", "Today":"1.714", "Period":8, "Power":101, "Factor":"0.99", "Voltage":228, "Current":"0.447"}

das Reading ENERGY beinhaltet eigentlich alle relevanten Daten die ich vom Energiemesser erwarte und das neue Modul generiert brav alle darin enthaltenen Readings und aktualisiert sie mit frischen Daten, alles ohne notify!
LIGHT und state benötige ich nur zum schalten, bzw. Update des Status.

Das Bild im Anhang zeigt die generierten Readings, die Power_xxx kommen vom Modul average. Alles was rot ist, kommt im Zyklus von Teleperiod und wird ständig aktuell gehalten.

Ein Top Modul mit sehr universellen Einsatzmöglichkeiten und sehr flexible Anpassungsmöglichkeiten mit dem Regexp.

LG
Reinhart


FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Billy

@Reinhart
Danke vielmals für deine Definitionen.
Habs getestet, klappt hervorragend.
ZitatEin Top Modul mit sehr universellen Einsatzmöglichkeiten und sehr flexible Anpassungsmöglichkeiten mit dem Regexp.
Kann ich bestätigen.

@dev0
Vielen Dank für deine Arbeit!

Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

dev0

Zitat von: dev0 am 21 Februar 2017, 09:16:54
Ich habe die Funktionen aus dem 99er Modul, dass per Norify ausgerufen werden mußte, in ein eigenständiges Modul verpackt:
https://github.com/ddtlabs/expandJSON/

Ich habe das Modul noch um eine weitere regexp ergänzt, mit der man bestimmen kann ob das konvertierte Reading geschrieben werden soll oder nicht. Enthält ein JSON String beispielsweise 10 Werte, man benötigt aber nur 2 oder 3 davon, dann kann man das jetzt optional angeben. Ohne diese 2. regexp verhält sich das Modul so wie vorher.

Reinhart

#28
gute Idee, danke dev0!

ich habe das jetzt bei meinen POW's so eingestellt und funktioniert perfekt.

define ej3 expandJSON Sonoff.*:ENERGY.*:.{.*} (Power|Current|Voltage|Yesterday|Today)

somit wird Time, Period und Factor nicht erfasst. Eigentlich ist bei der Energiemessung ja Voltage und Current auch schon Luxus, da erstens die Spannung des Elektrizitätsversorgers kaum schwankt und der Strom ebenso wie die Spannung ja nur zur Berechnung der Leistung erforderlich ist. Für Kontrollzwecke steht ja immer noch der gesamte ungefilterte JSON String als Reading "ENERGY" zur Verfügung.

define ej3 expandJSON Sonoff.*:ENERGY.*:.{.*} (Power|Yesterday|Today)
die meisten würden daher mit dieser Regexp auskommen.

Was dabei wichtig ist, bei allen Modulen wird ja der Schaltstatus als reine Legacy Meldung übertragen, somit beeinflusst das Modul von dev0 diesen Ein/Aus Status nicht weiter und braucht auch nicht separat gefiltert werden.

LG
Reinhart
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Reinhart

@dev0

Ich möchte dich um Rat fragen, seit 2 Tagen (Nächte) hängt sich FHEM bei mir komplett auf.

Can't use string ("internal_error") as a HASH ref while "strict refs" in use at ./FHEM/38_netatmo.pm line 2027.

es geht dabei um diese Codezeilen:

    my $json;
    $json = JSON->new->utf8(0)->decode($data);

    Log3 "unknown", 4, "unknown ".Dumper($hash) if(!defined($name));
    Log3 $name, 4, "$name: dispatch return: ".$param->{type};
    Log3 $name, 6, Dumper($json);

    if( $json->{error} ) {
      if($json->{error} =~ /invalid_grant/)
      {
        $hash->{status} = "invalid grant";
        $hash->{STATE} = "LOGIN FAILED";
        return undef;
      }

      $hash->{status} = $json->{error}{message};
      InternalTimer(gettimeofday()+1800, "netatmo_poll", $hash, 0) if($hash->{status} =~ /usage/);

      return undef if($hash->{status} =~ /usage/);
    }


Da dies indirekt mit Json zu tun hat, möchte ich dich fragen ob sich da eventuell irgendwas in die Quere kommt?
Ich kann das leider nicht genau sagen, da vor 2 Tagen auch gleichzeitig der Update auf FHEM 5.8 war.

Ich habe jetzt zur Auffindung des Übeltäters einmal die 38_netatmo.pm gegen die alte Version getauscht. Wenn das nicht hilft, dann gehe ich einmal zurück auf FHEM 5.7. Der Fehler kommt meist erst nach 20 Stunden.

Meinst du kann da ein Zusammenhang sein oder hängt es nur damit zusammen: https://forum.fhem.de/index.php/topic,67461.msg589138.html#msg589138

LG
FHEM auf Raspy4 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa