NEWS
OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON
-
@negalein sagte: alias.0.IQ-Preis.Diesel bearbeiten. Bei Konverter beim Lesen hab ich JSON.parse(val).price verwendet.
JSON.parse(val).Diesel.price
Der Alias muss vom Typ "string" sein.
-
@paul53 schneller
-
@mickym sagte in OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON:
Wenn Du den Dieselpreis haben willst, dann musst Du das auch halt angeben
@paul53 sagte in OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON:
Der Alias muss vom Typ "string" sein.
Danke euch Zwei. Dann probier ich es gleich nochmal.
-
@mickym sagte in OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON:
@paul53 schneller
Hi Micky
Das JSON hat sich wegen neuem Script geändert und sieht nun auszugsweise (der relevante Teil für mich) so aus.
{ "ÖSTERREICH": { "services": { "Super Plus": [ { "date": "05.12.2022-11.12.2022:", "price": "1,642 EUR" } ], "Super": [ { "date": "05.12.2022-11.12.2022:", "price": "1,498 EUR" } ], "Normal": [ { "date": "05.12.2022-11.12.2022:", "price": "1,498 EUR" } ], "Diesel": [ { "date": "05.12.2022-11.12.2022:", "price": "1,685 EUR" } ],
JSON.parse(val).Diesel.price
muss es nun so lauten?
JSON.parse(val).ÖSTERREICH.services.Diesel.price
-
@negalein ja
-
@mickym ist ein Ö sinnvoll?
-
@negalein sagte: muss es nun so lauten?
Nein, es ist noch ein Array mit einem Element hinzu gekommen.
JSON.parse(val)['ÖSTERREICH'].services.Diesel[0].price
-
@homoran na besser ist ohne, aber da hat man ja oft keinen Einfluss darauf. Wenn das Teil streikt dann die Klammernotation mit Gänsefüßchen nutzen.
Und mit dem Array stimmt auch - diesmal ist paul schneller. Richtig müsste es heißen:
JSON.parse(val)["ÖSTERREICH"].services.Diesel[0].price
aber ich sehe ja, dass genügend geballte Kompetenz vorhanden ist.
-
@mickym sagte: Richtig müsste es heißen:
Mit Anführungszeichen funktioniert es nicht.
-
@paul53 Doch funktioniert
habs ja getestet-
-
@mickym sagte: habs ja getestet-
Wie sieht es in RAW-Ansicht (JSON) aus?
-
Da werden sie auskommentiert - funktioniert aber:
{ "common": { "name": "jsonState", "desc": "Manuell erzeugt", "role": "state", "type": "string", "read": true, "write": true, "def": "", "alias": { "id": { "read": "0_userdata.0.Test.jsonState", "write": "0_userdata.0.Test.jsonState.set" }, "read": "JSON.parse(val)[\"ÖSTERREICH\"].services.Diesel[0].price" } }, "type": "state", "native": {}, "_id": "alias.0.test.jsonState", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1670692903249 }
-
@mickym
Ja, mit Backslash davor funktioniert es. -
@mickym sagte in OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON:
Richtig müsste es heißen:
bekomme das im Log (Alias-DP wurden aber aktualisiert)
web.0 2022-12-10 18:28:58.193 error Invalid read function for undefined: JSON.parse(val).Diesel.date => Cannot read properties of undefined (reading 'date') web.0 2022-12-10 18:28:58.192 error Invalid read function for undefined: JSON.parse(val).Diesel.price => Cannot read properties of undefined (reading 'price') javascript.0 2022-12-10 18:28:50.637 error Invalid read function for undefined: JSON.parse(val)["ÖSTERREICH"].services.Diesel[0].date => Cannot read properties of undefined (reading 'services') javascript.1 2022-12-10 18:28:50.634 error Invalid read function for undefined: JSON.parse(val)["ÖSTERREICH"].services.Diesel[0].date => Cannot read properties of undefined (reading 'services') javascript.0 2022-12-10 18:28:07.912 error Invalid read function for undefined: JSON.parse(val)["ÖSTERREICH"].services.Diesel[0].price => Cannot read properties of undefined (reading 'services') javascript.1 2022-12-10 18:28:07.912 error Invalid read function for undefined: JSON.parse(val)["ÖSTERREICH"].services.Diesel[0].price => Cannot read properties of undefined (reading 'services')
So ist das komplette JSON
{ "ÖSTERREICH": { "services": { "Super Plus": [ { "date": "05.12.2022-11.12.2022:", "price": "1,642 EUR" } ], "Super": [ { "date": "05.12.2022-11.12.2022:", "price": "1,498 EUR" } ], "Normal": [ { "date": "05.12.2022-11.12.2022:", "price": "1,498 EUR" } ], "Diesel": [ { "date": "05.12.2022-11.12.2022:", "price": "1,685 EUR" } ], "Premium Diesel": [ { "date": "05.12.2022-11.12.2022:", "price": "1,919 EUR" } ], "IQ Motoröle und Chemie": "10 % Rabatt", "Autowäsche": "10 % Rabatt" }, "info": "", "countryname": "ÖSTERREICH" }, "BOSNIEN UND HERZEGOWINA": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "BOSNIEN UND HERZEGOWINA" }, "BELGIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "BELGIEN" }, "BULGARIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "BULGARIEN" }, "DEUTSCHLAND": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "DEUTSCHLAND" }, "DÄNEMARK": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "DÄNEMARK" }, "SPANIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "SPANIEN" }, "FRANKREICH": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "FRANKREICH" }, "GROßBRITANNIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "GROßBRITANNIEN" }, "UNGARN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "UNGARN" }, "ITALIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "ITALIEN" }, "LITAUEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "LITAUEN" }, "LUXEMBURG": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "LUXEMBURG" }, "NIEDERLANDE": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "NIEDERLANDE" }, "NORWEGEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "NORWEGEN" }, "POLEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "POLEN" }, "RUMÄNIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "RUMÄNIEN" }, "SLOWENIEN": { "services": {}, "info": "Sie tanken zum aktuellen Pumpenabgabepreis", "countryname": "SLOWENIEN" } }
-
@negalein Ich bekomme Deinen Fehler wie gesagt nicht. Auch nicht im Log. Hab deinen kompletten JSON bei mir reinkopiert. Insofern schwierig für mich nachzuvollziehen. Du kannst ja auch mit einfachen Hochkomma nutzen, Du musst es halt in der Maske eintragen und nicht in dem Common Objekt, sonst musst halt mit \ die Gänsefüsschen maskieren.
Bei mir tut das in der Maske eingegeben ohne Probleme:
Dein zuerst gepostetes JSON war ja unvollständig, aber mit dem vollständigen funktioniert es auch.
-
@mickym sagte in OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON:
Du musst es halt in der Maske eintragen und nicht in dem Common Objekt
Common schaut so aus
{ "type": "state", "common": { "name": "IQ_Sprit", "role": "state", "type": "string", "read": true, "write": true, "alias": { "id": "0_userdata.0.IQ_Sprit.IQ_Sprit", "read": "JSON.parse(val)['ÖSTERREICH'].services.Diesel[0].price" } }, "_id": "alias.0.IQ-Sprit.Diesel.Preis.IQ_Sprit", "native": {}, "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1670534620818 }
Und so in der Maske (bereits mit einfachem Hochkomma)
JSON.parse(val)['ÖSTERREICH'].services.Diesel[0].price -
sehe gerade, dass das im Log noch von alten Konvertierungsfunktion ist.
Invalid read function for undefined: JSON.parse(val).Diesel.price => Cannot read properties of undefined (reading 'price')
Eingetragen ist aber schon
JSON.parse(val)['ÖSTERREICH'].services.Diesel[0].price
Werde mal neu starten.
-
@negalein Irgendwie stimmt bei Dir was oben nicht - mit dem Anhaken der unterschiedlichen Lesen Schreiben Funktion.
Na ich weiss den Fehler. Du hast den nicht auf ReadOnly gesetzt. Wenn Du schreiben willst musst halt da das stringify setzen. Der Fehler tritt natürlich nur auf wenn Du in den Alias schreiben willst und da hast Du weder unterschiedliche Punkte angegeben.
Wie gesagt wenn Du das nur extrahieren willst und nicht schreiben setz den Alias mal auf ReadOnly
Oh ich sehe gerade da gibts einen Bug mit dem Alias. Der zerstört den Quelldatenpunkt auch wenn ReadOnly gesetzt ist und schreibt. Dann musst halt bei Schreiben auch setzen.
-
@mickym sagte in OpenMQTT Gateway Wetterstation Iobroker Datenpunkt JSON:
Wie gesagt wenn Du das nur extrahieren willst und nicht schreiben setz den Alias mal auf ReadOnly
Ja, nur vom orig. DP in den Alias schreiben (konvertiert).
Du meinst da auch das
JSON.parse(val)['ÖSTERREICH'].services.Diesel[0].price
bei Write eintragen?
Bzw. da
-
@negalein Also im Prinzip taucht der Fehler nicht auf, wenn Du nicht in den Alias schreibst. Sonst musst Du das gesamte Objekt mir stringfy schreiben. ist aber doof in meinen Augen. Nein nicht parsen. Also das Problem ist, dass das ReadOnly im Alias nicht funktioniert. Du kannst als Umgehung einfach in einen Dummy Datenpunkt schreiben.
Ja so kann man das Teil überlisten ohne Log Einträge:
und den Alias selbst auf ReadOnly:
Der dummy Datenpunkt muss nicht existieren:
"common": { "name": "jsonState", "desc": "Manuell erzeugt", "role": "state", "type": "string", "read": true, "write": false, "def": "", "alias": { "id": { "read": "0_userdata.0.Test.jsonState", "write": "0_userdata.0.Test.jsonState.dummy" }, "read": "JSON.parse(val)['ÖSTERREICH'].services.Diesel[0].price" } }