NEWS
(ERLEDIGT) einfaches Blockly Skript zum neustarten über Sonoff POW und Basic
-
Schau mal ob der Teil funktioniert wie er soll, ist ungetestet. `
So auf den ersten Blick würde ich es nicht testen.Exports von Blockly bitte immer in "spoiler" UND "code" Tags.
Im Betreff einen Hinweis auf Blockly wenn es um Blockly geht hilft enorm gefunden zu werden.
Grüße
-
Hallo high_voltage
Wie schon andere geschrieben haben solltest für den Server schnellstens eine andere Lösung finden.
Mein Vorschlag funktioniert nur, wenn der Server beim Einschaltvorgang nicht unter 1000 Watt geht.
Wenn der Wert von Power sich komplizierter verhält, könntest Du das Waschmaschinen-Blockly "missbrauchen".
Damit wird schon alles Mögliche geschaltet. Und Du würdest noch eine Meldung bekommen.
http://forum.iobroker.net/viewtopic.php … 34#p107896
Mein Vorschlag sieht so aus (auch ungetestet)
Export:
! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="comment" id="ASi0zzBLPExBQv(=r*~|" x="113" y="13"><field name="COMMENT">Bei Scriptstart initialisiern</field>
<next><block type="variables_set" id="-5r|?q[dI^UP]K?/~LDE"><field name="VAR">TimerON</field>
<value name="VALUE"><block type="logic_boolean" id="EzwRR_~P0sG#z[Hfasc"><field name="BOOL">FALSE</field></block></value>
<next><block type="comment" id="7UJn[lNpU}jhM)A,Hp;{"><field name="COMMENT">Power triggern</field>
<next><block type="on_ext" id="Dz:.K;RfhJq+/EiA:py"><mutation items="1"></mutation>
<field name="CONDITION">any</field><value name="OID0"><shadow type="field_oid" id="8hi`zwAOTB-.J3hYZ^oY"><field name="oid">default</field></shadow></value> <statement name="STATEMENT"><block type="comment" id="AmXsjPK}{)7~v(JmWrWR"><field name="COMMENT">Wert und Timer prüfen</field> <next><block type="controls_if" id="6hmccAUzx/j/S+[XOc(1"><value name="IF0"><block type="logic_operation" id="opEB+!t,3/J+./|Rkf=*" inline="false"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="]om/OfjUh6h(ATbk!|}3"><field name="OP">LT</field> <value name="A"><block type="get_value" id="g7Mzh,m-+_3(^cqS%M/L"><field name="ATTR">val</field> <field name="OID">ID auswählen</field></block></value> <value name="B"><block type="math_number" id="+xmh_jXB)@7exvc4~fNd"><field name="NUM">1000</field></block></value></block></value> <value name="B"><block type="logic_compare" id="A-A5F~V`_xMc.WNYAIJv"><field name="OP">EQ</field> <value name="A"><block type="variables_get" id="N~]pw[QRA,!B]Os#RO,x"><field name="VAR">TimerON</field></block></value> <value name="B"><block type="logic_boolean" id="]^*l%/99rG7P5bL{IlH?"><field name="BOOL">FALSE</field></block></value></block></value></block></value> <statement name="DO0"><block type="variables_set" id="F~.ATj=7IaRkE~{f!4RC"><field name="VAR">TimerON</field> <value name="VALUE"><block type="logic_boolean" id="SByHiwF-U{xN3?Ki/Ik/"><field name="BOOL">TRUE</field></block></value> <next><block type="comment" id="VOCx.rWL5CWcAEfD[T7k"><field name="COMMENT">nach Ablauf nochmals checken</field> <next><block type="timeouts_settimeout" id="jr[f8CgQnI{2Vwf0,n^P"><field name="NAME">timeout</field> <field name="DELAY">3</field> <field name="UNIT">min</field> <statement name="STATEMENT"><block type="variables_set" id="Rx%CYOo4u#-,}J%H65/;"><field name="VAR">TimerON</field> <value name="VALUE"><block type="logic_boolean" id="P::(s,ev2K:+5H~}9!R2"><field name="BOOL">FALSE</field></block></value> <next><block type="controls_if" id="a5F_QuD81.`2[)FKAlU6"><value name="IF0"><block type="logic_compare" id="8[iH6Q-9~;3iY{P0d:om"><field name="OP">LT</field> <value name="A"><block type="get_value" id="BAxA#Q?SI|IoLq36Qv-d"><field name="ATTR">val</field> <field name="OID">ID auswählen</field></block></value> <value name="B"><block type="math_number" id="N(B%?l!)SsoY71bX#2wG"><field name="NUM">1000</field></block></value></block></value> <statement name="DO0"><block type="comment" id="RC-.(FUsx|e|+Biq.Q2~"><field name="COMMENT">ausschalten</field> <next><block type="control" id="V%.93q^uW[L]@],!,owi"><mutation delay_input="false"></mutation> <field name="OID">Object ID</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="-!t/2+/=75E]Ii5(Rm~)"><field name="BOOL">FALSE</field></block></value> <next><block type="comment" id="UA?AJ^M~k)CDh58h^CGj"><field name="COMMENT">mit Verzögerung einschalten</field> <next><block type="control" id="MO!y!1?@!(K7KXEJ`MHu"><mutation delay_input="true"></mutation> <field name="OID">Object ID</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">40</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"><block type="logic_boolean" id=":r+S]tSlyBugQ(#A!Z[w"><field name="BOOL">TRUE</field></block></value></block></next></block></next></block></next></block></statement></block></next></block></statement></block></next></block></next></block></statement></block></next></block></statement></block></next></block></next></block></next></block></xml>
! ````
Grüße
-
Der Sonoff soll abgeschaltet werden wenn die Watt Aufnahme 3 min. unter 1200 liegt. Als erstes muss geprüft werden ob der Sonoff überhaupt eingeschaltet ist, erst dann wird geprüft ob der Grenzwert von 1200 Watt unterschritten wurde und zusätzlich wird kontrolliert ob der Timer nicht schon läuft. Sonst würde bei jedem unterschrittenen Wert nachgetriggert werden.
Dann kommt der Timer Start, im ersten Teil werden einfach die Sekunden bis 1 runtergezählt. Im zweiten Teil wird der Timer gestoppt, die Variablen zurückgesetzt und noch mal geprüft ob der Wert unter 1200W liegt. Ist das der Fall wird der Server abgeschaltet. Wenn nicht beginnt das Spiel beim nächsten unterschreiten von vorne. Über die Objekt ID Ausschalt-Timer kann die Zeit verändert werden, stattdessen kannst auch eine lokale Variable nehmen. `
Hallo GringoIch möchte Deinen Versuch zu helfen nicht einfach nur abschmettern.
Dein Script könnte funktionieren benutzt aber Sachen, die man nur sehr vorsichtig anwenden sollte.
1. Intervall von 1000 und weniger ms
Das kann das System enorm belasten, wenn viele Aktionen innerhalb des Intervalls ablaufen.
2. Du benutzt globale Variablen (Datenpunkte) für den "Timer".
Dies im Zusammenhang mit einem schnellen Intervall und der asynchronen Verarbeitung von JavaScript,
kann die wildesten Dinge veranstalten.
(Ich will schon lange mal einen Beitrag dazu schreiben.)
Ich hoffe wir sind noch Freunde und Du versuchst auch weiterhin zu Helfen.
Grüße
-
Der Sonoff soll abgeschaltet werden wenn die Watt Aufnahme 3 min. unter 1200 liegt. Als erstes muss geprüft werden ob der Sonoff überhaupt eingeschaltet ist, erst dann wird geprüft ob der Grenzwert von 1200 Watt unterschritten wurde und zusätzlich wird kontrolliert ob der Timer nicht schon läuft. Sonst würde bei jedem unterschrittenen Wert nachgetriggert werden.
Dann kommt der Timer Start, im ersten Teil werden einfach die Sekunden bis 1 runtergezählt. Im zweiten Teil wird der Timer gestoppt, die Variablen zurückgesetzt und noch mal geprüft ob der Wert unter 1200W liegt. Ist das der Fall wird der Server abgeschaltet. Wenn nicht beginnt das Spiel beim nächsten unterschreiten von vorne. Über die Objekt ID Ausschalt-Timer kann die Zeit verändert werden, stattdessen kannst auch eine lokale Variable nehmen. `
Hallo GringoIch möchte Deinen Versuch zu helfen nicht einfach nur abschmettern.
Dein Script könnte funktionieren benutzt aber Sachen, die man nur sehr vorsichtig anwenden sollte.
> Hallo rantanplan! Ich musst kurz weg deshalb konnte ich das Blockly vorhin nicht fertig stellen. Habs mittlerweile getestet und diesbezüglich Probleme mit dem Sonoff festgestellt. Das Blockly funktioniert aber nicht gut genug.
1. Intervall von 1000 und weniger msDas kann das System enorm belasten, wenn viele Aktionen innerhalb des Intervalls ablaufen.
> Das wusste ich.
2. Du benutzt globale Variablen (Datenpunkte) für den "Timer".
Dies im Zusammenhang mit einem schnellen Intervall und der asynchronen Verarbeitung von JavaScript,
kann die wildesten Dinge veranstalten.
` > Das wusste ich nicht! Warum findet man dann im Forum Blockly's die darauf aufgebaut sind? Mal davon abgesehen, wie realisiert man sonst einen Timer der mittels Vis gesteuert werden soll? Ich kenne Javascript leider noch zuwenig was diese Dinge betrifft.Es ist auch nicht meine Absicht und auch nicht meine normale Vorgehensweise Intervalle zu benutzen bzw. globale Variablen.
Ich habe als ich mit Blockly anfing sehr viel auf dieser Weise experimentiert, so sah ich zum Beispiel gleich wenn ein intervall oder was auch immer nicht funktionierte. Mache ich heute auch noch bei größeren Blockly's.
Ein typisches Beispiel bei dem ich oft auf die Nase viel war eine Variable bei Scriptstart nicht definiert zu haben.
Mit der globalen Variable und dem intervall sehe ich dann ob es bis zum intervall überhaupt funktioniert. Wo ich sonst Stundenlang suchte. Da high_voltage
angemerkt hat Blockly lernen zu wollen dachte es sei eine gute möglichkeit für ihn, somit sieht er besser was passiert wenn am Blockly etwas geändert wird oder ab wann es nicht mehr funktioniert. Das mit den lokalen Variablen war für den Schluss gedacht, selber um zu stellen `
(Ich will schon lange mal einen Beitrag dazu schreiben.)Ich hoffe wir sind noch Freunde und Du versuchst auch weiterhin zu Helfen.
> Sicher doch, außerdem ist es gut darauf hingewiesen zu werden! Mann kann nicht alles von Anfang an wissen.
Grüße `
Gruß -
Hallo high_voltage
Wie schon andere geschrieben haben solltest für den Server schnellstens eine andere Lösung finden.
Mein Vorschlag funktioniert nur, wenn der Server beim Einschaltvorgang nicht unter 1000 Watt geht.
Wenn der Wert von Power sich komplizierter verhält, könntest Du das Waschmaschinen-Blockly "missbrauchen".
Damit wird schon alles Mögliche geschaltet. Und Du würdest noch eine Meldung bekommen.
http://forum.iobroker.net/viewtopic.php … 34#p107896
Mein Vorschlag sieht so aus (auch ungetestet)
Beispiel.PNG
Ich möchte mich bei Allen beteiligten Bedanken,
ich habe mich für das Blockly von Rantanplan entschieden und dieses Umgesetzt.
Es läuft P_E_R_F_E_K_T !!
Vielen Vielen Dank!
Tolles Forum super viel Wissen hier und extrem Hilfsbereit.
Wenn ich die Möglichkeit bekomme revanchieren ich auf jeden Fall.
Vielen Herzlichen DANK!!
beste Grüße
Thomas
-
[Das wusste ich nicht! Warum findet man dann im Forum Blockly's die darauf aufgebaut sind? `
"Normales" lesen/schreiben geht ja auch.Und man lernt auch dazu. Früher habe ich es genau wie Du gemacht.
Mal davon abgesehen, wie realisiert man sonst einen Timer der mittels Vis gesteuert werden soll? `
Den Wert des Datenpunktes in eine lokale Variable übergeben und dann mit der Lokalen arbeiten.Falls benötigt, den Wert der Lokalen am Ende der Operationen in den Datenpunkt zurückschreiben.
Grüße `
-
"Normales" lesen/schreiben geht ja auch.
Und man lernt auch dazu. Früher habe ich es genau wie Du gemacht. `
Ist einleuchtend, aber als Anfänger sucht man sich funktionierende Beispiele und geht davon aus das alles richtig ist. Im speziellen meine ich das Beispiel <url url="http://forum.iobroker.net/viewtopic.php?f=23&t=737&p=77920&hilit=countdown#p63514">[http://forum.iobroker.net/viewtopic.php?f=23&t=737&p=77920&hilit=countdown#p63514 " target="_blank">](</s><LINK_TEXT text=)[<link_text text="http://forum.iobroker.net/viewtopic.php … wn#p63514
">http://forum.iobroker.net/viewtopic.php?f=23&t=737&p=77920&hilit=countdown#p63514</link_text>](</s><LINK_TEXT text=)</url> .@rantanplan:Den Wert des Datenpunktes in eine lokale Variable übergeben und dann mit der Lokalen arbeiten.
Falls benötigt, den Wert der Lokalen am Ende der Operationen in den Datenpunkt zurückschreiben. ` Also doch die umständliche Variante, habe es so ähnlich nur das ich jede Änderung (Sekunde) der lokalen in die globale Varibale schreibe (Anzeige verbleibende Zeit). Bislang fand ich keine bessere Lösung und die funktioniert ganz gut.
-
Bei dem Beispiel ist die Abarbeitung der "Steuere-Bausteine", glaub ich, auch egal.
Aber es ist NICHT gewährleistet, dass die Bausteine in der Reihenfolge abgearbeitet werden.
Das vierte "steuere" kann theoretisch abgearbeitet werden BEVOR die vorherigen abgeschlossen sind.
Und wenn es da Abhängigkeiten gibt, geht das in die Hose.
-
Ich hatte damit ziemlich große Probleme sobald ich diesen Timer mehrfach in verschiedenen Blocklys einsetzte und mit anderen Abhängigkeiten verwendete. Durch die Fehlersuche hatte ich aber ziemlich viel über Blockly gelernt ist ja auch nicht schlecht, muss ja nicht immer ein funktionierendes Blockly sein.
-
Da ich das Blockly gestern schon fertig und getestet hatte und es vielleicht doch noch jemanden nützlich sein kann stell ich es noch hier rein bevor ich es lösche.
Üblicherweise werden Sonoff mit Tasmota geflasht die dann bestimmte Grundeinstellungen haben wie ein Sendeintervall der Daten alle 300 Sek. Ohne den Sendeintervall zu ändern würde ein Blockly das mit einem 3 min. timeout arbeitet nur "alten Daten" erhalten bzw. bis neue Daten kommen ist das Blockly längst abgearbeitet. Dann könnte man gleich beim unterschreiten des Grenzwertes ausschalten und auf den timeout verzichten.
Ich habe das Blockly anhand er Daten von meinem Server getestet wodurch eine Überbrückungszeit einzubauen notwendig war. Die Überbrückungszeit wird im timeout2 eingetragen die sich aus der verzögerten Einschaltung (40 sek.) und der Zeit die nach dem wieder einschalten gewartet werden soll bis der Grenzwert sicher überschritten ist. In den "request" Blöcken ist die IP-Adresse noch einzutragen. Der Sendeintervall der Sonoff Daten wird beim unterschreiten des Grenzwertes auf 10 sek. gesetzt und beim beenden der Überbrückungszeit wieder auf 300 sek. zurückgesetzt.
Export! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="variables_set" id="LXo4C`;b@)UU^c]v/EAI" x="-87" y="-488"><field name="VAR">Timer_OFF_Läuft</field>
<value name="VALUE"><block type="logic_boolean" id="sY_DFgl2Yc0F/U,n@G,"><field name="BOOL">FALSE</field></block></value>
<next><block type="variables_set" id="gE{jkO_.!X!oD)gwvZt"><field name="VAR">Timer_Pause</field>
<value name="VALUE"><block type="logic_boolean" id="D9l%P;J;O=V#Oo5-17mu"><field name="BOOL">FALSE</field></block></value>
<next><block type="on_ext" id="d0[YYdZDI{r2(i+^H~6k"><mutation items="1"></mutation>
<field name="CONDITION">any</field><value name="OID0"><shadow type="field_oid" id="11:L)kD)[Xz/sF5_V-8y"><field name="oid">javascript.0.Power</field></shadow></value> <statement name="STATEMENT"><block type="controls_if" id="TIxyAkFg}uIhrY9iA-3q"><value name="IF0"><block type="logic_operation" id="SS`D8[tFc~.5lJ}pXrb+" inline="false"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="8kZq*60w-M-fT@%B{Y2N"><field name="OP">LT</field> <value name="A"><block type="get_value" id="`kczcX0[4W#a2}O:/F7g"><field name="ATTR">val</field> <field name="OID">javascript.0.Power</field></block></value> <value name="B"><block type="math_number" id="^Q=X6j3{eQChA2KG2@t5"><field name="NUM">1200</field></block></value></block></value> <value name="B"><block type="logic_operation" id="y^K5/WO892=Z.!v=LOAf" inline="false"><field name="OP">AND</field> <value name="A"><block type="logic_compare" id="5i/u:oMcC+*`+:0kz9j*"><field name="OP">EQ</field> <value name="A"><block type="variables_get" id="u8PqlwOo=HTT7]S?-Kod"><field name="VAR">Timer_OFF_Läuft</field></block></value> <value name="B"><block type="logic_boolean" id="{@4Q,[1+f]MHo:wy6DWw"><field name="BOOL">FALSE</field></block></value></block></value> <value name="B"><block type="logic_compare" id="S%fxdkj01LyX.)8?03Q#"><field name="OP">EQ</field> <value name="A"><block type="variables_get" id="VX{!I]BR*0wN~Fo4c+#i"><field name="VAR">Timer_Pause</field></block></value> <value name="B"><block type="logic_boolean" id="Qv5=n9FbQC8Z*m??]I3^"><field name="BOOL">FALSE</field></block></value></block></value></block></value></block></value> <statement name="DO0"><block type="comment" id=".(IcX/gt5#SuJxj5~mIE"><field name="COMMENT">Sendeintervall des Sonoff auf 10 sek. setzen</field> <next><block type="request" id="Iy+P(eO[~+-R{05^m]SO"><mutation with_statement="false"></mutation> <field name="WITH_STATEMENT">FALSE</field> <field name="LOG">log</field> <value name="URL"><shadow type="text" id=",;KnXC=[%HvM,8{C8JjZ"><field name="TEXT">http://Sonoff-IP/cm?cmnd=TelePeriod%2010</field></shadow></value> <next><block type="comment" id="uR#}+d;`CiEf@`zri@j/"><field name="COMMENT">Start des Ausschalttimers</field> <next><block type="timeouts_settimeout" id="3TdDK@x#TxN5}+?Ar-z]"><field name="NAME">timeout</field> <field name="DELAY">3</field> <field name="UNIT">min</field> <statement name="STATEMENT"><block type="controls_if" id="i;U(LK,:3*AG]7Cs[B3y"><value name="IF0"><block type="logic_compare" id="0rBeEYYqKav|-`dqI[Ti"><field name="OP">LT</field> <value name="A"><block type="get_value" id="*@N~e9|AT.=U^]~f@#i_"><field name="ATTR">val</field> <field name="OID">javascript.0.Power</field></block></value> <value name="B"><block type="math_number" id="c+cbZPZyjO8bb7xLzhf^"><field name="NUM">1200</field></block></value></block></value> <statement name="DO0"><block type="control" id="Sk[S,4ag_O%9P-Gy(A*)"><mutation delay_input="false"></mutation> <field name="OID">javascript.0.POWER</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="text" id="rLa35BO{Uw9.V)A::#5K"><field name="TEXT">OFF</field></block></value> <next><block type="comment" id="JYQf@e0OmDn[%N(@)|-@"><field name="COMMENT">Einschaltverzögerung</field> <next><block type="control" id="B`l9`[%OVU=7HyR}spOv"><mutation delay_input="true"></mutation> <field name="OID">javascript.0.POWER</field> <field name="WITH_DELAY">TRUE</field> <field name="DELAY_MS">40</field> <field name="UNIT">sec</field> <field name="CLEAR_RUNNING">FALSE</field> <value name="VALUE"><block type="text" id="C+zv`PhHS)~:0;?]!z[X"><field name="TEXT">ON</field></block></value> <next><block type="variables_set" id="?Hv(m@,+f^[=T,3q6Zpa"><field name="VAR">Timer_OFF_Läuft</field> <value name="VALUE"><block type="logic_boolean" id="Jrw+:tz{2=V2KZ)g)H8z"><field name="BOOL">FALSE</field></block></value> <next><block type="comment" id="+lS-5[0ZqcI[rdSN1*9}"><field name="COMMENT">Start der Überbrückungszeit</field> <next><block type="variables_set" id="@{5P:)vkgl0N6c(1X]jY"><field name="VAR">Timer_Pause</field> <value name="VALUE"><block type="logic_boolean" id="I.%87EjD.|`jl@#0Wp_M"><field name="BOOL">TRUE</field></block></value> <next><block type="timeouts_settimeout" id="0YA6M}B(8nvuPlvj00Yj"><field name="NAME">timeout2</field> <field name="DELAY">60</field> <field name="UNIT">sec</field> <statement name="STATEMENT"><block type="variables_set" id="n|%^RZ,;?VN*p-B5UA?{"><field name="VAR">Timer_Pause</field> <value name="VALUE"><block type="logic_boolean" id="qT,mAT@j]vk(*n#nqC=E"><field name="BOOL">FALSE</field></block></value> <next><block type="comment" id="2T}HLbLs#Q~Tde7#db7L"><field name="COMMENT">Sendeintervall des Sonoff auf 300 sek. setzten</field> <next><block type="request" id="k4pC}qfw1IN2J2q:a}i_"><mutation with_statement="false"></mutation> <field name="WITH_STATEMENT">FALSE</field> <field name="LOG">log</field> <value name="URL"><shadow type="text" id="1Kqkdwdfr_m11)hGXr~w"><field name="TEXT">http://Sonoff-IP/cm?cmnd=TelePeriod%20300</field></shadow></value></block></next></block></next></block></statement></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></statement></block></next></block></next></block></next></block></statement></block></statement></block></next></block></next></block></xml>