NEWS
[Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt
-
@paul53 Ok. Das könnte ich einmal versuchen.
-
@care72 Vorschlag:
-
Danke! Ich werde es versuchen wobei ich ehrlich gesagt die Logik mit Wert und den Variablen noch nicht verstehe. Stehe mit Blockly erst am Anfang.
-
@care72 sagte in Frage zu Blockly ? Lichtsteuerung über Türkontakt:
die Logik mit Wert und den Variablen noch nicht verstehe.
draussen ist eine Variable. Wert ist eine Eigenschaft des Trigger-Datenpunktes (unter Blöcke Trigger), die den Wert des Datenpunktes enthält. Leider haben beide die gleiche Farbe.
-
Danke paul53!
Es funktioniert. Auch wenn ich es im Moment noch nicht so ganz verstehe.
-
Wenn ich das obere Blockly inhaltlich verstehe, dann glaube ich, bin ich ein ganzes Stückchen weiter in meiner Lernkurve.
Was genau wird da gemacht? Es wird abgefragt, ob der Türsensorwert sich geändert hat und anschließend wird egal welchen Wert er angenommen hat was gemacht? @paul53 kannst Du das mal aufdröseln? Ich würde wahnsinnig gerne weiter davon lernen, verstehe nur die Syntax überhaupt nicht und kann mir grad kein Bild im Kopf basteln, was er mit der VAriablen "draussen" macht und welchen Wert er ihr verpasst, bzw. wie das hinterher nach zweimaligem Tür auf/zu dazu führt, dass das Licht wieder ausgeht.
-
@mehrwiedu
Bei Skriptstart wird die Variable draussen deklariert und ist erst einmal undefined.falls Wert prüft, ob die Tür offen (true) ist. Wenn ja, wird das Licht eingeschaltet.
sonst bedeutet: Die Tür wird geschlossen (Wert = false).falls draussen prüft, ob die Variable draussen wahr (true) ist. Wenn ja, wird das Licht ausgeschaltet.
Anschließend wird die Variable draussen negiert (false/undefined --> true, true --> false). -
@paul53 sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
@mehrwiedu
Bei Skriptstart wird die Variable draussen deklariert und ist erst einmal undefined.falls Wert prüft, ob die Tür offen (true) ist. Wenn ja, wird das Licht eingeschaltet.
sonst bedeutet: Die Tür wird geschlossen (Wert = false).falls draussen prüft, ob die Variable draussen wahr (true) ist. Wenn ja, wird das Licht ausgeschaltet.
Anschließend wird die Variable draussen negiert (false/undefined --> true, true --> false).Danke für die Antwort. Nach Deiner Erklärung weiß ich was das Skript macht, aber verstanden habe ich das leider immer noch nicht wann das dort geschieht.
Läuft das Blockly genauso in dieser Syntax wie oben gezeigt? Wird also der Wert vom Objekt nicht geprüft mit "falls wert von Object ID = wahr" ?Dann verstehe ich nämlich nicht, wo die Variable definiert wird und wann sie auf true gesetzt wird.
Das ist jetzt aber auch meinem fehlenden Wissen über das Skripten geschuldet. Kann natürlich sein, dass eine Variable automatisch den Wert eines Trigger Objektes annimmt, was ich halt nicht weiß.So wie ich das da oben verstehe (und ich glaube, ich verstehe es falsch) prüft das Skript, ob der Wert vom Türsensor geändert wurde. Wenn er das wurde, wird mit "falls Wert" geschaut, ob es ein Wert ist, es wird ja nicht nach true oder false geprüft.
Aber das Objekt bekommt true und das ist ein Wert und somit wird die Lampe angeschaltet.
Jetzt macht man die Tür wieder zu und das Objekt wird wieder geändert und erhält false, was auch ein Wert ist und somit bleibt die Lampe an.Wann bekommt denn die Variable ihren Wert und woher? Irgendwann muss die doch auch auf true gesetzt werden, bzw. wenn nur das Vorhandensein einer Variablen geprüft wird, ist die doch bereits beim ersten Tür auf schon da und würde dann beim ersten Tür zu doch schon wieder durch "setze draussen auf - nicht - draussen" gelöscht, oder?
-
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
prüft das Skript, ob der Wert vom Türsensor geändert wurde. Wenn er das wurde, wird mit "falls Wert" geschaut, ob es ein Wert ist,
Nein, mit "falls Wert" wird geprüft, ob der Wert true ist.
Javascript: if(obj.state.val)EDIT: Siehe Compare-Table, Reiter if().
-
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
Wann bekommt denn die Variable ihren Wert und woher? Irgendwann muss die doch auch auf true gesetzt werden, bzw. wenn nur das Vorhandensein einer Variablen geprüft wird, ist die doch bereits beim ersten Tür auf schon da und würde dann beim ersten Tür zu doch schon wieder durch "setze draussen auf - nicht - draussen" gelöscht, oder?
Beim Skriptstart bekommt die Variable draussen den Wert undefined. Beim ersten Schließen der Tür erhält sie den Wert true; beim zweiten Schließen erhält sie den Wert false, beim dritten Schließen wieder true ...
-
@paul53 sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
prüft das Skript, ob der Wert vom Türsensor geändert wurde. Wenn er das wurde, wird mit "falls Wert" geschaut, ob es ein Wert ist,
Nein, mit "falls Wert" wird geprüft, ob der Wert true ist.
Javascript: if(obj.state.val)Sei nachsichtig mit mir.
Ich habe ein Haufen von Dokus zu Blockly und Skripten in meinen Favoriten, bin aber als Autodidakt nicht sehr konsequent damit.
Also ist die Syntax für den Block Wert, der auf die ObjektID des Triggers abzielt, automatisch die Prüfung nach "true" und eine Sonst-Bedingung wird nicht benötigt?
Heißt dann übersetzt
Wenn die ObjectID von Türsensor geändert wurde, prüfe ob der Wert = true ist und schalte dann das Licht an.Im Ausgangsstatus vom Türsensor steht bei geschlossener Tür ja false.
Jetzt mache ich die Tür auf, der Trigger erkennt eine Änderung und prüft ob true, schaltet dann das licht an.
Beim schließen der Tür erkennt er wieder eine Änderungen, prüft ob true und erhält false.Was passiert dann? Dann sollte er doch in die Sonst Bedingung gehen und die Variable "draussen" auf true prüfen, die noch keinen Wert hat, weil undefined. Also lässt er deshalb das Licht an und die Variable existent.
Wenn jetzt die Tür zum zweiten Mal geöffnet wird, ändert sich ja wieder der Wert vom Türsensor auf true und das Licht bleibt an. Wird jetzt erst das true in die Variable geschrieben? Muss ja, denn beim zweiten Schließen der Tür erhält der Wert false und es müsste in die Sonst Bedingung gehen und hier existiert die Variable und hat den Wert true, so dass das Licht ausgeschaltet wird und die Variable gelöscht wird.
Und dann fängt das Spielchen wieder von vorn an, richtig?
Wenn das wirklich so sein sollte, dann bin ich noch weit weg vom Syntaxverständnis.
-
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
Beim schließen der Tür erkennt er wieder eine Änderungen, prüft ob true und erhält false.
Was passiert dann? Dann sollte er doch in die Sonst Bedingung gehenGenau das bedeutet sonst: Wenn die Prüfung false ergibt, wird nicht der mache-Zweig, sondern der sonst-Zweig ausgeführt.
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
die Variable "draussen" auf true prüfen, die noch keinen Wert hat, weil undefined. Also lässt er deshalb das Licht an
Richtig.
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
und die Variable existent.
Nein, die Variable wird auf true gesetzt, denn die Negierung erfolgt unabhängig von der Prüfung if(draussen).
-
Das Blockly als kommentiertes Javascript:
var draussen; // Deklaration, Wert ist undefined on(idTuer, function(dp) { // triggert bei Wertänderung if(dp.state.val) setState(idLicht, true); // Tür öffnet (true) else { // Tür schließt if(draussen) setState(idLicht, false); // Licht aus, wenn draussen = true draussen = !draussen; // false/undefined --> true, true --> false } });
-
Puhhh. Das wird eine schwierige Geburt. Ich hab da einen Knoten im Kopf. Sorry und danke für Deine Geduld.
Ich raffe es einfach noch nicht, welchen Einfluss das erneute Öffnen der Tür für einen Einfluss auf die Variable hat und woher sie das true bekommt.
Skriptstart heißt doch 1. Mal Tür auf, Türsensor = true, Licht = an, Variable wird angelegt mit undefined.
Erstes Mal Schließen, Türsensor = false, false ist keine Bedingung, also bleibt das Licht an, Variable = true (aber woher kriegt sie das? Gibt das schlicht der Block vor? Du setzt sie ja nicht explizit) Aber gut, Variable war beim ersten Schließen noch undefined, deshalb wird die Sonst Bedingung nicht ausgeführt.
Zweites Mal Öffnen der Tür, Türsensor = true, Licht bleibt an, und somit lauft er auch nicht in die Sonst-Bedingung, setzt die Variable aber auf false.
Zweites Mal Schließen der Tür, Türsensor = false, Variable = true, Skript läuft in die Sonst-Bedingung und findet Variable = true und schaltet Licht aus und löscht sie.Erneutes Öffnen der Tür = Skriptstart usw.... Das habe ich jetzt verstanden. Bleibt nur meine Ungewissheit, ob Blockly beim Durchlaufen von Variablen von sich aus die Werte der Reihe nach durchreicht um eben beim 1. Schließen und 2. Öffnen true und false zu erhalten, damit sie beim 2. Schließen, also der insgesamt 4. Statusänderung vom Türsensor wieder auf true landet.
-
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
Skriptstart heißt doch 1. Mal Tür auf, Türsensor = true, Licht = an, Variable wird angelegt mit undefined.
Nein, beim Skriptstart passiert noch gar nichts, sondern es wird nur das Skript compiliert, Variable angelegt mit undefined und dann auf den Tür-Trigger gewartet.
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
- Mal Tür auf, Türsensor = true, Licht = an
Richtig. Danach
-
- Tür zu: draussen = undefined --> draussen = true
-
- Tür auf: Licht (bleibt) ein
-
- Tür zu: Licht aus, weil draussen = true, danach draussen = true --> draussen = false
Weiter mit Variable draussen:
-
- Tür zu: true
-
- Tür zu: false
-
- Tür zu: true
usw.
Kurz ausgedrückt: Beim Tür schließen wird jedes Mal die Variable draussen negiert und nur jedes zweite Mal das Licht ausgeschaltet. -
@paul53 sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
Kurz ausgedrückt: Beim Tür schließen wird jedes Mal die Variable draussen negiert....
Ahhh, jetzt dämmert es langsam.
Das macht der Teil: setze draussen auf - nicht - draussen. Der schreibt jedesmal ein false in die Variable wenn Tür auch false hat.
Und zwar so lange, bis in der Konstellation irgendwann mal ein true gleichzeitig mit Tür = false steht bei Änderungen am Objekt. Dann wird zusätzlich das Licht ausgeschaltet.Ich habe das "setze draussen" nie unabhängig von "steuere" betrachtet. Aber logisch, die Sonst Bedingung bei Tür = false wird ja immer ausgeführt und demnach auch immer die Variable mit false gesetzt, auch wenn sie bereits ein false hat. Jetzt ergibt das auch für mich Sinn.
Lerneffekt daraus für mich ist aber dann die Syntax. Ich wusste nicht, dass false so gesetzt werden kann. Wahrscheinlich hätte ich es mit "setze draussen auf - (Wert) false" probiert.Was mir allerdings noch nicht klar ist, woher der true Wert für draussen kommt. Das verstehe ich noch nicht. Liegt das in der Eigenschaft der Variablen, dass sie quasi bei jedem Durchlauf des Skripts ein true verpasst bekommt, nach dem Motto - Vorhanden? Ja!, also true, oder woher nimmt sie den Wert?
-
@mehrwiedu sagte in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
demnach auch immer die Variable mit false gesetzt, auch wenn sie bereits ein false hat.
Nein, die Variable wird negiert, was gleichbedeutend ist mit
if(draussen === undefined) draussen = true; if(draussen === false) draussen = true; if(draussen === true) draussen = false;
oder kürzer
if(draussen) draussen = false; else draussen = true;
Das nennt man auch "Toggle".
-
sich an die Stirn haut Verdammt.
Naja, Du musst mich für den größten Deppen halten.
Du schreibst ja von Anfang an "negieren" und ich bin nicht auf die Idee gekommen, dass damit ein Umschalter gemeint ist, sondern dachte, Du sagst es nur anstelle von "negativiert", "Negation" = false setzen. Dabei bedeutet es den Wert umkehren, togglen. Play - Pause, An - Aus, true - false.
Wenn ich jetzt auf das Skript schaue, dann erscheint es mir völlig logisch. Das tut mir leid, dass ich den Thread quasi jetzt so vollgemüllt habe. Hätte mir auch eher einfallen können mal nachzufragen, was Du mit negieren meinst.
Aber da sieht man einfach mal, was fehlende Begrifflichkeiten im eigenen (nicht vorhandenen) Fachwissen bezüglich Skripte so anrichten. Vielen, vielen Dank für Deine Geduld. Jetzt bin ich ein Stückchen näher von "ganz weit weg" bezogen auf Blockly.
-
@paul53 said in [Gelöst] Frage zu Blockly ? Lichtsteuerung über Türkontakt:
@care72 Vorschlag:
Hallo,
leider muss ich jetzt den alten Theard wiederbeleben...
Ich habe einen Türsensor der eine Sprachausgabe per Alexa ausgeben soll ich habe hierfür den Aufbau verwendet da ich mir dachte ist ja vom Prinzip her das gleiche...Das Problem ist jetzt nur, leider funktioniert es nicht …
Ich habe bei
mache, anstatt steuere -> speak -> Hallo eingetragen
bei sonst
anstatt steuere -> speak tschüss eingetragenWenn ich die Tür öffne wird die Sprachausgabe "Hallo" aktiviert, dasselbe beim 2 oder 3 öffnen der Tür aber öffne und schließe ich die Tür innerhalb von 1-2 sec. werden beide Sprachausgaben hintereinander ausgeführt...
Ich hoffe ich konnte mein Problem verständlich erklären..
Hat jemand eine Idee ?
Danke und LG