NEWS
Gartenbewässerung 5min ein; 10min Pause; 4 mal wiederholen.
-
Guten Abend zusammen,
ich bin gerade dabei meine Bewässerung für den Rasen zu realisieren.
Ich wollte mir ein bool setzen, welches ich auch anderen Programmen oder auch Tastern setzen kann.
"MyStates.Gartenbewässerung"
wenn dieser State auf "true" steht, sollte die Bewässerung für 5 min aktiv sein, dann 10 min Pause und das in einer Schleife von 3 mal.
Mein erster Versuch sieht wie folgt aus, aber sobald mein State auf true steht, wird die Funktion nur ein mal ausgelöst, glaub ich zumindest.
on({id: 'javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/', val: true}, function (obj) { function timer(start) { setTimeout(function () { //The timer log('Start der Bewässerung'); }, start*3000); //needs the "start*" or else all the timers will run at 3000ms } for(var start = 0; start < 3; start++) { timer(start); } });
Wenn ich nur
function timer(start) { setTimeout(function () { //The timer log('Start der Bewässerung'); }, start*3000); //needs the "start*" or else all the timers will run at 3000ms } for(var start = 0; start < 3; start++) { timer(start); }
als Script laufen lassen, dann wird das 3 mal ausgeführt.
Mit Blockly krieg ich garnichts hin. Das Wiederhole Dingen löst mit oder auch ohne Timeout direkt 3 mal aus. Ich meine gelesen zu haben, dass ein Timeout in einer schleife nicht berücksichtig wird.
Hat wer eine Idee für mein Problem??
Gruß und Vielen Dank.
-
@ple:sollte die Bewässerung für 5 min aktiv sein, dann 10 min Pause und das in einer Schleife von 3 mal. `
Für eine periodische Wiederholung gibt es setInterval(callback, interval). Etwa so:var interval = null; var count; on({id: 'javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/', val: true}, function () { count = 3; interval = setInterval(function() { setState('ID_der_Bewässerung', true); setTimeOut( function() { setState('ID_der_Bewässerung', false); count--; if(count === 0) clearInterval(interval); }, 5 * 3600000); }, 15 * 3600000); });
-
Besten Dank erst mal.
var interval = null; var count; on({id: "javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/, val: true}, function () { log("Trigger ausgelöst"); count = 5; interval = setInterval(function() { setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', true); log("einschalten"); setTimeOut( function() { log("ausschalten"); setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', false); count--; if(count === 0) clearInterval(interval); }, 1 * 3600000); }, 1 * 3600000); });
bei dem Code komme nur bis log(ausgelöst)
bis zum setState kommt er erst garnicht. Hast du vielleicht noch eine Idee??
Gruß
-
Hallo ple,
ich folgende unkonventionelle Lösung. Sie läuft (habs getestet).
! ```
`var aktor_array = ['true','false','false','true','false','false','true','false','false'];
var aufloesung = 5; // 5Sekunden // wenn Minuten dann noch * 60 oder gleich 300 eintragen
var idAktor = "AKTOR_ID.STATE"; // Das Ventil, das das Wassser rauslässt
var idTrigger= "javascript.0.MyStates.Gartenbewässerung"/Gartenbewässerung aktiv/;
! // ab hier nix mehr ändern
on({id:idTrigger, change: 'ne'}, function (obj) {
! var i=0;
if (obj.state.val) { // wenn trigger true
// repeat with the interval of 5 seconds
interval = setInterval(function(){
//setState(idAktor, aktor_array[i]; // Aktor ein/ausschalten
log(aktor_array[i]);
i++;
}, aufloesung * 1000);
! // Stoppen
setTimeout(function() {
clearInterval(interval);
}, aktor_array.length * aufloesung * 1000);} else { // wenn trigger false clearInterval(interval); }
});`
! Du trägst einen Aktor ein, der das Wassser steuert (ist noch auskommentiert).
! Du brauchst einen Trigger (eine ID, einen Taster oder ein Boolean-Objekt, das du vorher mit createStates() angelegt hast).
! Die Basis ist ein Array. Deine Zeiten waren 5min an und 10min aus. Ich habe das aufgeteilt in 5min an, 5min aus, nochmal 5min aus. Daraus ergibt sich bei einer Auflösung von 5min eine Abfolge von ein und aus, die ich im Array mit true und false abgebildet habe.
! Zum Test läuft das ganze jetzt im Sekundenzeitraum statt Minutenzeitraum. Du kannst es leicht auf Minuten umstellen.
! Zum Stoppen braucht e clearInterval. Entweder, wenn der Triger auf false geht oder wenn das Array abgearbeitet ist (hier, wenn die vorher errechnete Dauer zur Abarbeitung des Arrays verstrichen ist (setTimeout und Array-Länge mal Auflösung).
! Probier es einfach mal aus.
! Gruß
! Pix[/i][/i] -
@ple:bei dem Code komme nur bis log(ausgelöst) `
Ach ja, setInterval verzögert sofort. Dann besser so:var interval = null; var count; function pulse() { setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', true); log("einschalten"); setTimeOut( function() { log("ausschalten"); setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', false); count--; if(count === 0) clearInterval(interval); }, 1 * 3600000); } on({id: "javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/, val: true}, function () { log("Trigger ausgelöst"); count = 5; pulse(); interval = setInterval(pulse, 2 * 3600000); });
-
@pix:Hallo ple,
ich folgende unkonventionelle Lösung. Sie läuft (habs getestet).
! ```
`var aktor_array = ['true','false','false','true','false','false','true','false','false'];
var aufloesung = 5; // 5Sekunden // wenn Minuten dann noch * 60 oder gleich 300 eintragen
var idAktor = "AKTOR_ID.STATE"; // Das Ventil, das das Wassser rauslässt
var idTrigger= "javascript.0.MyStates.Gartenbewässerung"/Gartenbewässerung aktiv/;
! // ab hier nix mehr ändern
on({id:idTrigger, change: 'ne'}, function (obj) {
! var i=0;
if (obj.state.val) { // wenn trigger true
// repeat with the interval of 5 seconds
interval = setInterval(function(){
//setState(idAktor, aktor_array[i]; // Aktor ein/ausschalten
log(aktor_array[i]);
i++;
}, aufloesung * 1000);
! // Stoppen
setTimeout(function() {
clearInterval(interval);
}, aktor_array.length * aufloesung * 1000);} else { // wenn trigger false clearInterval(interval); }
});`
! Du trägst einen Aktor ein, der das Wassser steuert (ist noch auskommentiert).
! Du brauchst einen Trigger (eine ID, einen Taster oder ein Boolean-Objekt, das du vorher mit createStates() angelegt hast).
! Die Basis ist ein Array. Deine Zeiten waren 5min an und 10min aus. Ich habe das aufgeteilt in 5min an, 5min aus, nochmal 5min aus. Daraus ergibt sich bei einer Auflösung von 5min eine Abfolge von ein und aus, die ich im Array mit true und false abgebildet habe.
! Zum Test läuft das ganze jetzt im Sekundenzeitraum statt Minutenzeitraum. Du kannst es leicht auf Minuten umstellen.
! Zum Stoppen braucht e clearInterval. Entweder, wenn der Triger auf false geht oder wenn das Array abgearbeitet ist (hier, wenn die vorher errechnete Dauer zur Abarbeitung des Arrays verstrichen ist (setTimeout und Array-Länge mal Auflösung).
! Probier es einfach mal aus.
! Gruß
! Pix
! Da wäre ich im Leben nicht draufgekommen, mein Gott.
! Wie lange muss ich mich mit Java beschäftigen um das zu verstehen, geschweige den Syntax auswendig zu können.
! Ich werde es morgen mal testen, nachdem ich den Robi für Mähen installiert habe.
! Werde berichten.
! Gruß[/i][/i]
``` ` -
@pix:ich folgende unkonventionelle Lösung. Sie läuft (habs getestet). `
Mit der Lösung kann nur ein Tastverhältnis Ein:Aus von 1:1 erzeugt werden. -
Hallo,
eigentlich war das nicht so schwer. Es dauert länger, eine verständliche Erklärung zu formulieren.
Du kannst das Array natürlich auch ändern.
true true false false true false true false
= 10min an, 10min aus, 5min an, 5min aus, 5min an, 5min aus
oder du ändert die auflösung auf zehn Minuten:
true true true false true true false true false
= 30min an, 10min aus, 20min an, 10min aus, 10min an, 10min aus
Und unter das clearInterval() kannste du noch ein setState(idAktor, false) setzen, damit das Ventil auch wirklich zugeht, wenn Schluss ist oder vorher abgebrochen wird.
Und falls du die Auflösung sehr klein wählst und true oder false sich häufig wiederholen, kannst du vor dem setState noch abfragen, ob der alte Zustand anders als der neue Zustand ist. Also nur einschalten, wenn aus und ausschalten, wenn gerade aus. Das spart Funk.
Gute Nacht
Pix
-
@ple:bei dem Code komme nur bis log(ausgelöst) `
Ach ja, setInterval verzögert sofort. Dann besser so:var interval = null; var count; function pulse() { setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', true); log("einschalten"); setTimeOut( function() { log("ausschalten"); setState('hm-rpc.0.MEQ1671056.1.STATE"/*Garten_Steckdose:1.STATE*/', false); count--; if(count === 0) clearInterval(interval); }, 1 * 3600000); } on({id: "javascript.0.MyStates.Gartenbewässerung"/*Gartenbewässerung aktiv*/, val: true}, function () { log("Trigger ausgelöst"); count = 5; pulse(); interval = setInterval(pulse, 2 * 3600000); }); ```` `
Geht fast
javascript.0 2017-06-21 22:41:16.714 error Error in callback: ReferenceError: setTimeOut is not defined javascript.0 2017-06-21 22:41:16.713 info script.js.Programme.Gartenbewässerung3: einschalten javascript.0 2017-06-21 22:41:16.711 info script.js.Programme.Gartenbewässerung3: Trigger ausgelöst javascript.0 2017-06-21 22:41:03.830 info script.js.Programme.Gartenbewässerung3: registered 1 subscription and 0 schedules
Ich muss mir auch mal bald Gedanken machen über einen Killoff oder so. Nicht das ich mal 15 qm Wasser auf dem Rasen verteile.
im Moment ist das noch in der ccu mit 20 min.
-
Hallo Paul,
@paul53:@pix:ich folgende unkonventionelle Lösung. Sie läuft (habs getestet).
Mit der Lösung kann nur ein Tastverhältnis Ein:Aus von 1:1 erzeugt werden.
ich weiß nicht genau, was du meinst. Natürlich werden (bei Auflösung 5s) eben nur alle 5s Befehle (ein oder aus) gesendet.Sieht bei mir im Log so aus. Achte auf die Zeiten:
22:40:42.830 [info] javascript.2 Start javascript script.js.Test.Test_Intervall 22:40:42.830 [info] javascript.2 script.js.Test.Test_Intervall: registered 1 subscription and 0 schedules 22:40:55.427 [info] javascript.2 script.js.Test.Test_Intervall: true 22:41:00.429 [info] javascript.2 script.js.Test.Test_Intervall: false 22:41:05.430 [info] javascript.2 script.js.Test.Test_Intervall: false 22:41:10.437 [info] javascript.2 script.js.Test.Test_Intervall: true 22:41:15.440 [info] javascript.2 script.js.Test.Test_Intervall: false 22:41:20.444 [info] javascript.2 script.js.Test.Test_Intervall: false 22:41:25.446 [info] javascript.2 script.js.Test.Test_Intervall: true 22:41:30.449 [info] javascript.2 script.js.Test.Test_Intervall: false
Pix
-
@ple:javascript.0 2017-06-21 22:41:16.714 error Error in callback: ReferenceError: setTimeOut is not defined `
Sorry: Schreibfehler. Richtig:setTimeout( function() {
-
Ok, jetzt gehts ohne Fehlermeldung, aber leider bleibt er durchgehend eingeschaltet.
Er läuft nicht durch das ausschalten.
Morgen mal weiterrücken:-(