NEWS
Wie Werte in eine Blockly Funktion übergeben?
-
Ich versuche mich gerade weiter in Javascript hereinzuknien (natürlich mithilfe von Blockly)
Habe schon schmerzlich einen "Parser Block" so wie: [parse (TEXT) mit RegEx() an Pos()] vermisst, aber geht nicht gibt's nicht.
Da es bei mir immer nach "geht nicht gibt's nicht" läuft habe ich hier ein ziemlich aufwändiges Konstrukt gebastelt:
https://forum.iobroker.net/assets/uploads/files/1577838362266-sensemap-blockly.txtoder hier als js-Export:
Jetzt wollte ich das Ganze mittels (mir noch unbekannten) Funktionen und später mit Erstellen und befüllen der Datenpunkte vereinfachen.
Aber bei den Funktionen bin ich anscheinend schon gescheitert
Meine Idee war statt der vielen Variablen einfach nur einen Satz zu nehmen, den in einer Schleife zu befüllen und die Ergebnisse in einen Datenpunkt zu schreiben, der sich zum einen aus den Variablen zusammensettzt und zum anderen den Wert und die Einheit enthält.Dies bedingt aber, dass Teile des Scripts erst ablaufen müssen um Variablen zu befüllen, bevor ich diese in der Funktion benutzen kann.
Geht so etwas überhaupt?
Zumindest lässt sich der Block zur Erstellung der Funktion nicht in den Fluß einbinden.
Klar - Funktionen und Variablen werden ja vorab deklariert. -
@Homoran
Die Funktion muss innerhalb der Callback-Funktion von request() aufgerufen werden, nachdem die auszuwertende Variable befüllt ist.Ein JSON wertet man nicht mittels String-Operationen aus, sondern wandelt es in ein Objekt und greift auf die Attribute des Objektes zu. Vorher sollte man sich die Struktur des Objektes in einem JSON-Viewer anschauen.
-
@paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:
Ein JSON wertet man nicht mittels String-Operationen aus
War mir klar dass das als erstes kommt
Aber eins nach dem anderen - Rom ist auch nicht an einem Tag erbaut worden.Und bei anderen Rückgaben kommt vielleicht ein html oder plain text.
@paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:
Vorher sollte man sich die Struktur des Objektes in einem JSON-Viewer anschauen.
Das habe ich gerade getan, als du den Link in einem anderen Thread gepostet hattest.
Aber wirklich geholfen hatte mir das (noch) nichts.@paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:
Die Funktion muss innerhalb der Callback-Funktion von request() aufgerufen werden, nachdem die auszuwertende Variable befüllt ist.
klingt gut - und was heißt das?
geht das mit Blockly? -
@paul53
Hat länger gedauert vom Lesen bis zum Verstehen, was du da geschrieben hastDANKE mal wieder - läuft!
Aber Verdauen muss ich das jetzt doch, warum es so funktioniert
-
@Homoran
Prinzip mit Wandlung nach Objekt:
Ist das Objekt ein Array von Sensoren ? -
@paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:
Ist das Objekt ein Array von Sensoren ?
Ja, das sehe ich mir gerne später an - versprochen!
Momentan hänge ich noch am setState
Kann man da variabel den Datenpunkt-Namen erzeugen?
-
@Homoran sagte:
Kann man da variabel den Datenpunkt-Namen erzeugen?
Leider nicht. Dazu brauchst Du eine Javascript-Funktion mit den Parametern id, unit:
createState(id, 0, {type:'number', unit:unit, read:true, write:false, role:'value'});
Der Block "schreibe" kann eine zusammengesetzte ID verwenden.
-
@paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:
Der Block "schreibe" kann eine zusammengesetzte ID verwenden.
Ich denke bei schreibe bekomme ich es hin, aber da meckert er, dass der Pfad nicht existiert
Ansonsten hat DSLRaser gerade in einem anderen Thread eine Funktion gezeigt, da muss es dann allerdings mit genuine js erstellt werden
-
@Homoran sagte:
ch denke bei schreibe bekomme ich es hin, aber da meckert er, dass der Pfad nicht existiert
Block "schreibe" setzt nur einen Wert in einen bereits existierenden Datenpunkt. Deshalb benötigst Du zum Erzeugen der DP die Javascript-Funktion.
-
@paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:
@Homoran sagte:
ch denke bei schreibe bekomme ich es hin, aber da meckert er, dass der Pfad nicht existiert
Block "schreibe" setzt nur einen Wert in einen bereits existierenden Datenpunkt. Deshalb benötigst Du zum Erzeugen der DP die Javascript-Funktion.
Genau so hatte ich es mir gedacht.
Also folgendes Spiel:
Eine Funktion
createState(Pfad, 0, {type:'number', unit:Unit1, read:true, write:false, role:'value'});
in der Funktion, dann der Schreibe BlockDas klappt auch fast, nur die Bezeichnung rel. Luftfeuchte zerstört die Struktur wegen des Punkts.
Das muss ich noch irgendwie abfangen.Dass Temperatur und Feuchte unter einem Sensor liegen ist gar nicht so schlimm.
Oder ich muss den Pfad umbauen.mal sehen
Danke soweit