NEWS
Konvertierung von Zeichenkette nach Zahl?
-
Moin,
beschäftige mich seit ein paar Tagen mit iobroker. Super Sache .
Nur leider kann ich nicht programmieren…
Ich bekomme eine Variable per MQTT. DIese sieht so aus:
{"Time":"2019-01-24T19:33:29","SML":{"Total_in":6001.0760,"Total_out":0.1580,"Power_curr":0}}
Wie man erkennen kann möchte ich baer zb. nur die 6001,0760 haben oder halt die Zeit oder halt die 0.1580. halt alles in extra Zahlen.
Ist das möglich wollte ungerne bei der anderen Seite was ändern.
Kann man das in IObroker "zerlegen"?
Danke für die Antworten!!!
-
Wo bekommst du die denn? Nutzt du den matt adapter?
-
sollte in etwa so gehen:
Wenn dein Objekt in der Variable inhalt ist:
{"Time":"2019-01-24T19:33:29","SML":{"Total_in":6001.0760,"Total_out":0.1580,"Power_curr":0}}
inhalt = JSON.parse(inhalt);
dann kannst du auf die einzelne Felder zugreifen:
var a = inhalt.Time;
var b = inhalt.SML.Total_in;
var c = inhalt.SML.Total_out;
var d = inhalt.SML.Power_curr;
-
und wie bekomme ich werd in neu erstellte Objekte?
-
und wie bekomme ich werd in neu erstellte Objekte? `
Verstehe ich nicht ganz. Du schreibst "Ich bekomme eine Variable per MQTT."
meinst du jetzt einen Datenpunkt, oder eine Variable. Falls du einen Datenpunkt hast dann kannst du es so machen
var inDP = "mqtt.0.........."; // Hier den Pfad zu deinem MQTT Datenpunkt angeben! var inhalt = getState(inDP).val; inhalt = JSON.parse(inhalt); var a = inhalt.Time; var b = inhalt.SML.Total_in; var c = inhalt.SML.Total_out; var d = inhalt.SML.Power_curr; log("Time = " + a); log("Total In = " + b); log("Total Out = " + c); log("Power = " + d);
-
wie bekomme ich werd in neu erstellte Objekte? `
Mit https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md#setstate; -
und wo werden die Werte dann ausgegeben?
Die Werte sind in Objekten. Kommen von einem esp8266 (sonoff firmware).
var inDP = "mqtt.0.tele.sonoff.SENSOR"; // Hier den Pfad zu deinem MQTT Datenpunkt angeben! var inhalt = getState(inDP).val; inhalt = JSON.parse(inhalt); var a = inhalt.Time; var b = inhalt.SML.Total_in; var c = inhalt.SML.Total_out; var d = inhalt.SML.Power_curr; log("Time = " + a); log("Total In = " + b); log("Total Out = " + c); log("Power = " + d);
ich hätte zb gerne: var b in ein neu erstellte Objekt-Id zb. "Zählerstand"(als Zahl)
-
und wo werden die Werte dann ausgegeben?
Die Werte sind in Objekten. Kommen von einem esp8266 (sonoff firmware).
var inDP = "mqtt.0.tele.sonoff.SENSOR"; // Hier den Pfad zu deinem MQTT Datenpunkt angeben! var inhalt = getState(inDP).val; inhalt = JSON.parse(inhalt); var a = inhalt.Time; var b = inhalt.SML.Total_in; var c = inhalt.SML.Total_out; var d = inhalt.SML.Power_curr; log("Time = " + a); log("Total In = " + b); log("Total Out = " + c); log("Power = " + d);
ich hätte zb gerne: var b in ein neu erstellte Objekt-Id zb. "Zählerstand"(als Zahl) `
var ZaehlerstandDP = "javascript.0.my.zaehlerstand"; // Dein ZielDatenpunkt setState(ZaehlerstandDP, b, true);
Vorher musst du vielleicht den Datenpunkt erstellen:
createState("javascript.0.my.zaehlerstand", 0, {type: 'number', read: 'true', write: 'true'});
-
lege den Datenpunkt manuell an unter Objekte
mqtt.0.tele.sonoff.zaelerstand als Typ Zahl
s. Zitat: Mit setState(id, wert, true); und deinem Wunsch für b
Mit setState('mqtt.0.tele.sonoff.zaelerstand', inhalt.SML.Total_in , true);
edit: ok warst schneller:
Ich würde den DP trotzdem lieber beim Gerät abspeichern, als Daten zu einem Gerät an zu vielen Stellen zu haben.
-
bekomme es nicht hin.Die Objekt-Id ist angelegt .
-
Du hast ZaehlerstandDP falsch definiert erstmal " und dann '
einfach "javascript.0.Zählerstand_Haus" ohne die ' und Kommentare!
oder noch einfacher:
setState("javascript.0.Zählerstand_Haus", b, true);
alternativ;
setState("javascript.0.Zählerstand_Haus", parseFloat(b), true);
Dann wird die Variable b nach Float umgewandelt, bevor sie geschrieben wird.
-
Du solltest mal genau hinsehen, was du als id eingetragen hast..
"'Xxxx kann nicht funktionieren. Da sind zu viele Anführungszeichen, sowohl oben als such unten.
Du kannst auch das sonoff Objekt erweitern mit extendObject
-
funktioniert.
Wird das denn auch aktualisiert wenn sich das "Hauptobjekt" per mqtt ändert?
nur passiert es manchmal das eine komische Zahl gelesen wird.
obwohl es im Objekt richtig steht
-
schön dass es jetzt klappt!
Um Blocky und js besser zu lernen habe ich mal versucht den Wert "Total_in" einzeln heraus zu kitzeln.
Kann mir wer sagen warum die slice()-Funktion nicht funktioniert von dem Blocklyscript?
! <xml 1999/xmlns="<URL url=" http:/www.w3.org/xhtml"="">http://www.w3.org/1999/xhtml">
! <block type="variables_set" id="J(;S,}.VY694q:bm7{RX" x="-87" y="13"><field name="VAR">MSG</field>
! <value name="VALUE"><block type="text" id="}QR6t|5yHFKulBE3MDg"><field name="TEXT">{"Time":"2019-01-24T19:33:29","SML":{"Total_in":6001.0760,"Total_out":0.1580,"Power_curr":0}}</field></block></value>
! <next><block type="variables_set" id="vu_7]U4wBf}NDqfu9k.;"><field name="VAR">Total_In_Anfang</field>
! <value name="VALUE"><block type="math_arithmetic" id="lZ*9j-Z7ry#|Dv@~qA@"><field name="OP">ADD</field> ! <value name="A"><shadow type="math_number" id="gt9WUG(t6ie[i0tKU2#{"><field name="NUM">1</field></shadow> ! <block type="text_indexOf" id="Fzr
9Z_.VcNYSKogLRSW"><field name="END">FIRST</field>
! <value name="VALUE"><block type="variables_get" id="Y0[TCzK(_u,bbEwq6zkY"><field name="VAR">MSG</field></block></value>
! <value name="FIND"><shadow type="text" id="USy|6K2qk[Fo[GSXW;Ni"><field name="TEXT">Total_in</field></shadow></value></block></value>
! <value name="B"><shadow type="math_number" id="6dYrhU.Q+JCq,BiN4
+"><field name="NUM">10</field></shadow></value></block></value>
! <next><block type="debug" id=".jvcF-W){%M[ioY}BX2s"><field name="Severity">log</field>
! <value name="TEXT"><shadow type="text" id="tl@EmOKRb!@{/qFiYavJ"><field name="TEXT">test</field></shadow>
! <block type="text_join" id="kDzGc/=@fs.;[1+x{W."><mutation items="2"></mutation>
! <value name="ADD0"><block type="text" id="0amyFZF@:-}un:C/}Ap9"><field name="TEXT">Total_in Anfang:</field></block></value>
! <value name="ADD1"><block type="variables_get" id=")#lY-5faPghWkOLQJOr}"><field name="VAR">Total_In_Anfang</field></block></value></block></value>
! <next><block type="variables_set" id="bH=X:.FnyZcLxbc4Gxu"><field name="VAR">MSG_temp</field>
! <value name="VALUE"><block type="text_getSubstring" id="b-}pQm]p1~{.+-n^z3w"><mutation at1="true" at2="true"></mutation>
! <field name="WHERE1">FROM_START</field>
! <field name="WHERE2">FROM_START</field>
! <value name="STRING"><block type="variables_get" id="I6Dj7iz4mGByHiGof]"><field name="VAR">MSG</field></block></value>
! <value name="AT1"><block type="variables_get" id="BTh9Y{g4GxjmywWlS?S_"><field name="VAR">Total_In_Anfang</field></block></value>
! <value name="AT2"><block type="text_length" id="3yNvV@(z!V2eu[PGJkV"><value name="VALUE"><shadow type="text" id="jEc3oYD0^{g~aWOoiyd"><field name="TEXT">abc</field></shadow> ! <block type="variables_get" id="ERMT^T1e-_Z2qF~^asqR"><field name="VAR">MSG</field></block></value></block></value></block></value> ! <next><block type="debug" id="n^a!SA,R;N2mtW%Y!FGx"><field name="Severity">log</field> ! <value name="TEXT"><shadow type="text" id="tl@EmOKRb!@{/qFiYavJ"><field name="TEXT">test</field></shadow> ! <block type="text_join" id="*^t{*5(L{8P0_0OLX=[J"><mutation items="2"></mutation> ! <value name="ADD0"><block type="text" id="2YcYNZt}@JVua}qe:[H!"><field name="TEXT">msg_temp:</field></block></value> ! <value name="ADD1"><block type="variables_get" id="l]^}U=9nv}H2=4
j0ZYE"><field name="VAR">MSG_temp</field></block></value></block></value>
! <next><block type="variables_set" id="3T;;^[khXtinCJMhQ7A"><field name="VAR">Total_In_Ende</field>
! <value name="VALUE"><block type="math_arithmetic" id="Y)|^oQ}myYr9z2{Y=Ac"><field name="OP">MINUS</field> ! <value name="A"><shadow type="math_number" id="gt9WUG(t6ie[i0tKU2#{"><field name="NUM">1</field></shadow> ! <block type="text_indexOf" id="[}N#SvlV
d/Wn%4UPRAk"><field name="END">FIRST</field>
! <value name="VALUE"><block type="variables_get" id="VL9+#!QZjT6J^R+ieH+?"><field name="VAR">MSG_temp</field></block></value>
! <value name="FIND"><shadow type="text" id="y0~a)00,%78~dWt|WF+"><field name="TEXT">,</field></shadow></value></block></value>
! <value name="B"><shadow type="math_number" id="Y4=}S=KwfSy)mx:f*O^c"><field name="NUM">1</field></shadow></value></block></value>
! <next><block type="debug" id="uetZ4+!2o~l/MYdRS]I["><field name="Severity">log</field>
! <value name="TEXT"><shadow type="text" id="tl@EmOKRb!@{/qFiYavJ"><field name="TEXT">test</field></shadow>
! <block type="text_join" id="|(w.-P{}EP,Xg8u+^pFq"><mutation items="3"></mutation>
! <value name="ADD0"><block type="text" id="O#T[mg/@6]x24Q
AS;3"><field name="TEXT">total_in_ende:</field></block></value>
! <value name="ADD1"><block type="variables_get" id="g1Xk|JjJx0?Ed2oYvS?w"><field name="VAR">Total_In_Ende</field></block></value>
! <value name="ADD2"><block type="variables_get" id="D13lawug2;^NsIx?u{1)"><field name="VAR">MSG</field></block></value></block></value>
! <next><block type="variables_set" id="?1PY=A6,Fyz{*a(Vjs}^"><field name="VAR">Total_In</field>
! <value name="VALUE"><block type="convert_tonumber" id="o#N2EfkR^+A(|sMZ60Bv"><value name="VALUE"><block type="text_getSubstring" id="xnDhP9V_E^BDu|!q{0M~"><mutation at1="true" at2="true"></mutation>
! <field name="WHERE1">FROM_START</field>
! <field name="WHERE2">FROM_START</field>
! <value name="STRING"><block type="variables_get" id="+E|jMCP+AJt}Nw9(c~A"><field name="VAR">MSG</field></block></value>
! <value name="AT1"><block type="variables_get" id="Nk,YVt?R5vJC2%!ZSdZ"><field name="VAR">Total_In_Anfang</field></block></value> ! <value name="AT2"><block type="variables_get" id="#lv!hlG8nsJdB
a;SUb"><field name="VAR">Total_In_Ende</field></block></value></block></value></block></value> ! <next><block type="debug" id=";6
og#CF0)(]Rxuv1dfW"><field name="Severity">log</field>
! <value name="TEXT"><shadow type="text" id="tl@EmOKRb!@{/qFiYavJ"><field name="TEXT">test</field></shadow>
! <block type="text_join" id="KR=dUtSffy=D:}Gq8]dr"><mutation items="2"></mutation>
! <value name="ADD0"><block type="text" id="1kBDH/HP.tjPp4A._OC2"><field name="TEXT">Total_in ist:</field></block></value>
! <value name="ADD1"><block type="variables_get" id="v6Qt]msR*tM.@f1~Ozk4"><field name="VAR">Total_In</field></block></value></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></xml> -
nein, wird nicht aktualisiert.
dafür musste du folgendes eintragen:
on({id: "mqtt.0.tele.sonoff.SENSOR", change: "ne"}, function (obj) { inhalt = JSON.parse(getState(id).val); setState("javascript.0.Zählerstand_Haus", parseFloat(inhalt.SML.Total_in), true); });
jetzt wird, bei der Änderung des "mqtt.0.tele.sonoff.SENSOR" der Datenpunkt ausgelesen, verarbeitet und der Total_in Wert wird in "javascript.0.Zählerstand_Haus" geschrieben.
Ist das das, was du willst?
-
teste ich.
-
ja nur mit diesen einen Satz macht IObroker das was ich möchte. Mehr steht jetzt nicht mehr im Script.
Leider mit falschen Zahlen siehe oben.
Die Aktualisierung erfolgt sofort.
in der Ojekt ID der per MQTT kommt steht das in der Beschreibung:
Zeichenkette
{
"sql.0": {
"enabled": true,
"changesOnly": true,
"debounce": 0,
"maxLength": 10,
"retention": "63072000",
"changesRelogInterval": 0,
"changesMinDelta": 0,
"storageType": "",
"aliasId": "StromzählerHaus"
}
}
-
hast du noch eine Quelle, die da rein schreibt. wie man sieht sind die "fremden" Einträge mit Ack False, während unsere true sind.
Die Quelle ist javascript, Also denke ich, dass du noch ein Skript am Laufen hast, das dir dort die Werte einfügt. Prüfe das mal.
bis morgen.
ps. kann es sein, dass in dem mqtt-Objekt mehrere Einträge mit "Total_in" gibt. Dann musst du [0] einfügen.
setState("javascript.0.Zählerstand_Haus", parseFloat(inhalt.SML.Total_in[0]), true);
oder mehrere SML Blöcke, dann;
setState("javascript.0.Zählerstand_Haus", parseFloat(inhalt.SML[0].Total_in), true);
Schick mir den gesamten Inhalt des MQTT-Datenpunktes.
-
Du hattest recht da hat was anderes reingeschrieben war aber mein Fehler beim kopieren….
Das Skript sieht jetzt so aus
var inDP = "mqtt.0.tele.sonoff.SENSOR"; // Hier den Pfad zu deinem MQTT Datenpunkt angeben!
var inhalt = getState(inDP).val;
inhalt = JSON.parse(inhalt);
var a = inhalt.Time;
var b = inhalt.SML.Total_in;
var c = inhalt.SML.Total_out;
var d = inhalt.SML.Power_curr;
log("Time = " + a);
log("Total In = " + b);
log("Total Out = " + c);
log("Power = " + d);
var ZaehlerstandDP = "javascript.0.Zählerstand_Haus"; // Dein ZielDatenpunkt
setState(ZaehlerstandDP, b, true);
var ZaehlerstandDP = "javascript.0.Zählerstand_PV"; // Dein ZielDatenpunkt
setState(ZaehlerstandDP, c, true);
on({id: "mqtt.0.tele.sonoff.SENSOR", change: "ne"}, function (obj) {
inhalt = JSON.parse(getState(id).val);
setState("javascript.0.Zählerstand_Haus", parseFloat(inhalt.SML.Total_in), true);
});
leider wird aes immer nur einmal abgearbeitet… nur wenn ich das script neu starte.
-
Du hattest recht da hat was anderes reingeschrieben war aber mein Fehler beim kopieren….
Das Skript sieht jetzt so aus
var inDP = "mqtt.0.tele.sonoff.SENSOR"; // Hier den Pfad zu deinem MQTT Datenpunkt angeben!
var inhalt = getState(inDP).val;
inhalt = JSON.parse(inhalt);
var a = inhalt.Time;
var b = inhalt.SML.Total_in;
var c = inhalt.SML.Total_out;
var d = inhalt.SML.Power_curr;
log("Time = " + a);
log("Total In = " + b);
log("Total Out = " + c);
log("Power = " + d);
var ZaehlerstandDP = "javascript.0.Zählerstand_Haus"; // Dein ZielDatenpunkt
setState(ZaehlerstandDP, b, true);
var ZaehlerstandDP = "javascript.0.Zählerstand_PV"; // Dein ZielDatenpunkt
setState(ZaehlerstandDP, c, true);
on({id: "mqtt.0.tele.sonoff.SENSOR", change: "ne"}, function (obj) {
inhalt = JSON.parse(getState(id).val);
setState("javascript.0.Zählerstand_Haus", parseFloat(inhalt.SML.Total_in), true);
}); `
leider wird aes immer nur einmal abgearbeitet… nur wenn ich das script neu starte.
mach folgendes:
on({id: "mqtt.0.tele.sonoff.SENSOR", change: "ne"}, function (obj) { inhalt = JSON.parse(getState(id).val); setState("javascript.0.Zählerstand_Haus", parseFloat(inhalt.SML.Total_in), true); setState("javascript.0.Zählerstand_PV", parseFloat(inhalt.SML.Total_Out), true); });
mehr brauchst du nicht. Mit deinem Skript hast du die beide Werte mehrmals in den Datenpunkt geschrieben. Wenn das nicht hilft, dann brauche ich einen kompletten Eintrag aus mqtt.0.tele.sonoff.SENSOR um die Datenstruktur zu sehen.