NEWS
Zeitschaltuhr mit Blockly
-
@homoran
Da haben wir den Fehler Deiner Denkweise, wobei Fehler schon etwas hart ausgedrückt ist.Smart ist die Vorstufe zur KI, da das Ding nicht wirklich denkt und stur das tut was man Ihr über Parameter vorgibt. Das soll auch keine Diskussion werden.
Beispiel wie ich das im Schlafzimmer geregelt habe, dann wirds wahrscheinlich einfacher meinem Gedanken dazu zu folgen.
Normal gehen die Rollläden in allen beheizen Räumen runter wenn die Sonne weg ist, weil eh kein Licht von draußen und bessere Isolation. Wenn ich nun mal früher zu Bett gehe und Frauchen noch weiter TV schauen möchte, sage ich im Schlafzimmer einfach "Alexa, dunkel", was bewirkt, dass die Rollläden unten bleiben und der BWM das Licht nicht mehr einschaltet. Wenn Frauchen auch früher zu Bett möchte, heißt das dann "Alexa, Feierabend" und es wird alles ausgeschaltet, außer was noch zum zu Bett gehen benötigt wird.
Mein Wecker ist das übrigens mit intrigiert und der weiß wann ich Urlaub habe und sonstige freie Tage. Mein Wecker wird mit "Alexa, aufstehen" beendet und somit die Bude auch auf "wach" umgeschaltet und es läuft das normale Tagesprogramm. Krank habe ich noch nicht getestet, weil ich mich nicht erinnern kann, wann der letzte bei uns mal krank war. Sollte aber über manuelles steuern, oder den Eintag "krank" im Kalender genau so machbar sein.Edit:
die Rollläden öffnen voll vergessen. Die gehen natürlich nicht von alleine hoch, sondern ebenfalls mit bei dem Kommando "Alexa, aufstehen" und somit wirds erst wieder hell, wenn wirklich einer aufsteht. So habe ich das mit smart Home verstanden und dank des IOBroker bei mir sehr einfach umgesetzt.
Klar bastelst so was nicht auf ein Wurf zusammen, sondern das wächst und Frauchen hat ab und an mal ein Wunsch was anders oder zusätzlich rein oder raus soll. -
Ich würde das ganze prinzipiell anders aufbauen:
- Je einen "benannten" Zeitplan für jeden Tag der Woche
- Je einen Trigger auf die Datenpunkte die zu den Zeitplänen für diesen Wochentag gehen
- Im Trigger den entsprechenden "benannten" Zeitplan löschen und einen neuen anlegen.
- Bei Skriptstart alle Zeitpläne anlegen
Wichtig dafür sind die beiden weiter unten stehenden Bausteine.
Es ist durchaus möglich einen Zeitplan zu erzeugen der jeden Montag um 14:20 etwas macht. Ich empfehle dazu das durchschauen des Cron Wizards um zu Verstehen wie die Syntax ist.
A.
-
@asgothian said in Zeitschaltuhr mit Blockly:
Ich würde das ganze prinzipiell anders aufbauen:
- Je einen "benannten" Zeitplan für jeden Tag der Woche
- Je einen Trigger auf die Datenpunkte die zu den Zeitplänen für diesen Wochentag gehen
- Im Trigger den entsprechenden "benannten" Zeitplan löschen und einen neuen anlegen.
- Bei Skriptstart alle Zeitpläne anlegen
Dankeschön.
Habe ich nun hinbekommen:<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable type="cron" id="Rollos auf/zu">Rollos auf/zu</variable> </variables> <block type="procedures_defnoreturn" id="KjD@@8v2b3[l!Iz4,QCH" x="-838" y="-562"> <field name="NAME">Rollos_Auf</field> <comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment> <statement name="STACK"> <block type="comment" id="|FhckLJj_i~O-Q-8we4c"> <field name="COMMENT">Skript funktioniert für Mittwoch---VH</field> <next> <block type="controls_if" id="N@[Q7y~uhX%vi=W_Subm"> <value name="IF0"> <block type="logic_compare" id="{lp2NwS{(F9hF0_)(Y1~"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id=")y|Xx]1=:Mo(qJ/P]bgB"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Rollos.Timerzustand.Mittwoch.Mittwoch_ein/aus</field> </block> </value> <value name="B"> <block type="logic_boolean" id=".My;62PsS:.S(l4NDudp"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="schedule_create" id="f2ex;D{,jkR5P[F/e{(u"> <field name="NAME">Rollos auf/zu</field> <value name="SCHEDULE"> <shadow type="field_cron" id="}Z$O${@0RX,AU4!kK)Q/"> <field name="CRON">* * * * *</field> </shadow> <block type="cron_builder" id="HZ-xpXQoB/fIeB8NLT)8"> <mutation xmlns="http://www.w3.org/1999/xhtml" seconds="false" as_line="false"></mutation> <field name="LINE">FALSE</field> <field name="WITH_SECONDS">FALSE</field> <value name="DOW"> <shadow type="text" id="U@Ml#/x`x2uvVW@h;+19"> <field name="TEXT">3</field> </shadow> </value> <value name="MONTHS"> <shadow type="text" id=".OORsyiYSe0p$kV:4*^S"> <field name="TEXT">*</field> </shadow> </value> <value name="DAYS"> <shadow type="text" id="$TKDnjAdVXCWFeG3=~o5"> <field name="TEXT">*</field> </shadow> </value> <value name="HOURS"> <shadow type="text" id="HW5[hw2v$O=bR2:,ArE+"> <field name="TEXT">*</field> </shadow> </value> <value name="MINUTES"> <shadow type="text" id="7$5pc@`1z$YXuUN;vM`."> <field name="TEXT">*</field> </shadow> </value> </block> </value> <statement name="STATEMENT"> <block type="controls_if" id="-q=`JfRqQ2@FdS!,(MxQ"> <value name="IF0"> <block type="logic_compare" id="Ul]/CpM8TE}/_lFG:nv]"> <field name="OP">EQ</field> <value name="A"> <block type="time_get" id="tzZnp_cu`*Vn0aY:2}]Y"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">hh:mm</field> </block> </value> <value name="B"> <block type="convert_from_date" id="okj(VDeTV}BjJe+I:/)|"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">hh:mm</field> <value name="VALUE"> <block type="get_value" id="6/2Bwm6}]dU3mZ+VlP(3"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Rollos.Timerzustand.Mittwoch.H_An</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="6MkWfqRbg+fx(1o9t[}t"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.Rollladensteuerung.VIS.ALL_shutter_OnOff</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="7b_l!`z4nELM[|A%kyXd"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="ax2q^4c,/j9,QYx-FNV~"> <value name="IF0"> <block type="logic_compare" id="P2x2*-a29/Jfn,GxQ}O/"> <field name="OP">EQ</field> <value name="A"> <block type="time_get" id="#|N,9~`*6Q-,W]2i7A6x"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">hh:mm</field> </block> </value> <value name="B"> <block type="convert_from_date" id="xZ{XB7dkHQ3M)q6a-8qb"> <mutation xmlns="http://www.w3.org/1999/xhtml" format="false" language="false"></mutation> <field name="OPTION">hh:mm</field> <value name="VALUE"> <block type="get_value" id="/ED;v.u7y-?(dC8#I,.t"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.Rollos.Timerzustand.Mittwoch.H_Aus</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="vq)26KfG@u]7L9:[hjML"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">javascript.0.Rollladensteuerung.VIS.ALL_shutter_OnOff</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="h/|0,Z)74mA1R*xu1;h!"> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> </block> </next> </block> </statement> </block> </statement> </block> </next> </block> </statement> </block> <block type="procedures_callnoreturn" id="2#?5/,^RbDXuW]Mh2Acu" x="-187" y="-512"> <mutation name="Rollos_Auf"></mutation> <next> <block type="on" id="$1t,..3bo,l8YGlFzHaP"> <field name="OID">0_userdata.0.Rollos.Timerzustand.Dienstag.H_An</field> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="schedule_clear" id="P0|ssO|C0@|W2N8+cS/i"> <field name="NAME">Rollos auf/zu</field> <next> <block type="procedures_callnoreturn" id="$O2wOf{`^NuX9:aq%VXg"> <mutation name="Rollos_Auf"></mutation> </block> </next> </block> </statement> </block> </next> </block> </xml>
Für meine Zwecke reicht es erstmal. -
Sorry wenn ich das so hart schreibe, aber das was Du da machst ist Verschwendung (von Ressourcen). Letztendlich bist du auf dem Weg zu einem vollständigen Skript auf halber Strecke stehengeblieben.
Du legst einen Cron Job (einen sich automatisch widerholenden Job) an der jeden Mittwoch einmal pro Minute nachschaut ob die aktuelle Zeit mit einer eingestellten Zeit überein stimmt. Das ganze machst Du 7 mal, um jeweils andere Zeiten zu prüfen bevor du die gleichen Aktoren schaltest. Zusätzlich holst Du die entsprechenden Werte jedes mal aus der Objektdatenbank - sie könnten sich ja geändert haben.
Das macht so wenig bis keinen Sinn. Entweder du arbeitest mit einem Heartbeat (einem Skript welches in regelmässigen Abständen etwas tut). Dann macht es Sinn sich die entsprechenden Vergleichswerte in eine geeignete Struktur zu holen (z.Bsp. in eine Liste, in der pro Wochentag jeweils Ein- und Ausschaltzeit stehen, sofern etwas getan werden soll) und prüfst dann in Abhängigkeit vom Tag die entsprechende Uhrzeit und löst die Aktion aus.
Die andere Alternative (die deutlich effektiver arbeitet) habe ich oben beschrieben. Pro Tag 2 Cron Jobs die du zusammen baust.
Letztendlich hast du dazu schon alles Material vorhanden:Der einzige "Trick" der in dem Skript ist: Du hast in deinen Eingaben eine Uhrzeit als "HH:mm" vorgesehen. Um da an die Stunden und Minuten zu kommen mache ich daraus eine Liste, so das ich ["HH","mm"] habe, und damit auf die Stunden als 1. Eintrag in der Liste und die Minuten als 2. Eintrag in der Liste zugreifen kann.
Triggern tust du die ganze Aktion dadurch das entweder das ein /aus oder die Zeiten für Mittwoch geändert wurden.
A.
-
@vit-hei sagte: So sieht dazu mein aktuelles Auswahlfenster aus:
Du hast demnach 5 Datenpunkte pro Wochentag:
- Stunde Auf
- Minute Auf
- Stunde Zu
- Minute Zu
- Freigabe
Das kann man mit einem Minuten-Trigger auswerten:
Die Stunden müssen dann mit einer führenden 0 eingegeben werden.
Alternativ mit Zahlenvergleich (keine führende 0 erforderlich):
weitere Wochentage
@Asgothian
14 Zeitpläne (Trigger), die auch noch jeweils an zwei Stellen gestellt werden, und 14 mal setState() sind keinesfalls Ressourcen schonender. -
@paul53 sagte in Zeitschaltuhr mit Blockly:
14 Zeitpläne (Trigger), die auch noch jeweils an zwei Stellen gestellt werden, und 14 mal setState() sind keinesfalls Ressourcen schonender.
Das ist diskutabel. Die einzelnen Cron Trigger benötigen sehr wenig Rechenleistung, auch wenn es 14 sind. Auch die Kombination mit den notwendigen Triggern, Verglichen mit dem minütlichen Abfragen der gleichen n Datenpunkte über den gesamten Tag.
A.
-
@asgothian sagte: Trigger benötigen sehr wenig Rechenleistung, auch wenn es 14 sind.
Rechenleistung ist auch beim Minuten-Trigger kein Problem. Das Problem bei Node.js ist der RAM-Verbrauch.
-
@paul53
Oh super. Das sieht interessant aus.
Könntest du den Code noch zum Import bereitstellen für beide Varianten?
Würde mich dann mal heute abends damit auseinandersetzen.
Muss im Trigger "Zeitplan" noch was gesetzt werden?...und danke schonmal für deine bisherige Anwort.
-
@vit-hei sagte: Könntest du den Code noch zum Import bereitstellen
-
Vielen dank für den Code.
Jetzt aber noch eine Verständnisfrage den 7. Tag.
Ist das so korrekt in deinem Code mit "default" und dann den üblichen Tagescode gesetzt ohne die Tageszahl?
Würde das so am Sonntag auch funktionieren? Oder sollte es da genauso stehen wie bei allen anderen Tagen "im Falle von 7"? -
@vit-hei sagte: Ist das so korrekt in deinem Code mit "default"
Ja, "default" wird nur Sonntags ausgeführt.