NEWS
JSON String mit Punkt im Objektnamen
-
Hallo,
ich bekomme folgenden JSON String per mqtt und möchte ihn zerlegen und in einzelne Objekte speichern:
{ "sn": 2110125088, "time": 1695387075, "values": { "A.Ms.Amp": 1.336000063456595, "A.Ms.Vol": 577.3799870945513, "A.Ms.Watt": 771, "B.Ms.Amp": 1.3320000632666051, "B.Ms.Vol": 602.2899865377694, "B.Ms.Watt": 802, "Pac": 1522, "GridMs.Hz": 49.98999888263643, "GridMs.PhV.phsA": 232.07999481260777, "GridMs.PhV.phsB": 231.80999481864274, "GridMs.PhV.phsC": 231.0199948363006, "A1.Ms.Amp": 1.305000061984174, "A2.Ms.Amp": 0.003000000142492354, "A3.Ms.Amp": 0.014000000664964318, "A4.Ms.Amp": 0.0020000000949949026, "A5.Ms.Amp": 0.003000000142492354, "B1.Ms.Amp": 1.3320000632666051, "GridMs.TotPFPrc": 0.999000047449954, "E-Total": 128826.8301189458, "Mt.TotOpTmh": 50391.78116688694, "Mt.TotTmh": 51677.7808933951, "Op.TmsRmg": 0, "Serial Number": 2110125088, "Op.EvtCntUsr": 4686, "Op.EvtNo": 0, "Mode": "MPP", "Error": "-------", "Op.GriSwStt": "Cls", "Inv.TmpLimStt": "NoneDrt", "InvCtl.Stt": "On", "PlntCtl.Stt": "On" } }wie bekomme ich das mit den Punkten im Objektnamen hin?
so funktioniert es auf jeden Fall nicht:on({id: [].concat([Source]), change: "ne"}, async function (obj) { let value = obj.state.val; let oldValue = obj.oldState.val; setState(A_Ms_Amp, getAttr((obj.state ? obj.state.val : ""), 'values.A.Ms.Amp'), true); });Gruß,
Stefan -
Hallo,
ich bekomme folgenden JSON String per mqtt und möchte ihn zerlegen und in einzelne Objekte speichern:
{ "sn": 2110125088, "time": 1695387075, "values": { "A.Ms.Amp": 1.336000063456595, "A.Ms.Vol": 577.3799870945513, "A.Ms.Watt": 771, "B.Ms.Amp": 1.3320000632666051, "B.Ms.Vol": 602.2899865377694, "B.Ms.Watt": 802, "Pac": 1522, "GridMs.Hz": 49.98999888263643, "GridMs.PhV.phsA": 232.07999481260777, "GridMs.PhV.phsB": 231.80999481864274, "GridMs.PhV.phsC": 231.0199948363006, "A1.Ms.Amp": 1.305000061984174, "A2.Ms.Amp": 0.003000000142492354, "A3.Ms.Amp": 0.014000000664964318, "A4.Ms.Amp": 0.0020000000949949026, "A5.Ms.Amp": 0.003000000142492354, "B1.Ms.Amp": 1.3320000632666051, "GridMs.TotPFPrc": 0.999000047449954, "E-Total": 128826.8301189458, "Mt.TotOpTmh": 50391.78116688694, "Mt.TotTmh": 51677.7808933951, "Op.TmsRmg": 0, "Serial Number": 2110125088, "Op.EvtCntUsr": 4686, "Op.EvtNo": 0, "Mode": "MPP", "Error": "-------", "Op.GriSwStt": "Cls", "Inv.TmpLimStt": "NoneDrt", "InvCtl.Stt": "On", "PlntCtl.Stt": "On" } }wie bekomme ich das mit den Punkten im Objektnamen hin?
so funktioniert es auf jeden Fall nicht:on({id: [].concat([Source]), change: "ne"}, async function (obj) { let value = obj.state.val; let oldValue = obj.oldState.val; setState(A_Ms_Amp, getAttr((obj.state ? obj.state.val : ""), 'values.A.Ms.Amp'), true); });Gruß,
Stefan -
@duffy82 sagte: Punkten im Objektnamen
In dem Fall muss man eine andere Schreibwiese verwenden.
on(Source, function (obj) { setState(A_Ms_Amp, JSON.parse(obj.state.val).values['A.Ms.Amp'], true); });getAttr() verwendet man nur in Blockly.
@paul53
ich bekomme folgende Fehlermeldung:error javascript.0 (6597) at Object.<anonymous> (script.js.test:11:41)hier mein komplettes Script:
const Serial = 2110125088 const Source = 'mqtt.1.solar.inverter.' + Serial; const Dest = '0_userdata.0.Inverter.' + Serial; const A_Ms_Amp = Dest + '.A_Ms_Amp'; // Datenpunkte erzeugen createState(A_Ms_Amp, 0, {type: 'number', unit: 'A'}); on(Source, function (obj) { setState(A_Ms_Amp, obj.state.val.values['A.Ms.Amp'], true); }); -
@paul53
ich bekomme folgende Fehlermeldung:error javascript.0 (6597) at Object.<anonymous> (script.js.test:11:41)hier mein komplettes Script:
const Serial = 2110125088 const Source = 'mqtt.1.solar.inverter.' + Serial; const Dest = '0_userdata.0.Inverter.' + Serial; const A_Ms_Amp = Dest + '.A_Ms_Amp'; // Datenpunkte erzeugen createState(A_Ms_Amp, 0, {type: 'number', unit: 'A'}); on(Source, function (obj) { setState(A_Ms_Amp, obj.state.val.values['A.Ms.Amp'], true); }); -
@duffy82 sagte: hier mein komplettes Script:
Sorry, ich hatte noch JSON.parse() ergänzt.
setState(A_Ms_Amp, JSON.parse(obj.state.val).values['A.Ms.Amp'], true);
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden