NEWS
Rollo öffnen nach einschalten des Lichtes
-
Hallo zusammen,
ich stehe momentan vor einem Problem. Und zwar bekomme ich das folgende Szenario in Blockly nicht gelöst.
Ziel:
- Zwei Rollos sollen sich nach Betätigen eines Lichtschalters nach 10 Minuten in einem Zeitintervall zwischen 05:00 - 10:00 Uhr an allen Tagen der Woche öffnen.
- Spätestens um 10:00 Uhr sollen die Rollos hochfahren, sollte der Lichtschalter nicht betätigt werden.
- Wenn der Lichtschalter in dem oben genannten Zeitraum betätigt wird und innerhalb 30 Sekunden ein anderer LIchtschalter im Bad betätigt wird, sollen die Rollos NICHT öffnen (Szenario Toilettengang)
- Nach einmaligen Ausführen, also öffnen der Rollos soll nicht weiter getriggert werden (ist dies überhaupt möglich?)
Probleme habe ich beim dritten und vierten Punkt. Der Rest dürfte passen. Hat jemand eine Idee für mich, wie ich dies am besten umsetzen könnte?
Hier noch mein Blockly Script (Nicht wundern "Position" ist jeweils ein anderes Rollo)
<xml xmlns="http://www.w3.org/1999/xhtml"> <block type="schedule" id="W5*r7?BYFE?GM[ye|mru" x="-937" y="-588"> <field name="SCHEDULE">* 18-19 * * *</field> <statement name="STATEMENT"> <block type="controls_if" id="9.{|MF7O(mwXgKb6JA0r"> <mutation elseif="1"></mutation> <value name="IF0"> <block type="logic_compare" id="82W1HmeT@29P?L]%hH0)"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="k#=Uc+y3//58SQ7+4hnI"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-1#98F4ABF295EB#1.Relay0.Switch</field> </block> </value> <value name="B"> <block type="logic_boolean" id="7p9vJ[ZELwUBz2JriN~T"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="{XS;qbz*)HDF!)MfXu^e"> <mutation delay_input="true"></mutation> <field name="OID">shelly.0.SHSW-25#110B3F#1.Shutter.Position</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">10</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="math_number" id="e:2{h#ENOj(8vRt0hUE$"> <field name="NUM">100</field> </block> </value> <next> <block type="control" id="]_~9}:f`aXDQ{uRQpvKB"> <mutation delay_input="true"></mutation> <field name="OID">shelly.0.SHSW-25#F380FA#1.Shutter.Position</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">10</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"> <block type="math_number" id="%_m[?3*^Yb~nfccQ?JRS"> <field name="NUM">100</field> </block> </value> </block> </next> </block> </statement> <value name="IF1"> <block type="logic_compare" id="}be%;x]TZd5;g1@mG}lG"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="Fa];UO1aIol:MVQtn!GL"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-1#98F4ABF295EB#1.Relay0.Switch</field> </block> </value> <value name="B"> <block type="logic_operation" id="9oED(@|mbge!M5+_0R+F"> <field name="OP">AND</field> <value name="A"> <block type="logic_boolean" id="~wJyHEBN$p~:T.L],IXd"> <field name="BOOL">TRUE</field> </block> </value> <value name="B"> <block type="logic_compare" id="Y}{fA::^3mLYr,{;I2Nu"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="4cUP^q89[.e/VlzA!w5F"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-1#F42B0C#1.Relay0.Switch</field> </block> </value> <value name="B"> <block type="logic_boolean" id="i8*WlB6?LC0$s)Y3_wYQ"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> </block> </value> </block> </value> <statement name="DO1"> <block type="control" id="X|uV-R#nu@.FBk9FH3(K"> <mutation delay_input="false"></mutation> <field name="OID">shelly.0.SHSW-25#110B3F#1.Shutter.Position</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="u1[IbXJmw[#8]00h~xr="> <field name="NUM">0</field> </block> </value> <next> <block type="control" id="v!.q85}DXgi#g(o~HK10"> <mutation delay_input="false"></mutation> <field name="OID">shelly.0.SHSW-25#F380FA#1.Shutter.Position</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="WA`l#(Z/^1geC.E]~J+E"> <field name="NUM">0</field> </block> </value> </block> </next> </block> </statement> </block> </statement> <next> <block type="comment" id="Oj?gkf{c.i@wL~0qqrmj"> <field name="COMMENT">Um 10:00 Rollos öffnen, sollten diese noch geschlossen sein</field> <next> <block type="schedule" id="NR-Cf(cC5mvZS;HpE4cP"> <field name="SCHEDULE">0 10 * * *</field> <statement name="STATEMENT"> <block type="controls_if" id="~W~61XGf02y@S(q_fd!o"> <value name="IF0"> <block type="logic_compare" id="io5Zeb,@VlPShT8)@DY+"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="P}D({2x@U8zS}lhv3dXO"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-25#110B3F#1.Shutter.Position</field> </block> </value> <value name="B"> <block type="math_number" id=")^u?-dP*g#g#[FME]^@]"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="$$t*1zu%ozm7Zu))Owq["> <mutation delay_input="false"></mutation> <field name="OID">shelly.0.SHSW-25#110B3F#1.Shutter.Position</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="#G*a#/r32j}VlH6;1%N8"> <field name="NUM">100</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="xy0`iDvpkS@?2DWAh9`i"> <value name="IF0"> <block type="logic_compare" id="Hk%D_ER4$om5`jU0Cg7I"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="xUjM1L|3bn4lKH-l]-dM"> <field name="ATTR">val</field> <field name="OID">shelly.0.SHSW-25#F380FA#1.Shutter.Position</field> </block> </value> <value name="B"> <block type="math_number" id="xxM@`]coc5|E[U:,OpfH"> <field name="NUM">0</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="sq{h=f{2Zmu6-x50+kH@"> <mutation delay_input="false"></mutation> <field name="OID">shelly.0.SHSW-25#F380FA#1.Shutter.Position</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="0MBut31]rL+x/O7B^OJ["> <field name="NUM">100</field> </block> </value> </block> </statement> </block> </next> </block> </statement> </block> </next> </block> </next> </block> </xml>
-
@Baki074
Bitte Blockly auch als Screenshot zeigen.Das wird aber ziemlich komplex!
Verschiedene Trigger - Sperrvariablen usw. da es diverse Abhängigkeiten einerseits und verschiedene unabhängige Auslöser gibt -
-
das genau zum Minutenwechsel der Schalter gedrückt wird ist unwahrscheinlich ,dein "sonst wenn" ist sehr eigenartig
Ich würde das anders angehen trigger auf switch=true und dann die weiteren aktionen prüfen.
mal ein Ansatz:
deine letzte Bedingung "Nach einmaligen..." ist auch einfach-> dann noch [nur wenn rollo.state ungleich 100 mache :)]
10:00 trigger sollte so passen oder du änderst auf wenn <100 dann könntest du auch schon mal paar cm hochgefahren haben um etwas Luft zu schappen. rest erledigt die 10UhrAutomatikalso mach mal!
-
Vielen Dank für deine Hilfe. Ich denke ich bin schon etwas weitergekommen.
Allerdings verstehe ich die Überprüfung beim Badschalter nicht ganz. Zeitstempel - Auslöser kann doch nie weniger oder gleich 0 sein, wenn ich den Auslöser am Anfang schon auf 0 gesetzt habe, oder?
Sorry, ist das erste Mal dass ich mit Variablen arbeite ^^ -
Zeitstempel ist die Zeit in Sekunden die seit dem 1.1.1970 vergangen sind.
Am Anfang auf 0 setzen ist um die Variable erst mal einem definierten Wert zu belegen.
Die Bedingung sollte nur dein 0-30sek-Zeitfenster verdeutlichen. Aber du hast schon recht, der wert kann nie kleine 0 werden, die vordere Und-Bedingung ist daher nicht nötig und kann raus.Das Script sieht doch schon mal gut aus. Guter Stil ist wohl auch vor dem [timeout 10min] noch ein [stop timeout] um evtl laufene Timer zu löschen.
Dann las mal laufen zum testenDu brauchst dich nicht entschuldigen. Wichtig ist doch dass man durch das tolle Forum dazu lernt und nicht nur weiß wie copy&paste funktioniert Klick auch öfter mal oben rechts auf das [Bockly/JS]-symbol und sieh dir an was für ein javascript erzeugt wird. Ich finde so lernt man auch einiges.
-
@xbow42
Alles klar, dann habe ich das mit dem Zeitstempel schon mal verstanden.Script funktioniert allerdings nur bedingt.
Habe um dies zu testen einfach mal ein aktuelles Zeitintervall definiert.
Die Rollos werden auch nach dem definierten Timeout hochgefahren.Allerdings werden sie auch hochgefahren, wenn der Lichtschalter im Bad innerhalb der 30 Sekunden betätigt wird. Also muss beim Trigger für das Badfenster etwas noch nicht passen.
-
@Baki074
Dann bau mal ein paar debug-Bausteine mit jeweils aussagekräftem Text an die neuralgischen Punkte, damit du siehst wo es hängt -
hab gerade in einem anderen Beitrag von @Paul gelesen das Zeitstempel ein ms-Wert ist
denn dem so ist, pass mal bei dem Badlichschalter-Trigger an- debug<[[Zeitstempel]-[AusloeserTS]]
- die 30 an zu 30000.
die Bedingung im oberen Trigger würde ich auch abändern.
z.Z. wenn ein Fenster nicht ganz offen ist werden immer beide mit 100 angesteuert, macht zwar nichts aber von der Logik nicht so toll. -
@xbow42 said in Rollo öffnen nach einschalten des Lichtes:
hab gerade in einem anderen Beitrag von @Paul gelesen das Zeitstempel ein ms-Wert ist
denn dem so ist, pass mal bei dem Badlichschalter-Trigger andebug<[[Zeitstempel]-[AusloeserTS]]
die 30 an zu 30000.Hat leider auch nicht den gewünschten Erfolg gebracht.
Ich habe auch die Verlinkungen der Objekt IDs nochmals kontrolliert, also ob ich den richtigen Schalter gewählt habe.. Auch hier hat alles gepasst.ICh habe auch versucht den Zimmerschalter ein - und gleich wieder auszuschalten und dann innerhalb der 30 Sekunden den Badschalter zu betätigen. Einige dieser "Schalterszenarien" habe ich probiert. Hat aber leider auch nichts gebracht.
Übrigens, das Skript sieht nun folgendermaßen aus:
-
@Baki074 Was liefert der Datenpunkt 'switch' für Werte?
-
ich kann kein debugbaustein sehen
was kommt für ein wert wenn du im 2. Trigger (badfenster) den baustein einbaust?
kommt überhaut ein wert, spricht löst der trigger überhaupt aus? -
@Homoran said in Rollo öffnen nach einschalten des Lichtes:
Was liefert der Datenpunkt 'switch' für Werte?
true oder false.
@xbow42 said in Rollo öffnen nach einschalten des Lichtes:
kommt überhaut ein wert, spricht löst der trigger überhaupt aus?
Ich erhalte folgende Zeile:
17:11:43.804 info javascript.0 (1216) script.js.Rollosteuerung.Rollosteuerung_Zimmer: NaNAllerdings weiß ich nicht für was NaN steht.
-
not a number; also sowas wie kein gültiger Wert.
Dass der Zeitstempel nicht gültig ist kann ich mit nicht vorstellen. Vermutlich hat Ausloeser keinen gültigen wert.
Bist du sicher das du nur eine Variable verwendest. Der Fehler ist vielleicht weil ich oben noch mit AusloeserTS gearbeitet habe. Muss also da auch AusloeserTS heißen, sorry. -
@xbow42 said in Rollo öffnen nach einschalten des Lichtes:
Der Fehler ist vielleicht weil ich oben noch mit AusloeserTS gearbeitet habe. Muss also da auch AusloeserTS heißen, sorry.
Habe ich bereits mit AusloeserTS im Script. War also bereits richtig.
Zeitstempel ist ja auch nur eine Variable, oder?
Zumindest habe ich diese als Variable angelegt, also gleich wie AusloeserTS. -
@Baki074 sagte in Rollo öffnen nach einschalten des Lichtes:
Zeitstempel ist ja auch nur eine Variable, oder?
nein - das findest du unter Trigger und ist der Zeitstempel des Triggers
(ist ein Baustein mit pulldown)
-
Aha, das war also schon mal ein Punkt ^^
Leider funktioniert das Script immer noch nicht.Langsam bin ich echt am Verzweifeln... Ansonsten muss ich mir was anderes überlegen.
Ist halt doof, da das Script für mich eigentlich schlüssig wirkt. -
mit der Aussage sollen wir jetzt die Glaskugel anschmeißen?
was für Werte geben deine Debug-Bausteine aus?
an welchen Stellen hast du welche eingebaut?
zeig mal das Script und die logausgaben dazu. -
Jetzt hats geklappt!
Allerdings keine Ahnung warum. Ich habe mit einem debug Baustein getestet welcher Wert rauskommt wenn ich den Badlichtschalter innerhalb 30 Sekunden betätige. Wert war 7225. Also nach knapp sieben Sekunden habe ich den Schalter betätigt.Dann habe ich einfach nochmal die Bedingung für den Badlichtschalter neu "gebaut".
Dann hat's funktioniert!Ich danke euch für eure Hilfe!