NEWS
Zeitschaltuhr mit Blockly
-
@vit-hei Es gäbe den Adapter "Zeitschaltuhr" https://github.com/walli545/ioBroker.time-switch
Der kann genau das alles was du willst und noch mehr. Im Adapter muss man die Zeitpläne anlegen, in VIS das Widget hinzufügen und mit dem Datenpunkt unter Objekte des Adapters verknüpfen. Dann kann man die Zeitpläne in der VIS konfigurieren.
Sieht natürlich etwas anders aus als deine Darstellung.Selber machen ist natürlich auch toll
-
@bananajoe
das ist natürlich der einfachste Weg. Den Adapter hatte ich auch schon gefunden. Allerdings möchte ich das ganze auch verstehen. Das wird nicht klappen wenn ich nur den Adapter bediene. -
@vit-hei
Hast mal überlegt, das ganze smart erledigen zu lassen?
Wenn ich jeden Tag drüber nachdenken müsste wann und wo ich ein Rollladen bediene soll, brauch ich dazu keine Steuerung -
@jan1 said in Zeitschaltuhr mit Blockly:
@vit-hei
Hast mal überlegt, das ganze smart erledigen zu lassen?
Wenn ich jeden Tag drüber nachdenken müsste wann und wo ich ein Rollladen bediene soll, brauch ich dazu keine SteuerungNun ja, das ganze ist ja schon (für mich zumindest) smart angedacht und soll auch nicht jeden Tag neu bedient werden.
Ich stelle für jeden Wochentag die Uhrzeit ein, wann auf- bzw- zu gefahren werden soll. Habe ich mal einen freien Tag, kann ich mir die Zeiten anpassen und werde nicht bei Sonnenaufgang geweckt und wenn ich mal länger draußen bin als der Sonnenuntergang einsetzt, sollen die Rollladen nicht einfach zufahren. Ich halte also nicht viel von den Astro Zeitschaltuhren und möchte lieber flexibel schalten können.
Es soll außerdem nicht für jeden Rollo einzeln so ein Skript erstellt werden, sondern das Skript soll einen Datenpunkt mit Wahr oder Falsch ansteuern, und dieser Datenpunkt aktiviert ein anderes Skript, welches die Rollladen auf 0% runterfährt oder eben auf 100% hochfährt.
Später möchte ich gerne meinen Mähroboter und meine Bewässerungssteuerung genauso flexibel ansteuern können. Daher wäre ich dankbar für hilfreiche Kommentare, die mir helfen meinen Fehler zu verstehen, warum das Blockly so nicht funktioniert -
@vit-hei sagte in Zeitschaltuhr mit Blockly:
warum das Blockly so nicht funktioniert
Ich kenne diesen Baustein nicht - aber ist das nicht ein Trigger im mache?
Da gehört der auf keinen Fall hin -
@vit-hei
Smart ist, wenn der Rollladen das selber erkennt was er tun soll und davon bist Du mit Deinem Vorhaben weit weg.
Ich steure das ganze ebenfalls mit Blocklys und den Astrozeiten. Das ganze wiederum in Abhängigkeit meines Kalender wegen freien Tagen und Schicht und zuletzt noch mit ner Anwesenheitserkennung.
Die Südseite wird dann noch zusätzlich über den Sonnenstand und vorherrschender Temperatur in der Bude gesteuert. Will ich dann tatsächlich mal manuell was erledigen (ihatte ich bis jetzt nicht so oft), sage ich das fer Tante Alexa. Das ist smart und leicht daran zuerkennen, dass ich gar kein Knopf oder sonstiges betätigen mussOK, hilft Dir zwar bei der eigentlichen Frage nicht weiter, ändert aber vielleicht Dein Denkansatz zur Steuerung
-
@jan1 sagte in Zeitschaltuhr mit Blockly:
Smart ist, wenn der Rollladen das selber erkennt was er tun soll
also KI
der Rollladen muss erkennen, dass ein Kind krank ist oder ein Nachteinstz gefahren wird? -
@homoran
Tante Alexa steuert das auch manuell. Smart ist immer ne Verbindung zur KI, sonst wäre es nicht smartWarum ein Rollladen aber erkenn sollte, ob ein Kind krank ist erschießt sich mir nicht wirklich.
-
@jan1 sagte in Zeitschaltuhr mit Blockly:
Smart ist immer ne Verbindung zur KI, sonst wäre es nicht smart
Diese Fehleinschätzung diskutiere ich nicht schon wieder.
@jan1 sagte in Zeitschaltuhr mit Blockly:
Warum ein Rollladen aber erkenn sollte, ob ein Kind krank ist erschießt sich mir nicht wirklich.
sonst wäre er nach deiner Definition nicht smart und würde zur Aufstehenszeit für den Schulbeginn hochfahren
-
@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.