NEWS
JSON in Objekt/Datenpunkt umwandeln
-
@paul53 sagte in JSON in Objekt/Datenpunkt umwandeln:
Außerdem kann man unmittelbar nach dem Schreiben in einen DP ihn nicht gleich wieder einlesen, da "aktualisiere" asynchron ausgeführt wird.
Ahh das wusste ich noch nicht.
Bei mir sieht es jetzt so aus:

Ich bekomme aber als Ausgabe:
"{\"value\":22.5}"Also die Spiegelstriche sind überflüssig. Wo kommen die her?
Danke für die Hilfe!
@Codierknecht Danke! Mit Debug Info geht es schneller ;-) Ausgabe dazu siehe oben.
@dan11hh sagte in JSON in Objekt/Datenpunkt umwandeln:
Also die Spiegelstriche sind überflüssig. Wo kommen die her?
Naja, die sind in diesem Fall nicht überflüssig weil die ganze Ausgabe ja selbst in
"steht. Dann müssen die inneren "Escaped" werden, das macht man mit Spiegelstrichen.Beides ist also richtig:
"{\"value\":22.5}" {"value":22.5}Ist das die Debug Ausgabe? Dann könnte das beim Umwandeln in einen String passieren
-
@paul53 sagte in JSON in Objekt/Datenpunkt umwandeln:
Außerdem kann man unmittelbar nach dem Schreiben in einen DP ihn nicht gleich wieder einlesen, da "aktualisiere" asynchron ausgeführt wird.
Ahh das wusste ich noch nicht.
Bei mir sieht es jetzt so aus:

Ich bekomme aber als Ausgabe:
"{\"value\":22.5}"Also die Spiegelstriche sind überflüssig. Wo kommen die her?
Danke für die Hilfe!
@Codierknecht Danke! Mit Debug Info geht es schneller ;-) Ausgabe dazu siehe oben.
@dan11hh
Bau Dir für die Ausgabe ein neues Objekt - so wie in meinem Beispiel.
Du konvertierst da auch viel zu oft hin und her und liest weiterhin einen Wert, den Du gerade erst geschrieben hat.Versuch's mal auf die Art:

Wenn's nicht funktioniert, poste mal hier das JSON aus dem Trigger, damit wir das nachstellen und testen können.
-
@paul53 sagte in JSON in Objekt/Datenpunkt umwandeln:
Außerdem kann man unmittelbar nach dem Schreiben in einen DP ihn nicht gleich wieder einlesen, da "aktualisiere" asynchron ausgeführt wird.
Ahh das wusste ich noch nicht.
Bei mir sieht es jetzt so aus:

Ich bekomme aber als Ausgabe:
"{\"value\":22.5}"Also die Spiegelstriche sind überflüssig. Wo kommen die her?
Danke für die Hilfe!
@Codierknecht Danke! Mit Debug Info geht es schneller ;-) Ausgabe dazu siehe oben.
-
@dan11hh sagte: Bei mir sieht es jetzt so aus:
Sehr chaotisch.
Soll der Wert von "value" nur aufgerundet in den MinimalenEntladeSoC geschrieben werden?
EDIT: Mit sinnvollen Variablenbezeichnern macht man sich das Leben einfacher.

@paul53
Eigentlich will ich etwas ganz einfachers:Ich möchte, ausgelöst durch den Trigger "Sofort Laden", dass der AktuelleBatterieSOC den MinimalenEntladeSoC überschreibt.
Das war es eigentlich schon. Wären die Werte nicht alle als JSON abgespeichert, hätte ich das schon hinbekommen. Aber so :anguished:
Hintergrund ist, dass ich, wenn die Wallbox auf Sofort-Laden geht, der Hausspeicher nicht entladen wird, sondern nur aus dem Netz gezogen wird.
Das Erkennen des "Sofort-Ladens" klappt ja auch schon. Nur das schreiben des AktuellenSoC in den MinimalenEntladeSoC nicht.
Ich probiere jetzt mal deinen EDIT aus.
EDIT:
Ja, jetzt klappt es. 1000DANK! Ich arbeite fast nie mit Variable, deshalb habe ich, glaube ich, den ersten Versuch vermurkst. Will ich mir gleich nochmal angucken. -
@paul53
Eigentlich will ich etwas ganz einfachers:Ich möchte, ausgelöst durch den Trigger "Sofort Laden", dass der AktuelleBatterieSOC den MinimalenEntladeSoC überschreibt.
Das war es eigentlich schon. Wären die Werte nicht alle als JSON abgespeichert, hätte ich das schon hinbekommen. Aber so :anguished:
Hintergrund ist, dass ich, wenn die Wallbox auf Sofort-Laden geht, der Hausspeicher nicht entladen wird, sondern nur aus dem Netz gezogen wird.
Das Erkennen des "Sofort-Ladens" klappt ja auch schon. Nur das schreiben des AktuellenSoC in den MinimalenEntladeSoC nicht.
Ich probiere jetzt mal deinen EDIT aus.
EDIT:
Ja, jetzt klappt es. 1000DANK! Ich arbeite fast nie mit Variable, deshalb habe ich, glaube ich, den ersten Versuch vermurkst. Will ich mir gleich nochmal angucken.Hallo habe folgendes Problem:
Möchte aus einem Datenpunkt vom mqtt adapter einen Wert extrahieren, in diesem Fall die Spannung.
Der Wert vom Datenpunkt ist z.B.:{"id": 100,"voltage":1.28}Ich möchte den Wert der Spannung in einen eigenen Datenpunkt schreiben.
Mein Blocklyversuch sieht jetzt so aus

Als Ausgabe bekomme ich leider nur folgendes: { val: undefined, ack: true }
Kenne mich da zu wenig aus, hat jemand eine Idee?
-
Hallo habe folgendes Problem:
Möchte aus einem Datenpunkt vom mqtt adapter einen Wert extrahieren, in diesem Fall die Spannung.
Der Wert vom Datenpunkt ist z.B.:{"id": 100,"voltage":1.28}Ich möchte den Wert der Spannung in einen eigenen Datenpunkt schreiben.
Mein Blocklyversuch sieht jetzt so aus

Als Ausgabe bekomme ich leider nur folgendes: { val: undefined, ack: true }
Kenne mich da zu wenig aus, hat jemand eine Idee?
-
@paul53 funktioniert...manchmal ist es so einfach, vielen Dank!
Aber was genau ist der Unterschied?@hans_m sagte in JSON in Objekt/Datenpunkt umwandeln:
Aber was genau ist der Unterschied?
- @paul53 zeigt Dir, wie man mit dem Wert des triggernden Objektes arbeitet.
Der Trigger kennt den Wert bereits. Den nochmal irgendwo her zu lesen ist suboptimal und verschwendet Ressourcen. - Du prömpelst am Gesamtobjekt herum. Was Du aber brauchst, ist der "Wert" des Zustands vom Objekt.
Also nichtobj.voltage, sondernobj.state.val.voltage. Das wird klarer, wenn man sich das JS hinter dem Blockly ansieht.
on({ id: '0_userdata.0.test', change: 'ne' }, async (obj) => { spannung = getAttr(getObject('0_userdata.0.test'), 'voltage'); // Dein Konstrukt spannung = getAttr(obj.state.val, 'voltage'); // Paul's Lösung }); - @paul53 zeigt Dir, wie man mit dem Wert des triggernden Objektes arbeitet.
-
@hans_m sagte in JSON in Objekt/Datenpunkt umwandeln:
Aber was genau ist der Unterschied?
- @paul53 zeigt Dir, wie man mit dem Wert des triggernden Objektes arbeitet.
Der Trigger kennt den Wert bereits. Den nochmal irgendwo her zu lesen ist suboptimal und verschwendet Ressourcen. - Du prömpelst am Gesamtobjekt herum. Was Du aber brauchst, ist der "Wert" des Zustands vom Objekt.
Also nichtobj.voltage, sondernobj.state.val.voltage. Das wird klarer, wenn man sich das JS hinter dem Blockly ansieht.
on({ id: '0_userdata.0.test', change: 'ne' }, async (obj) => { spannung = getAttr(getObject('0_userdata.0.test'), 'voltage'); // Dein Konstrukt spannung = getAttr(obj.state.val, 'voltage'); // Paul's Lösung });@codierknecht verstanden...vielen Dank
- @paul53 zeigt Dir, wie man mit dem Wert des triggernden Objektes arbeitet.
-
@codierknecht verstanden...vielen Dank
Ich hätte da auch mal eine Frage.
Ich habe im DP folgende Werte für die Spannungswerte der einzelnen Zellen meines BKW Akkus.{"cells":[3.397,3.397,3.399,3.398,3.401,3.4,3.401,3.391,3.394,3.392,3.394,3.395,3.396,3.396],"min":3.391,"max":3.401,"avg":3.3965}Wie bekomme ich diese in einzelne DP um sie zu visualisieren?
Gruß 5tift
-
Ich hätte da auch mal eine Frage.
Ich habe im DP folgende Werte für die Spannungswerte der einzelnen Zellen meines BKW Akkus.{"cells":[3.397,3.397,3.399,3.398,3.401,3.4,3.401,3.391,3.394,3.392,3.394,3.395,3.396,3.396],"min":3.391,"max":3.401,"avg":3.3965}Wie bekomme ich diese in einzelne DP um sie zu visualisieren?
Gruß 5tift
@5tift mal als Anregung

statt debug in entsprechende Datenpunkte schreiben
-

Datenpunkte selber anlegen und Variable entsprechend ändern
-
@5tift sagte in JSON in Objekt/Datenpunkt umwandeln:
Wie bekomme ich diese in einzelne DP um sie zu visualisieren?
Entweder per Script, so wie @Homoran es zeigt, oder Du legst Dir für jede Zelle einen Alias an. Dann geht das auch ohne Script.
https://forum.iobroker.net/topic/70481/blockly-for-dummies-starthilfe-und-tipps/12Die Konvertierungen würden so aussehen:
JSON.parse(val).cells[0] JSON.parse(val).cells[1] JSON.parse(val).cells[2] ...
-
Hallo zusammen!
Es tut mir wirklich Leid, dass ich das hier nochmal ausgrabe. Trotz längerer Suche und grübeln, fällt mir mein Fehler nicht auf, wo es hakt.
Ich lege mir aktuell meine ALIAS etwas besser an.
Dabei habe ich auch mehrere Temperatursensoren an einem ESP WLAN Chip hängen, die ich per MQTT als JSON String reinbekomme (korrigiert meine Teminologie, falls falsch bezeichnet).
Zuvor hatte ich mir ein Blockly angelegt, das mir die Werte ein DPs in meinem User-Bereich reingespielt hat.
Welche ich dann den Alias-DPs zugewiesen habe.Aber da ich es gesehen, habe, dass es per Alias-Konvertierfunktion deutlich "schlanker" ginge, wollte ich es nun damit lösen,
aber bekomme es nicht hin speziell bei angeführtem MQTT-Datenpunkt.Wie bekomme ich z.B. von "DS18B20-1" den Wert von "Temperature" in meinen Alias-DP mit Typ Zahl und Rolle value.temperature?
Der MQTT-Datenpunkt sieht folgendermaßen aus:
Objekt
Inhalt des Objekts
Der Alias-Datenpunkt sieht folgendermaßen aus:
Objekt
Inhalt des Objekts
Meine Versuch der Alias-Konvertierung beim Lesen:
Ich schreibe rein -> JSON.parse(val).DS18B20-1.Temperature
Anmerkung:
Interessant ist er schreibt bei Zustand "State does not exist" // Wenn ich aber Temperature weg lasse, wertet er es offensichtlich aus, aber mit "null".DANKE VIELMALS schon vorab für den Denkanstoß.
-
Hallo zusammen!
Es tut mir wirklich Leid, dass ich das hier nochmal ausgrabe. Trotz längerer Suche und grübeln, fällt mir mein Fehler nicht auf, wo es hakt.
Ich lege mir aktuell meine ALIAS etwas besser an.
Dabei habe ich auch mehrere Temperatursensoren an einem ESP WLAN Chip hängen, die ich per MQTT als JSON String reinbekomme (korrigiert meine Teminologie, falls falsch bezeichnet).
Zuvor hatte ich mir ein Blockly angelegt, das mir die Werte ein DPs in meinem User-Bereich reingespielt hat.
Welche ich dann den Alias-DPs zugewiesen habe.Aber da ich es gesehen, habe, dass es per Alias-Konvertierfunktion deutlich "schlanker" ginge, wollte ich es nun damit lösen,
aber bekomme es nicht hin speziell bei angeführtem MQTT-Datenpunkt.Wie bekomme ich z.B. von "DS18B20-1" den Wert von "Temperature" in meinen Alias-DP mit Typ Zahl und Rolle value.temperature?
Der MQTT-Datenpunkt sieht folgendermaßen aus:
Objekt
Inhalt des Objekts
Der Alias-Datenpunkt sieht folgendermaßen aus:
Objekt
Inhalt des Objekts
Meine Versuch der Alias-Konvertierung beim Lesen:
Ich schreibe rein -> JSON.parse(val).DS18B20-1.Temperature
Anmerkung:
Interessant ist er schreibt bei Zustand "State does not exist" // Wenn ich aber Temperature weg lasse, wertet er es offensichtlich aus, aber mit "null".DANKE VIELMALS schon vorab für den Denkanstoß.
@Cyberraph sagte: JSON.parse(val).DS18B20-1.Temperature
Da "DS18B20-1" ein unzulässiges Zeichen (Minus) enthält, funktioniert es so nicht, sondern so:
JSON.parse(val)['DS18B20-1'].Temperature -
@Cyberraph sagte: JSON.parse(val).DS18B20-1.Temperature
Da "DS18B20-1" ein unzulässiges Zeichen (Minus) enthält, funktioniert es so nicht, sondern so:
JSON.parse(val)['DS18B20-1'].Temperature@paul53
Unglaublich, vielen Dank, das war es. Es zeigt im Dialog (zumindest über den Devices-Adapter) das Ergebnis vorab an.Ich hatte schon eine Vermutung, dass man den Bindestrich irgendwo "escapen" muss.
Hab auch schon gesehen, dass es unterschiedliche Schreibweisen gibt,
aber es mit einem längeren inkl. verschachteltem JSON nicht verstanden.
-> JSON.parse(val)['value']
-> JSON.parse(val).valueGesucht hätte ich zwar auch einschlägige Websites wie
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parseaber dort ist es für mich als Laien, der gar keinen Programmierhintergrund hat, meist nicht komplett verständlich
wie es z.B. hier im iobroker bei der Konvertierfunktion richtig geschrieben gehört,
da es auf jenen Websites wohl "voll ausgeschrieben" steht
und der iobroker diverse Dinge automatisch umwandelt und es somit nicht ganz ausgeschrieben gehört (so laienhaft interpretiert von mir).VIELEN VIELEN DANK, mein Problem ist jedenfalls gelöst. :-)



