NEWS
[gelöst]Problem bei Übergabe per Script !Anfänger!
-
Hallo Leute,
ich versuche mich gerade ein bischen im Script schreiben, aber leider klappt es nicht so wie ich es mir vorgestellt habe.
Vorab was geplant ist:
Ich übergebe an einen Datenpunkt (javascript.0.Wohnzimmer.Couch_Links) z.B. den Wert: 201006500Nun soll das Script daraus die letzten 4 Ziffern (im Beispiel 6500) in eine Variable (ct) packen und die Ziffern 3-5 (im Beispiel 100) in eine weitere Variable (level).
Das funktioniert auch so soweit.Dann übergebe ich die Variablen an 2 States einer Lampe die ich über deconz eingebunden habe.
Das scheint auch zu funktionieren, aber nur augenscheinlich. Da nämlich, wenn der Wert level sich ändert sollte sich auch der Wert bri ändern.
Wenn ich den level Wert händisch ändere klappt es, wenn ich es aus dem Script heraus mache nicht. Leider weiss ich nicht warum!Hier das Script:
on({id: 'javascript.0.Wohnzimmer.Couch_Links', change: "ne"}, function (obj){ var value = obj.state.val; var oldvalue = obj.oldState.val; var Lichtwert = String(getState("javascript.0.Wohnzimmer.Couch_Links").val); var ct = Math.round(1000000/Lichtwert.substr(5)); var Helligkeit = Lichtwert.substr(2,3); if (Helligkeit === 0) { setState("deconz.0.Lights.4.on",false); } else { setState("deconz.0.Lights.4.level",Helligkeit); setState("deconz.0.Lights.4.ct",ct); setState("deconz.0.Lights.4.on",true); } });
-
@torsten_mg Deine Variable Helligkeit ist ein String, evtl. musst du den noch in eine Zahl umwandeln
-
@fastfoot sagte: Deine Variable Helligkeit ist ein String
... ebenfalls die Variable Lichtwert.
var ct = Math.round(1000000/parseInt(Lichtwert.substr(5))); var Helligkeit = parseInt(Lichtwert.substr(2,3));
-
@paul53 sagte in Problem bei Übergabe per Script !Anfänger!:
... ebenfalls die Variable Lichtwert.
die muss ja ein String sein. Für die Berechnung von ct braucht es mE die Konvertierung mit parseInt() nicht. Eine Lösung hatte ich nicht angegeben weil ich irgendwie denke dass der TE Blockly verwendet
-
@fastfoot sagte: Für die Berechnung von ct braucht es mE die Konvertierung mit parseInt() nicht.
Stimmt, Javascript macht eine implizite Typwandlung nach Zahl.
-
Danke, das wars!!
Habe die Zeile
var Helligkeit = parseInt(Lichtwert.substr(2,3));
angepasst, jetzt klappts
-
@fastfoot sagte in Problem bei Übergabe per Script !Anfänger!:
@paul53 sagte in Problem bei Übergabe per Script !Anfänger!:
... ebenfalls die Variable Lichtwert.
die muss ja ein String sein. Für die Berechnung von ct braucht es mE die Konvertierung mit parseInt() nicht. Eine Lösung hatte ich nicht angegeben weil ich irgendwie denke dass der TE Blockly verwendet
Nein, kein Blockly!
Javascript. Bin aber noch im Anfängerstadium! -
@torsten_mg sagte: Nein, kein Blockly!
Du hattest aber mit Blockly begonnen, wie man an den Zeilen 2 bis 4 sieht.
-
@torsten_mg sagte in Problem bei Übergabe per Script !Anfänger!:
Nein, kein Blockly!
Javascript. Bin aber noch im Anfängerstadium!das sieht man, aber ich habe auch mal so angefangen. Noch ein Tipp: Du musst den Wert nicht noch einmal holen, da er bereits im Trigger mit übergeben wird.
- schmeiss Zeile 3 und 4 weg
- Ändere Zeile 5 zu
var Lichtwert = String(obj.state.val);
Ändere bitte noch deinen Betreff im ersten Beitrag mit [Gelöst]....
-
-
@ahnungsbefreit sagte: Bin ich eigentlich der Einzige, immer mit "use strict" arbeitet und VAR vermeidet und lieber mit LET und CONST arbeitet?
Nein.
-
@paul53 Danke für die ausführliche Antwort
Was würdest Du als der Script-Guru hier im Forum denn empfehlen?
-
@ahnungsbefreit sagte in [gelöst]Problem bei Übergabe per Script !Anfänger!:
@fastfoot @paul53 ...wo Ihr gerade über JS Optimierung redet: Bin ich eigentlich der Einzige, immer mit "use strict" arbeitet und VAR vermeidet und lieber mit LET und CONST arbeitet?
'use strict' sehe ich hier ganz selten, habe auch noch nicht ganz verstanden wozu es gut ist und verwende es fast nie. schäm....
var meide ich gewöhnlich wie der Teufel das Weihwasser, allerdings habe ich mir mit JS angewöhnt meine Variablen auch oft mitten im Code zu deklarieren anstatt zu Beginn einer Funktion. Da streite ich mich immer noch mit mir selbst ob das gut oder böse ist
-
@fastfoot Naja es zwingt Dich, Variablen immer vor der Benutzung zu deklarieren und das hilft ungemein, um Tippfehler zu finden. Und bei const/let ist der Scope (Gültigkeitsbereich) auf den Block limitiert, in der sie deklariert werden und ist daher gerade für Variablen hilfreich, die Du nur in einem kleinen Teilbereich wie z.B. innerhalb einer Schleife oder eines if...else... Statements brauchst. Mit Var ist der Scope nicht beschränkt.
-
@fastfoot sagte: 'use strict' sehe ich hier ganz selten... und verwende es fast nie.
Geht mir ebenfalls so, wobei "use strict" hilft, Fehler nicht erst zur Laufzeit des Skripts zu erkennen.
Wenn möglich, verwende ich const. Für lokale Variablen verwende ich let, für globale Variablen var, wobei es an der Stelle eher eine Kommentarfunktion, als ein Unterschied zu let ist. -
@ahnungsbefreit sagte: Mit Var ist der Scope nicht beschränkt.
Das stimmt so nicht: Eine innerhalb einer Funktion mit var deklarierte Variable ist nur innerhalb der Funktion gültig.
Wichtiger Unterschied zu const / let: Die Deklaration mit var kann auch nach Verwendung der Variablen erfolgen, was man aber generell vermeiden sollte. -
@paul53 said in [gelöst]Problem bei Übergabe per Script !Anfänger!:
Eine innerhalb einer Funktion mit var deklarierte Variable ist nur innerhalb der Funktion gültig.
Ja, das schon. Aber Beschränkung der Gültigkeit auf untergeordnete Blöcke wie Schleifen oder sonst alles, was in {Klammern} steht, geht mit var überhaupt nicht.
Ok, um diese Off-Topic Diskussion nicht zu lange werden zu lassen: Danke für Eure Antworten, Ihr habt mich eigentlich in meiner Haltung bestätigt, weiterhin 'use strict' zu verwenden und 'var' zu vermeiden.