httpmod XML vs. JSON

Begonnen von Wolfgang Hochweller, 27 April 2021, 10:32:54

Vorheriges Thema - Nächstes Thema

Wolfgang Hochweller

httpmod unterstuetzt XPath um  XML-Dateien zu interpretieren.

Gibt es das vergleichbare auch fuer JSON-Dateien ?
Ich weiss, dass es z. B. jsonpath gibt, aber im WIKI von httpmod finde ich wenig ueber eine moegliche Syntax fuer komplexere Abfragen bzw. Zuweisung eines Readings bei json.

Kann ich mich irgendwo informieren ?

Ein Beispiel :   

{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.6206,
58.9987,
29
]
},
"properties": {
"meta": {
"updated_at": "2021-04-27T07:55:35Z",
"units": {
"air_pressure_at_sea_level": "hPa",
"air_temperature": "celsius",
"air_temperature_max": "celsius",
"air_temperature_min": "celsius",
"cloud_area_fraction": "%",
"cloud_area_fraction_high": "%",
"cloud_area_fraction_low": "%",
"cloud_area_fraction_medium": "%",
"dew_point_temperature": "celsius",
"fog_area_fraction": "%",
"precipitation_amount": "mm",
"precipitation_amount_max": "mm",
"precipitation_amount_min": "mm",
"probability_of_precipitation": "%",
"probability_of_thunder": "%",
"relative_humidity": "%",
"ultraviolet_index_clear_sky": "1",
"wind_from_direction": "degrees",
"wind_speed": "m/s",
"wind_speed_of_gust": "m/s"
}
},
"timeseries": [
{
"time": "2021-04-27T08:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1018,
"air_temperature": 6.9,
"cloud_area_fraction": 8.8,
"cloud_area_fraction_high": 7.8,
"cloud_area_fraction_low": 0,
"cloud_area_fraction_medium": 1.1,
"dew_point_temperature": 0.7,
"fog_area_fraction": 0,
"relative_humidity": 65.5,
"ultraviolet_index_clear_sky": 1.6,
"wind_from_direction": 327,
"wind_speed": 0.9,
"wind_speed_of_gust": 3.2
}
},
"next_12_hours": {
"summary": {
"symbol_code": "partlycloudy_day",
"symbol_confidence": "certain"
},
"details": {
"probability_of_precipitation": 0
}
},
"next_1_hours": {
"summary": {
"symbol_code": "fair_day"
},
"details": {
"precipitation_amount": 0,
"precipitation_amount_max": 0,
"precipitation_amount_min": 0,
"probability_of_precipitation": 0.6,
"probability_of_thunder": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "partlycloudy_day"
},
"details": {
"air_temperature_max": 9.5,
"air_temperature_min": 7.8,
"precipitation_amount": 0,
"precipitation_amount_max": 0,
"precipitation_amount_min": 0,
"probability_of_precipitation": 0
}
}
}
},
{
"time": "2021-04-27T09:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1018,
"air_temperature": 7.8,
"cloud_area_fraction": 25.2,
"cloud_area_fraction_high": 25,
"cloud_area_fraction_low": 0.2,
"cloud_area_fraction_medium": 0,
"dew_point_temperature": 1.6,
"fog_area_fraction": 0,
"relative_humidity": 65.7,
"ultraviolet_index_clear_sky": 2.3,
"wind_from_direction": 312.4,
"wind_speed": 2.1,
"wind_speed_of_gust": 4.7
}
},
"next_12_hours": {
"summary": {
"symbol_code": "partlycloudy_day",
"symbol_confidence": "certain"
},
"details": {
"probability_of_precipitation": 0
}
},
"next_1_hours": {
"summary": {
"symbol_code": "fair_day"
},
"details": {
"precipitation_amount": 0,
"precipitation_amount_max": 0,
"precipitation_amount_min": 0,
"probability_of_precipitation": 0,
"probability_of_thunder": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "partlycloudy_day"
},
"details": {
"air_temperature_max": 9.5,
"air_temperature_min": 8.6,
"precipitation_amount": 0,
"precipitation_amount_max": 0,
"precipitation_amount_min": 0,
"probability_of_precipitation": 0
}
}
}
},



Die einzelnen Bloecke, etwa


"time": "2021-04-27T11:00:00Z",
"data": {
"instant": {
"details": {
.
.
.
.
.


unterscheiden sich nur im Datum.

Wie kann ich jetzt das erste, zweite oder auch 10. Auftreten eines Elements heraussuchen, unabhaengig vom Datum ?

Mit XML und XPath weiss ich das, aber mit JSON komme ich so nicht weiter.

Das Beispiel in der Dokumentation :


reading[0-9]+JSON
defines a path to the JSON object wanted by concatenating the object names with an underscore as delimiter (see the example below)


verstehe ich, die Frage ist, welche komplexeren Operation kann ich da reinlegen ( wenn ueberhaupt ) ?
Etwa, wie finde ich Bloecke, die zu 12 Uhr mittags gehoeren und nur die ?

rudolfkoenig

Es gibt ein JsonMod, das in Automation behandelt wird.
Leider ist sie nicht in MAINTAINER.txt eingetragen :(

Wolfgang Hochweller

Danke, muss ich probieren.
Der Wetterbericht, der mir diese Daten liefert, hat schon angekuendigt, die XML-Version irgendwann einzustellen.

Wolfgang Hochweller

Das gibt eine Menge 'try and error '......

Bei obigem Beispiel gibt das hier ein Ergebnis :


single(jsonPath('$..time'), 'time0', 'default value');


das hier aber nicht :


single(jsonPath('$..time[1]'), 'time0', 'default value');


Ersteres liefert mir den Wert des erste 'time'-Eintrags,
letzteres sollte nach meinem Verstaendnis den Wert des 2. 'time'-Eintrags liefern.
Tut es aber nicht, was sicher an mir liegt.

yersinia

#4
Zitat von: Wolfgang Hochweller am 27 April 2021, 12:36:44das hier aber nicht :


single(jsonPath('$..time[1]'), 'time0', 'default value');


Ersteres liefert mir den Wert des erste 'time'-Eintrags,
letzteres sollte nach meinem Verstaendnis den Wert des 2. 'time'-Eintrags liefern.
Tut es aber nicht, was sicher an mir liegt.
Nope, das ist schlicht (noch) nicht implementiert.
ZitatHerausfiltern von spezifischen Array-Elementen (Thread & Thread)
[98_JsonMod.pm] Wunschliste von neuen Funktionen



Edit: ich sehe gerade, dass es bei dir anders gelagert sein könnte; versuche mal:
single(jsonPath('$.timeseries.[1]'), 'time0', 'default value');
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Wolfgang Hochweller

Danke, geht aber auch nicht.
Denke, alles, was
  • benutzt, geht noch nicht.

    Das Problem liegt eher an meiner Annahme bzgl. JSONPath.

    Ich habe natuerlich versucht, herauszufinden, was es mit JSONPath auf sich hat, dann stoesst man schnell auf eine
    Bibliothek :  jasonpath.js

    Und habe die Beispiele dazu versucht, anzuwenden.



herrmannj

am besten dort lernen: https://goessner.net/articles/JsonPath/

Im Netz gibt es diverse tools bei denen Du Dein JSON reinkopierst und die query online und direkt testen kannst (google: jsonpath tester)

Array literal ".[1]" wird von JsonMod unterstützt, Array indirekt ".[-1]" etc nicht


Wolfgang Hochweller

#7
Danke, mache ich gerade.


Gibt es die umgekehrte Richtung auch irgendwo ?

Ich markiere ein Element und bekomme die Pfadbeschreibung ?

Gefunden !

yersinia

Aus reiner Neugier, was hat denn jetzt eigentlich zum Erfolg geführt?
single(jsonPath('$.timeseries.[1]'), 'time0', 'default value');
single(jsonPath('$.timeseries[1]'), 'time0', 'default value');
single(jsonPath('$..times.[1]'), 'time0', 'default value');
single(jsonPath('$..times[1]'), 'time0', 'default value');
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Wolfgang Hochweller

Das hier geht :


single(jsonPath('$.properties.timeseries[0].time'), 'time', 'time0');


egal ob
  • oder eine andere Zahl.

    Grenzen gehen aber nicht, jedenfalls nicht so :


    single(jsonPath('$.properties.timeseries[0:2].time'), 'time', 'time0');


    Ich habe jetzt bei meinen Versuchen sowohl einen Pathfinder als auch Pathchecker verwendet, funktioniert prinzipiell prima.

    Im Vergleich zu XML sind die Ergebnisse aber noch ernuechternd :

    Es passiert eigentlich alles, was passieren koennte :

    Pathfinder geht nicht, dann geht auch jsonmod nicht :    war zu erwarten 

    Pathfinder geht, aber nicht jsonmod   :     Nicht vewunderlich, daran wird ja noch gearbeitet.

    Pathfinder geht nicht, obwohl ich meine, dass es funktionieren muesste :

    Beispiel :

    Das geht in Pathfinder, generiert aber einen Fehler in jsonmod:


    $.properties.timeseries[?(@.time == '2021-04-27T15:00:00Z')].time


    das geht weder in Pathfinder noch in jsonmod :


    $.properties.timeseries[?( '15:00:00' in @.time )].time


    oder


    $.properties.timeseries[?( @.time contains '15:00:00' )].time


    Dafuer geht das hier in Pathfinder, aber man muss FHEM neu starten, wenn man das in jsonmod versucht:


    $.properties.timeseries[?(/15:00:00/ .test (@.time ))].time



herrmannj

poste (oder schicke) doch bitte einmal ein komplettes JSON.

ZitatGrenzen gehen aber nicht
Das ist ok ((noch) nicht implementiert).

$.properties.timeseries[?(/15:00:00/ .test (@.time ))].time
Das soll auch nicht gehen. Allerdings werte ich es als BUG wenn da ein Neustart fällig wird. Das muss ich mir mit Deinem JSON mal nachstellen und anschauen.

Als ich JsonMod geschrieben habe, gab es keine JSONPath lib für perl und ich habe (musste) das komplett implementieren. Referenz für mich ist Goessner, aber es gibt diverse Varianten "in the wild". Der Syntax ist nicht komplett implementiert sondern die 80% die für 98% der Anwendungen ausreichen. Arrays vervollständige ich noch (bei Gelegenheit) - Script Filter und logische Operatoren werden beliebig komplex, dafür müsste man lexer und parser implementieren (da fehlt mir Kosten/Nutzen)

Schick mal das JSON (gern nochmal mit der Erklärung was genau in die Readings soll) dann schau ich mir das an.

vg, joerg

Wolfgang Hochweller

#11
Klar, hier ist ein Beispiel :


{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
5.6206,
58.9987,
29
]
},
"properties": {
"meta": {
"updated_at": "2021-04-27T13:57:45Z",
"units": {
"air_pressure_at_sea_level": "hPa",
"air_temperature": "celsius",
"cloud_area_fraction": "%",
"precipitation_amount": "mm",
"relative_humidity": "%",
"wind_from_direction": "degrees",
"wind_speed": "m/s"
}
},
"timeseries": [
{
"time": "2021-04-27T14:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1017.5,
"air_temperature": 10.3,
"cloud_area_fraction": 20.1,
"relative_humidity": 58.2,
"wind_from_direction": 293.6,
"wind_speed": 4.9
}
},
"next_12_hours": {
"summary": {
"symbol_code": "fair_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "partlycloudy_day"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "partlycloudy_day"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T15:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1017.1,
"air_temperature": 10.3,
"cloud_area_fraction": 63.5,
"relative_humidity": 57.9,
"wind_from_direction": 299.2,
"wind_speed": 5.4
}
},
"next_12_hours": {
"summary": {
"symbol_code": "fair_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "partlycloudy_day"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "fair_day"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T16:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1016.7,
"air_temperature": 9.8,
"cloud_area_fraction": 91.3,
"relative_humidity": 61.1,
"wind_from_direction": 305.5,
"wind_speed": 5.5
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "partlycloudy_day"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "fair_day"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T17:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1016.3,
"air_temperature": 9.3,
"cloud_area_fraction": 80.7,
"relative_humidity": 59.8,
"wind_from_direction": 310.2,
"wind_speed": 5
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_night"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "fair_day"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T18:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1016.1,
"air_temperature": 8.7,
"cloud_area_fraction": 36.1,
"relative_humidity": 60.9,
"wind_from_direction": 316.9,
"wind_speed": 4.7
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_night"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "clearsky_day"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T19:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1016,
"air_temperature": 7.9,
"cloud_area_fraction": 10.5,
"relative_humidity": 69.4,
"wind_from_direction": 320.1,
"wind_speed": 3.6
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T20:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1015.9,
"air_temperature": 7,
"cloud_area_fraction": 4.4,
"relative_humidity": 76.4,
"wind_from_direction": 326,
"wind_speed": 3.4
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T21:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1015.8,
"air_temperature": 6.1,
"cloud_area_fraction": 2,
"relative_humidity": 88.1,
"wind_from_direction": 331.8,
"wind_speed": 2.7
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
}
}
},
{
"time": "2021-04-27T22:00:00Z",
"data": {
"instant": {
"details": {
"air_pressure_at_sea_level": 1015.7,
"air_temperature": 4.9,
"cloud_area_fraction": 3.9,
"relative_humidity": 92.3,
"wind_from_direction": 327.6,
"wind_speed": 2.2
}
},
"next_12_hours": {
"summary": {
"symbol_code": "clearsky_day"
}
},
"next_1_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
},
"next_6_hours": {
"summary": {
"symbol_code": "clearsky_night"
},
"details": {
"precipitation_amount": 0
}
}
}
}
]
}
}


https://jsonpath.herokuapp.com/

ist eine interessante Seite zum Checken.

Vier verschiedene Patchchecker, die Resultate sind schon verblueffend.



In dem Beispiel taucht jeder Zeitstempel genau einmal auf, kann man ja mal aendern.

Die Logik fuer die Readings , z. B.

ein Reading fuer jedes  'data.instant.details.air_temperature', wenn der Zeitstempel 12:00:00 enthaelt.
Das entspricht  dann jeweils der Mittagstemperatur fuer die kommenden Tage.
Also , erstes Auftreten waere die Temperatur heute ( oder morgen , je nachdem, wann man fragt ), das naechste der Tag danach, usw.

herrmannj

Welche readings sollen erzeugt werden?

Wolfgang Hochweller

#13
Ich war noch am aendern .....
Reicht die Erklaerung oben ?


Einen kompletten Datensatz bekommt man unter :


https://api.met.no/weatherapi/locationforecast/2.0/compact?lat=58.9987&lon=5.62055

herrmannj

#14
JsonMod kann sehr viel - aber nicht alles und das ist auch ok:). Das hier ist ein Grenzfall.

Der Reihe nach:

Die Daten die Du suchst sind innerhalb der JSON Source als Array/Liste organisiert. Daher ist die readingList ein multi()

Der JsonPath '$.properties.timeseries.[*]' löst auf das gesuchte Array auf.

Testweise die Zeit als Reading Name: property('time') und die Temperatur als Value: property('data.instant.details.air_temperature').

Die readingList
multi(jsonPath('$.properties.timeseries.[*]'), property('time'), property('data.instant.details.air_temperature'));
ergibt:   
Readings
2021-04-28T200000Z   7.1
2021-04-28T210000Z   5.8
2021-04-28T220000Z   5.1
...

Jetzt zum Problem: Du möchtest _nur_ die Werte wo der Zeitstempel 12:00:00Z _enthält_. Das braucht einen Filter, allerdings passt keiner der zur Verfügung stehenden Filter (>,=,<, 'in' ...). Du bräuchtest ein 'enthält' oder 'endet auf' etc. Da gibt es nichts passendes. Da ich nicht ausschließen möchte, dass es innerhalb der kommenden 25 Jahre einen weiteren Anwendungsfall dafür geben könnte, habe ich einen regex operator (=~) eingebaut.

Der JsonPath mit Filter sieht dann so aus (Jetzt in doppelten Hochkomma weil man die einfachen für den Filter benötigt. Daher müssen $ und @ escaped werden!): jsonPath("\$.properties.timeseries.[?(\@.time =~ '12:00:00Z')]")
ergibt:
Readings
2021-04-29T120000Z   13.3
2021-04-30T120000Z   11
...

Jetzt noch hübsch machen:
multi(jsonPath("\$.properties.timeseries.[?(\@.time =~ '12:00:00Z')]"), substr(property('time'), 0, 10), sprintf('%.1f°', property('data.instant.details.air_temperature')));

ergibt:
Readings
2021-04-29   13.3°
2021-04-30   11.0°
2021-05-01   7.9°
...

Das braucht den JsonMod im Anhang, bitte testen und wenn es keine Nebenwirkungen gibt, dann checke ich das in den kommenden Tagen ein.

@Yersinia: falls Du mitliest, Du hattest einige Male einen ungeklärten Bug auf OS oder perl Ebene. JSON::XS wäre eine mögliche Ursache. In dieser Version habe ich JSON::XS durch Cpanel::JSON::XS ersetzt. Das müsste installiert sein, ansonsten wird das pure perl fallback verwendet.

Mit der Bitte um Feedback, Danke
Joerg

Nachtrag:
Hier wäre noch eine leicht modifizierte readingsList, plus Summary:
multi(jsonPath("\$.properties.timeseries.[?(\@.time =~ '12:00:00Z')]"), substr(property('time'), 0, 10), sprintf('%.1f° (%s)', property('data.instant.details.air_temperature'), property('data.next_12_hours.summary.symbol_code')));

2021-04-29 7.6° (rain)
2021-04-30 10.7° (cloudy)
2021-05-01 11.3° (cloudy)

Wolfgang Hochweller

Super, danke, teste ich.

In allen Beschreibungen tauchen sowohl 'in'  als auch 'contains' auf, die, soweit ich sehe, auf substrings testen sollten.

Sowas :


$.properties.timeseries[?(@.time contains '16:00:00')].time


funktioniert bei Jayway,aber nicht bei Goessner

Bei


$.properties.timeseries[?(/16:00:00/ .test (@.time ))].time


ist es genau umgekehrt.

Man muss also genau aufpassen, welchen 'Auswerter' man verwendet.

herrmannj

ja, das ist so. Schau mal hier auf das Kleingedruckte: https://support.smartbear.com/alertsite/docs/monitors/api/endpoint/jsonpath.html

Die möglichen Filter hängen von der engine ab. Vielleicht mag jemand die für JsonMod im Wiki dokumentieren.

Danke, vg
joerg

ph1959de

Zitat von: herrmannj am 29 April 2021, 09:51:08
Die möglichen Filter hängen von der engine ab. Vielleicht mag jemand die für JsonMod im Wiki dokumentieren.

Ich hätte ja schon mit Doku im Wiki begonnen ... wenn denn JSONMod mal in der Maintainer.txt aufgetaucht wäre  ;)
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"

Wolfgang Hochweller

Getestet und fuer gut befunden  :)
Super, danke !

Das hier :


multi(jsonPath("\$.properties.timeseries.[?(\@.time =~ '12:00:00Z')]"), concat('temp_',count),property('data.instant.details.air_temperature')) );


liefert mir jetzt :


   READINGS:
     2021-04-29 10:27:10   temp_0          12.3
     2021-04-29 10:27:10   temp_1          10.5
     2021-04-29 10:27:10   temp_2          9.1
     2021-04-29 10:27:10   temp_3          7.8
     2021-04-29 10:27:10   temp_4          6.9
     2021-04-29 10:27:10   temp_5          8.5
     2021-04-29 10:27:10   temp_6          7.5
     2021-04-29 10:27:10   temp_7          7.5
     2021-04-29 10:27:10   temp_8          8.8


Genau das brauche ich fuer meine Widgets in FTUI.

herrmannj

#19
Zitat von: ph1959de am 29 April 2021, 10:14:10
Ich hätte ja schon mit Doku im Wiki begonnen ... wenn denn JSONMod mal in der Maintainer.txt aufgetaucht wäre  ;)
Ok, ok ... :D &Danke!!

herrmannj


yersinia

#21
Zitat von: herrmannj am 29 April 2021, 00:47:37@Yersinia: falls Du mitliest, Du hattest einige Male einen ungeklärten Bug auf OS oder perl Ebene. JSON::XS wäre eine mögliche Ursache. In dieser Version habe ich JSON::XS durch Cpanel::JSON::XS ersetzt. Das müsste installiert sein, ansonsten wird das pure perl fallback verwendet.
Sorry, konnte gestern nicht testen - habe aber deine Version jetzt eingespielt (via normalen FHEM Update). Erstmal funktioniert es anscheinend weiter.
Die SEGV Probleme konnte ich lösen indem ich ein (!) JsonMod Device gelöscht habe, seitdem ist das nicht mehr aufgetreten. Ich werde es beobachten.
Weiterhin läuft es, ohne Cpanel::JSON::XS bewusst installiert zu haben, bisher auch unauffällig. Wäre eigtl JSON::MaybeXS eine Option für dich gewesen?

[sOT]Irgendwie überzeugt mich CPAN noch nicht, neben (auf raspi OS) apt noch mit cpan rumhantieren um alle FHEM Module zum Laufen zu bewegen, ich weiß nicht. Vor allem muss ich die Aktualsierungen dann auch noch neben apt über cpan(minus) abfragen. ::)
EDIT: es gibt allerdings ein libcpanel-json-xs-perl Paket - und (EDIT II) das scheint auch zu funktionieren.[sOT]
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

herrmannj

schau sicherheitshalber nochmal auf die version, fhem update verteilt das erst an einer bestimmten Zeit. (8:00, 10:00? dont know...)

JSON::XS vs Cpanel:JSON::XS: beides schnelle C Implementierungen. JSON::XS ist bekannt für teilweise zickiges (bug) Verhalten, Cpanel ist der neuere und verbesserte fork.  JSON::MaybeXS ist nur ein loader und wenn man Pech hat wird dann eben doch JSON::XS verwendet. Macht keinen Sinn.

Da JSON die Kernkompetenz von JsonMod ist, bringt das Modul eine schnelle (pure perl) JSON Implementierung mit. Wenn Cpanel::JSON::XS vorhanden ist, dann wird das verwendet und falls nicht die pure perl Implementierung. In diesem Fall findest Du eine Nachricht im Log (... JSON ist pure perl, consider installing Cpanel::JSON::XS)

libcpanel-json-xs-perl, -> der empfohlene Weg auf Systemen die das haben. (sudo apt-get install libcpanel-json-xs-perl)


yersinia

Zitat von: herrmannj am 30 April 2021, 09:16:33schau sicherheitshalber nochmal auf die version, fhem update verteilt das erst an einer bestimmten Zeit. (8:00, 10:00? dont know...)
seit 7:45 heute morgen:
98_JsonMod.pm 24360 2021-04-29 21:17:23Z herrmannj
8)

Ja, ich hatte ich gestern auch gelesen, dass Cpanel::JSON::XS wesentlich schneller als JSON:XS oder JSON:PP sein soll. Opbjektiv ist dies auch so. Schön.

Zitat von: herrmannj am 30 April 2021, 09:16:33libcpanel-json-xs-perl, -> der empfohlene Weg auf Systemen die das haben. (sudo apt-get install libcpanel-json-xs-perl)
Genau das! :D Läuft auch.
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

ph1959de

Seite JsonMod im Wiki ist angelegt und mit ersten Informationen (insbesondere auch Liste der Anwendungsbeispiele) gefüllt.
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"