NEWS
Mehrere Trigger fuer eine bestimmte Zeit abfangen (z.B. Sturmklingeln) (Blockly)
-
Hi,
ich habe in Blockly einen Trigger auf einen Schalter (Klingel) woraufhin Sachen ausgefuehrt werden. Jetzt wuerde ich gerne wenn dieser Schalter betaetigt wird weitere Betaetigungen abfangen fuer eine Bestimmte Zeit (z.B. 20 Sekunden).
Wahrscheinlich ist das ganz einfach, ich konnte aber im Forum nichts finden.
Ich meine, wenn ich einen Trigger habe und dann z.B. ein Timeout irgendwo einbaue wuerde ja jedes mal ein neues Timeout gestartet.
Ich schaetze, ich habe einfach ein Brett vor dem Kopf.
Waere klassen, wenn jemand mir einmal das Prinzip (am liebsten in Blockly) erlaeutern koennte…
-
Ich habe das bei meiner Klingel so gelöst…
/* debouncing, executes the function if there was no new event in $wait milliseconds @param func @param wait @param immediate (boolean) @returns {Function} */ function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }
Aufruf mit:
on({id: 'rpi2.0.gpio.xy.state', val: false}, debounce(function (obj) { <hier wird/etwas/gemacht=""> },1000, true));</hier>
1000=Verzögerung in ms
true=Reagiere gleich beim 1. Event (bei false würde erst nach Ablauf des Timer reagiert)
-
Schreib doch mal bitte "Blockly" mit in den Thread-Namen rein, dann fühlen sich die Blockly-Experten auch direkt angesprochen!
Und zeige mal bitte, was du schon im Blockly zusammengeklickt hast, als Screenshot und als Export.
Enrico
-
Ich habe das bei meiner Klingel so gelöst…
...
1000=Verzögerung in ms
true=Reagiere gleich beim 1. Event (bei false würde erst nach Ablauf des Timer reagiert) `
Danke, ich steige da noch nicht ganz durch, ich versuche das morgen nochmal zu verstehen.
Enrico: OK, geaendert, vielleicht hat es ja auch noch einer in Blockly, ist fuer den Einstieg einfacher zu verstehen.
-
Was noch fehlt, ist der Screenshot von deinem Blockly!
Enrico
-
Ja, nein, ich habe da keinen Screenshot. Mir fehlt ja irgendwo der richtige Ansatz.
Ich kann zwar jetzt n Trigger mit nem leeren Timeout zusammenklicken, aber das scheint mir ja nicht sinnvoll, weil dann ja immer ein neuer Timeout getriggert wird, was ja irgendwie zu nix fuehrt, glaube ich.
Mir fehlt da so der Grundansatz was wirklich gebraucht wird und und wo hinkommt…
Ich meine im JS-Beispiel da oben wird ja eine Funktion genutzt. Habe ich bisher noch nichts mit gemacht, hoert sich auf der anderen Seite nicht unlogisch an.
Ich schlafe da mal drueber, vielleicht bekomme ich mit dem Ansatz morgen doch was zusammengeklickt.
Falls einer trotzdem noch gute Tipps hat in der Zwischenzeit nehme ich die auch gerne an
-
ich habe in Blockly einen Trigger auf einen Schalter (Klingel) woraufhin Sachen ausgefuehrt werden. `
Du hast doch aber geschrieben, dass du schon ein Blockly hast, wo die Klingel schon was auslöst. Und da würde ich dir gern den Zusatz zur Verhinderung des Sturmklingelns einarbeiten!
Enrico
-
Achso, ja klar, das ist kein Problem!
Machen wir mal gerade zwei Sachen an dieser Stelle, ich hatte heute noch so eine Idee das mit einer Hilfsvariable im Script zu machen.
Ich habe das noch nicht probiert, aber theoretisch muesste das doch so funktionieren, da die Variable ja innerhalb des Scriptes besteht und wenn der Trigger erneut ausloest durchlaeuft er nur die Bedingung mit was drin, wenn die Zeit noch nicht abgelaufen ist. D.h. alle zwei Sekunden darf jemand ein Klingeln ausloesen.
Wenn das grundsaetzlich richtig ist bin ich a) froh und b) frage ich mich, ob es noch elegantere Wege gibt oder einfach bessere das zu schreiben.
So, dass ist das eine…
3803_firefox_2017-11-23_16-41-37.png -
…das andere, wenn du das aktuelle moechtest, dann geht das natuerlich, das sieht so aus:
! <xml 1999/xmlns="<URL url=" http:/www.w3.org/xhtml"="">http://www.w3.org/1999/xhtml">
! <block type="on_ext" id="9vjVtq}Y4ZYV.#jTK2S" x="763" y="-612"><mutation items="1"></mutation>
! <field name="CONDITION">any</field>
! <value name="OID0"><shadow type="field_oid" id="kJ@M^!Cu%Wpje~=5g?Xn"><field name="oid">hm-rpc.0.LEQ0176404.3.INSTALL_TEST</field></shadow></value>
! <statement name="STATEMENT"><block type="control" id="8Zu3F(pQ}?hc0f[^VMq2"><mutation delay_input="false"></mutation>
! <field name="OID">hm-rpc.0.LEQ1433763.2.STATE</field>
! <field name="WITH_DELAY">FALSE</field>
! <value name="VALUE"><block type="logic_boolean" id="-,]oX|543Vnn#q8-%AQ^"><field name="BOOL">TRUE</field></block></value>
! <next><block type="pushover" id="RCVrT5LAYCAas9P@a64"><field name="SOUND">incoming</field>
! <field name="PRIORITY">0</field>
! <value name="MESSAGE"><shadow type="text" id="}W^80lZ}-I/4aHL%I}="><field name="TEXT">Klingel Nico</field></shadow></value>
! <value name="TITLE"><block type="text" id="RZLbJrnBxzwf8QN,1}~O"><field name="TEXT">Ein Tuerereignis ist eingetreten</field></block></value>
! <next><block type="telegram" id="OGm4bts2;CZDBe.Pk9R?"><value name="MESSAGE"><shadow type="text" id="mSLJ%kPe~2Np{W5`Xk5b"><field name="TEXT">Klingel Nico</field></shadow></value>
! <next><block type="sayit" id=":tX1E8)H~N(stQ2vuMD"><field name="INSTANCE">.2</field>
! <field name="LANGUAGE">en-GB_AP_Male</field>
! <value name="VOLUME"><block type="math_number" id="Vv(4u]5|saH=-Uac?B)("><field name="NUM">75</field></block></value>
! <value name="MESSAGE"><shadow type="text" id="8^}DvffG~)/}x4G~lvt("><field name="TEXT">Doorbell Nico</field></shadow></value>
! <next><block type="control" id="%=wyoyrNVN;u/ogR5-Na"><mutation delay_input="false"></mutation>
! <field name="OID">hm-rpc.0.LEQ1433763.1.SUBMIT</field>
! <field name="WITH_DELAY">FALSE</field>
! <value name="VALUE"><block type="text" id="_yR:QOZR2NrsHHqMutl2"><field name="TEXT">1,1,108000,34,2,34,2,34,2,34,2,34,2</field></block></value></block></next></block></next></block></next></block></next></block></statement></block></xml>
3803_firefox_2017-11-23_16-47-58.png -
Ich habe das noch nicht probiert, aber theoretisch muesste das doch so funktionieren, da die Variable ja innerhalb des Scriptes besteht und wenn der Trigger erneut ausloest durchlaeuft er nur die Bedingung mit was drin, wenn die Zeit noch nicht abgelaufen ist. D.h. alle zwei Sekunden darf jemand ein Klingeln ausloesen. `
Das mit der Variable sollte so stimmen. Es fehlt aber noch die eigentliche Aktion unter "Klingelaktion ausführen".
Wenn ich die ganzen Profis hier richtig verstanden habe, wäre es auch noch gut, wenn du den Timeout noch beendest, also in den Timeout noch den Baustein "stop Timeout"!
Was dein zweites Blockly angeht, verstehe ich nicht so recht auf was du da triggerst. Was ist das für ein HM-Gerät, wo man "Install_Test" triggert?
Enrico
-
Wenn ich die ganzen Profis hier richtig verstanden habe, wäre es auch noch gut, wenn du den Timeout noch beendest, also in den Timeout noch den Baustein "stop Timeout"! `
Einen Timeout sollte man beenden bevor man ihn erneut aufruft. Da hast Du vollkommen Recht.In dem Beispiel kann der Timeout aber nicht mehrmals aufgerufen werden.
Aber eine sinnvolle Aktion sehe ich da auch nicht.
Grüße
-
Ich sehe, ich stifte Verwirrung…
Da ich keine CCU habe triggert der Homematictaster immer nur INSTALL_TEST statt PRESS_SHORT. Daher nehme ich das als Trigger. Funktioniert auch soweit, kein Problem.
Das eine ist das aktuelle Klingelscript wo RappiRN gerne die Funktion reinbauen wollte, daher habe ich das gepostet. Das ist auch das, was aktuell bei mir laeuft.
Das andere wo nur der Kommentar "Klingelaktion ausfuehren" drinsteht ist die Idee, die ich habe, um mehrere Trigger in kurzer Zeit anzufangen. Das hinterher an die Kommentarstelle "Klingelaktion ausfuehren" der ganze Kram der ausgefuehrt werden soll rein muss, also das, was in meinem aktuellen Script ausgefuehrt wird, ist klar. Das ist nur gerade ein Platzhalter um die Sache mit den Triggern abfangen an sich zu diskutieren, ich wollte da nicht meinen fetten Block jetzt schon reinhauen der so unuebersichtlich ist.
Wenn das mit dem Timeout und dem if richtig ist muss ich das ja nur hinterher in das aktuelle Script einfuegen.
Und den Timeout, wenn ich das jetzt richtig durchdenke, will ich ja gerade NICHT beenden, zumindest nicht, bevor er abgelaufen ist, sonst kann ich ja wieder durchgehend klingeln.
Wenn der Timeout abgelaufen ist, also innerhalb des if, nach dem timeout, muss ich den doch nicht extra beenden, weil er dann ja sowieso abgelaufen ist, oder muss man abgelaufene Timeouts auch noch extra beenden?
Kann man das jetzt verstehen, was ich bezwecke?
-
Und den Timeout, wenn ich das jetzt richtig durchdenke, will ich ja gerade NICHT beenden, zumindest nicht, bevor er abgelaufen ist, sonst kann ich ja wieder durchgehend klingeln.
Wenn der Timeout abgelaufen ist, also innerhalb des if, nach dem timeout, muss ich den doch nicht extra beenden, weil er dann ja sowieso abgelaufen ist, oder muss man abgelaufene Timeouts auch noch extra beenden? `
Hatte ich doch geschrieben. In Deiner Konstellation muss der Timer nicht beendet werden.Dein Timer kann ja nur wieder gestartet werden wenn er beendet ist.
Grüße
-
Danke, ich wollte auch nur sicher sein. Nur nicht, dass es Grundsaetzlich anders sein soll, ich gewoehne mir das an, und hinterher wundere ich mich, warum die Haelfte nicht funktioniert oder sowas. Administration ist mir nicht fremd, aber Programmieren ist einfach doch sehr neu fuer mich, da will ich nicht gleich bei den grundsaetzlichen Sachen mir Fehler angewoehnen…