NEWS
Mqtt: String in Datenpunkte umwandeln?
-
Das müsse etwa so funktionieren per Javascript:
var obj = JSON.parse(getState('mqtt.0.bruh.sensornode1').val); setState(idState, obj.state, true); setState(idRot, obj.color.r, true); setState(idGruen, obj.color.g, true); setState(idBlau, obj.color.b, true); setState(idHell, obj.brightness, true); setState(idFeuchte, obj.humidity, true); setState(idBeweg, ovj.motion, true); setState(idTemp, obj.temperature, true); setState(idHeiz, obj.heatindex, true); ```` `
Besten Dank für den Lösungsansatz!
Also einfach im Reiter „Skripte“ unter „common“ ein neues Script erstellen und diese Zeilen einfügen? Sorry, wenn ich so blöd frage, aber ich bin auf diesem Gebiet absoluter Neuling.
-
Also einfach im Reiter „Skripte“ unter „common“ ein neues Script erstellen und diese Zeilen einfügen? `
Nein, das zeigt nur das Prinzip, wie man die einzelnen Werte aus dem JSON-String in Datenpunkte schreibt. Die Datenpunkte müssen erst erstellt werden, am Besten im Reiter "Objekte" unter javascript.0. Als Beispiel der Datenpunkt für Rot:Name: 'Bruh.Farbe.Rot'
Typ: Zahl
` > role: valueread: anhaken (true)
write: anhaken (true)
min: 0
max: 255
unit: (leer) `
Dann im Skript die symbolischen ID-Bezeichnungen durch die tatasächliche ID ersetzen. Dabei hilft der Button "ID einfügen" (rechts oben).function setDps() { var obj = JSON.parse(getState('mqtt.0.bruh.sensornode1').val); if(obj.state == "OFF") setState('javascript.0.Bruh.Ein', false, true); // DP-Typ: Logikwert else setState('javascript.0.Bruh.Ein', true, true); setState('javascript.0.Bruh.Farbe.Rot', obj.color.r, true); // DP-Typ: Zahl setState('javascript.0.Bruh.Farbe.Gruen', obj.color.g, true); // DP-Typ: Zahl // usw. setState(idBlau, obj.color.b, true); // DP-Typ: Zahl setState(idHell, obj.brightness, true); // DP-Typ: Zahl setState(idFeuchte, parseFloat(obj.humidity), true); // DP-Typ: Zahl setState(idBeweg, obj.motion, true); // DP-Typ: Zeichenkette setState(idTemp, parseFloat(obj.temperature), true); // DP-Typ: Zahl setState(idHeiz, parseFloat(obj.heatindex), true); // DP-Typ: Zahl } setDps(); // Skriptstart on('mqtt.0.bruh.sensornode1', setDps); // Triggert bei jeder Inhaltsänderung des JSON-Strings
-
Hallo Paul!
Vielen, vielen Dank!!!!
Mein stundenlanges Brüten ohne verwertbares Resultat hat dein Script nun beendet. Ich habe wie von dir gezeigt, neue Datenpunkte angelegt und das Script folgend angepasst:
function setDps() {
var obj = JSON.parse(getState('mqtt.0.bruh.sensornode1').val);
if(obj.state == "OFF") setState('javascript.0.Bruh.Ein', false, true); // DP-Typ: Logikwert
else setState('javascript.0.Bruh.Ein', true, true);
setState('javascript.0.Bruh.Farbe.Rot', obj.color.r, true); // DP-Typ: Zahl
setState('javascript.0.Bruh.Farbe.Gruen', obj.color.g, true); // DP-Typ: Zahl
// usw.
setState("javascript.0.Bruh.Farbe.Blau"/Bruh.Farbe.Blau/, obj.color.b, true); // DP-Typ: Zahl
setState("javascript.0.Bruh.Sensor.Helligkeit"/Bruh.Sensor.Helligkeit/, obj.brightness, true); // DP-Typ: Zahl
setState("javascript.0.Bruh.Sensor.Feuchte"/Bruh.Sensor.Feuchte/, parseFloat(obj.humidity), true); // DP-Typ: Zahl
setState("javascript.0.Bruh.Sensor.Bewegung"/Bruh.Sensor.Bewegung/, obj.motion, true); // DP-Typ: Zeichenkette
setState("javascript.0.Bruh.Sensor.Temperatur"/Bruh.Sensor.Temperatur/, parseFloat(obj.temperature), true); // DP-Typ: Zahl
setState("javascript.0.Bruh.Sensor.Waermeindex"/Bruh.Sensor.Waermeindex/, parseFloat(obj.heatindex), true); // DP-Typ: Zahl
}
setDps(); // Skriptstart
on('mqtt.0.bruh.sensornode1', setDps); // Triggert bei jeder Inhaltsänderung des JSON-Strings
Ich bekomme zwar am Wärmeindex eine "0" geliefert, aber diesen Wert benötige ich eigentlich nicht.
Die relevanten Werte von Bewegung, Feuchtigkeit und Temperatur werden geliefert. Da ich auf den Lichtsensor noch warte, kann da noch kein vernünftiger Wert drin stehen.
Drei Fragen hätte ich noch:
1. Ist es möglich, dass der Temperaturwert in Celsius angezeigt wird?
2. Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, wenn der Bewegungssensor auf "motion detected" schaltet?
3. Mein log ist voll mit:
javascript.0 2018-01-28 15:35:19.441 warn at Object.setDps (script.js.common.Sensoren_auslesen:3:26)
javascript.0 2018-01-28 15:35:19.439 warn State "javascript.0.Bruh.Ein" not found
javascript.0 2018-01-28 15:34:56.985 warn at Object.setDps (script.js.common.Sensoren_auslesen:3:26)
javascript.0 2018-01-28 15:34:56.984 warn State "javascript.0.Bruh.Ein" not found
Hat das damit zu tun, dass der Lichtsensor noch nicht angeschlossen ist?
Jedenfalls nochmals vielen Dank für deine Hilfe!
LG
wolf
5573_datenpunkte.jpg -
1. Ist es möglich, dass der Temperaturwert in Celsius angezeigt wird? `
Wie wird der wert jetzt angezeigt ? Wenn in Fahrenheit, muss man umrechnen.setState("javascript.0.Bruh.Sensor.Temperatur"/*Bruh.Sensor.Temperatur*/, (parseFloat(obj.temperature) - 32) / 1.8, true);
2. Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, wenn der Bewegungssensor auf "motion detected" schaltet? `
Welche LED ? Bisher werden nur Werte eingelesen.
@wolf:javascript.0 2018-01-28 15:35:19.439 warn State "javascript.0.Bruh.Ein" not found `
Der Datenpunkt "javascript.0.Bruh.Ein" vom Typ Logikwert, der anzeigt, ob das Gerät eingeschaltet ist, fehlt noch. -
Danke für das learning by doing Tutorial von dir…
1. Ist es möglich, dass der Temperaturwert in Celsius angezeigt wird?
Wie wird der wert jetzt angezeigt ? Wenn in Fahrenheit, muss man umrechnen.
setState("javascript.0.Bruh.Sensor.Temperatur"/*Bruh.Sensor.Temperatur*/, (parseFloat(obj.temperature) - 32) / 1.8, true); ```` `
Ja, wurde in Fahrenheit angezeigt. Hab deinen Code eingefügt und er zeigt die Grade in Celsius an… Wieder Danke!
2. Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, wenn der Bewegungssensor auf "motion detected" schaltet? `
Welche LED ? Bisher werden nur Werte eingelesen.Tja, die LED, für die die RGB-Werte übernommen werden (hab ich zumindest angenommen). Ich weiß schon, dass du eine profundere Antwort erwartet hast, die ich dir aber mangels Wissen leider nicht liefern kann.
javascript.0 2018-01-28 15:35:19.439 warn State "javascript.0.Bruh.Ein" not found
Der Datenpunkt "javascript.0.Bruh.Ein" vom Typ Logikwert, der anzeigt, ob das Gerät eingeschaltet ist, fehlt noch.
Hab jetzt den Datenpunkt "javascript.0.Bruh.Ein" angelegt (ist mir jetzt erst im Script aufgefallen). Jetzt kommt kein "warn" mehr im Log. Er hat aber immer den Wert "false". Wozu ist der eigentlich?
-
Wozu ist der eigentlich? `
Da er die erste Objekteigenschaft ("state":"OFF") abbildet, vermute ich Gerät Aus/Ein ?
@wolf:Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, `
Du kannst mal versuchen, im Reiter "Objekte" direkt im Datenpunkt 'mqtt.0.bruh.sensornode1' den JSON-String zu verändern:Hinter "g":255 –> 0 und hinter "b":255 --> 0. Tut sich dann was ?
-
Wozu ist der eigentlich? `
Da er die erste Objekteigenschaft ("state":"OFF") abbildet, vermute ich Gerät Aus/Ein ?
@wolf:Wie kann ich der LED einen anderen Wert übermitteln, so dass sie beispielweise rot leuchtet, `
Du kannst mal versuchen, im Reiter "Objekte" direkt im Datenpunkt 'mqtt.0.bruh.sensornode1' den JSON-String zu verändern:Hinter "g":255 –> 0 und hinter "b":255 --> 0. Tut sich dann was ? `
Nein, die LED leuchtet unverändert blau, egal was ich eintrage…
Ach ja, etwas ist mir aufgefallen... Die Temperatur wird mir mit vielen Kommastellen angezeigt: 24.89999999999999. Gibt's eine Möglichkeit, dass nur 2 Kommastellen gezeigt werden... Nur ganze Zahlenwerte wären auch ok...
-
Gibt's eine Möglichkeit, dass nur 2 Kommastellen gezeigt werden… Nur ganze Zahlenwerte wären auch ok... `
Ja, natürlich. Aber langsam wird der Ausdruck unübersichtlich.setState("javascript.0.Bruh.Sensor.Temperatur", Math.round((parseFloat(obj.temperature) - 32) / 0.18) / 10, true);
rundet auf eine Nachkommastelle.
-
Nein, die LED leuchtet unverändert blau, egal was ich eintrage… `
Das hatte ich vermutet: Wenn die Kommunikation über JSON erfolgt, dann meist nur in eine Richtung. -
Nein, die LED leuchtet unverändert blau, egal was ich eintrage…
Das hatte ich vermutet: Wenn die Kommunikation über JSON erfolgt, dann meist nur in eine Richtung.
Nicht wirklich tragisch, wäre nur ein netter Mehrwert gewesen.
Wäre dieses Script eigentlich auch unter Blockly zu realisieren gewesen? Damit konnte ich schon ein paar vernünftige Ergebnisse erzielen, wenn es um die Abfrage von Schaltzuständen gegangen ist. Hat für einen Anfänger wie mich den Vorteil, dass man die ganze Befehlssyntax nicht kennen muss. Gibt es eigentlich ein Programm, das den Code des Scriptes in Blockly Struktur darstellt? Würde mir das Lernen erleichtern.
Jedenfalls nochmals Danke für deine Hilfe! Du hast mir wirklich sehr geholfen.
LG
Wolf