NEWS
[gelöst]Zeitschaltung Bewässerung
-
Hallo,
habe mir in VIS Buttons angelegt für eine Gartenbewässerung.
~~<link_text text="http://forum.iobroker.net/download/file ... 48a75c3604">http://forum.iobroker.net/download/file.php?mode=view&id=8450&sid=10f0177e16903bad45275e48a75c3604</link_text>" />
Ich will die Zeit vorgeben und dann den jeweiligen Bewässerungskreis öffnen.
Hardwareseitig ist es über einen 4-fach Funkschaltaktor gelöst.
Den Schaltaktor kann ich schalten und die Zeit kann ich auch auswählen.
Die Zeitauswahl habe ich über das Countdownprogramm von Pix gelöst.
Lasse jeweils die Minuten runter zählen.
/* Countdown 01.08.2016 pix */ var interval = null; var countdown = 60 * 1000; // 60min * 60s * 1000ms createState('Countdown.Sleeptimer.countdown', seconds2text(countdown), {name: 'Sleeptimer Countdown / Restzeit', type: 'string'}); createState('Countdown.Sleeptimer.countdown_seconds', countdown, {name: 'Sleeptimer Countdown / Restzeit in s', type: 'number', def: countdown}); createState('Countdown.Sleeptimer.afterCount', {name: 'Sleeptimer Countdown / afterCount', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.countTrigger', {name: 'Sleeptimer Countdown / countTrigger', type: 'boolean', def: false}); var idCountdown = 'javascript.'+ instance +'.Countdown.Sleeptimer.countdown', idCountdown_sec = 'javascript.'+ instance +'.Countdown.Sleeptimer.countdown_seconds', idAfterCount = 'javascript.'+ instance +'.Countdown.Sleeptimer.afterCount', idTrigger = 'javascript.'+ instance +'.Countdown.Sleeptimer.countTrigger'; // SPEZIFISCHE UMSETZUNG für a-flow createState('Countdown.Sleeptimer.trigger10min', {name: 'Sleeptimer 10min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger15min', {name: 'Sleeptimer 15min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger30min', {name: 'Sleeptimer 30min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger45min', {name: 'Sleeptimer 45min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger60min', {name: 'Sleeptimer 60min Timer', type: 'boolean', def: false}); var id10min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger10min', id15min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger15min'; id30min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger30min'; id45min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger45min'; id60min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger60min'; // Countdown function seconds2text(_seconds) { var sec_num = parseInt(_seconds, 10); // don't forget the second param var hours = Math.floor(sec_num / 3600); var minutes = Math.floor((sec_num - (hours * 3600)) / 60); var seconds = sec_num - (hours * 3600) - (minutes * 60); var time; if (hours > 0) { // if (hours < 10) {hours = "0" + hours;} if (minutes < 10) {minutes = "0" + minutes;} if (seconds < 10) {seconds = "0" + seconds;} // time = hours + ' Stunden, ' + minutes + ' Minuten und ' + seconds + ' Sekunden'; // original time = hours + ':' + minutes + ':' + seconds + ' Std.'; } else if (minutes > 0) { if (minutes < 10) {minutes = "0" + minutes;} if (seconds < 10) {seconds = "0" + seconds;} // time = minutes + ' Minuten und ' + seconds + ' Sekunden'; // original time = minutes + ':' + seconds + 'min'; } else { if (seconds < 10) {seconds = "0" + seconds;} // time = seconds + ' Sekunden'; // original time = seconds + ' s'; } return time; } function count() { // remove trigger if (getState(idTrigger).val) setState(idTrigger, false); // Abbruch bei Knopfdruck if ( getState(id15min).val || getState(id30min).val || getState(id45min).val ) { setState(idCountdown, 0); setState(idAfterCount, false); clearInterval(interval); interval = null; } if (countdown > 1) { setState(idCountdown_sec, parseInt(countdown,10)); setState(idCountdown, seconds2text(--countdown)); } else { clearInterval(interval); interval = null; setState(idCountdown_sec, 0); setState(idCountdown, seconds2text(0)); setState(idAfterCount, true); } } on(idTrigger, function (obj) { if (obj.state.val) { setState(idCountdown_sec, parseInt(countdown,10)); setState(idCountdown, seconds2text(countdown)); setState(idAfterCount, false); if (!interval) { count(); interval = setInterval(count, 1000); } } }); // wenn idAfterCount true wird, kann eine Aktion ausgeführt werden on(idAfterCount, function (obj) { if (obj.state.val) { log('Countdown abgelaufen'); // weitere Aktionen einfügen } }); // Taster für VIS createState('Countdown.Sleeptimer.trigger10min', {name: 'Sleeptimer 10min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger15min', {name: 'Sleeptimer 15min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger30min', {name: 'Sleeptimer 30min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger45min', {name: 'Sleeptimer 45min Timer', type: 'boolean', def: false}); createState('Countdown.Sleeptimer.trigger60min', {name: 'Sleeptimer 60min Timer', type: 'boolean', def: false}); var id10min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger10min', id15min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger15min'; id30min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger30min'; id45min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger45min'; id60min = 'javascript.'+ instance +'.Countdown.Sleeptimer.trigger60min'; function sleeptimer(dauer) { if (interval) { // wenn Countdown schon läuft clearInterval(interval); interval = null; setState(idCountdown_sec, parseInt(0,10)); setState(idCountdown, seconds2text(0)); log(dauer + 'min Sleeptimer gestoppt'); } else { countdown = dauer * 60; // Dauer festlegen (in Minuten) setState(idTrigger, true); // Countdown starten log(dauer + 'min Sleeptimer gestartet'); } } on(id10min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(10); // 10min Zeit übergeben setStateDelayed(id10min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id15min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(15); // 15min Zeit übergeben setStateDelayed(id15min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id30min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(30); // 30min Zeit übergeben setStateDelayed(id30min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id45min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(45); // 45min Zeit übergeben setStateDelayed(id45min, false, 250); // nach viertel Sekunde wieder auf false } }); on(id60min, function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(60); // 60min Zeit übergeben setStateDelayed(id60min, false, 250); // nach viertel Sekunde wieder auf false } });
Wie löse ich es aber, dass ich erst die Zeit auswähle und dann die Bewässerung einschalte.
Wie kann man die zwei Button miteinander "verknüpfen"?
Oder mal anders gefragt, gibt es eine Möglichkeit über zwei Button (vielleicht Plus und Minus) die Zeit vorzugeben und dann erst die Pumpe zu schalten?
Suche schon den ganzen Tag. Habe aber leider keinen Plan wie ich das lösen könnte. Sorry!
Gruss Superdad~~
1653_bildschirm.jpg -
Hi,
evtl. so (Ich habe leider nichts fertiges für Dich, soll eher ein Denkanstos sein):
1. mit createState ein Objekt Typ Number z.B. BewaesserungsZeit
und noch ein Objekt Typ boolean BewaesserungsStart
2. Im Vis 2 Button Increment (jqui Adapter für vis muss glaube ich installiert sein) einfügen. Beide mit dem Objekt BewaesserungsZeit verknüpfen.
Bei einem unter Schritt mit z.B. 2 wird die Zeit um 2 nach oben gesetzt (als Text z.B. +)
Bei dem anderen mit -2 dementsprechend nach unten (als Text z.B -)
Um zu sehen welche Zeit gerade gesetzt ist… im Vis noch ein Widget zum Anzeigen des Objekts BewaesserungsZeit einfügen
Jetzt noch einen Button um den Status von BewaesserungsStart auf true zu setzen
3. Dein Script anpassen mit On ... das Objekt BewaesserungsStart abfragen.
on("javascript.0.BewaesserungStart", function (obj) { // bei jeder Änderung if (obj.state.val) { sleeptimer(getState("javascript.0.BewaesserungZeit").val); } });
Gruß
Phantomio
-
Ich habe echt keine Ahnung!
Kann mir jemand helfen?
Habe jetzt wieder den ganzen Tag "verspielt".
Verschieden Code und Scenen probiert.
Und nicht zum Erfolg gekommen.
Zweimal musste ich neu starten, da ioBroker voll ausgelastet war und ich nichts mehr machen konnte.
Würde denn folgendes funktionieren?
// Bewaesserungskreis 1 var counter = getState("javascript.0.Countdown.Sleeptimer.countdown").val; on({id: "hm-rpc.0.NEQ1316670.1.STATE", val: true}, function() { if (counter) { setState('hm-rpc.0.NEQ1316670.1.ON_TIME', counter ); // Zeit an on_Time übergeben setState('hm-rpc.0.NEQ1316670.1.STATE', true); // Ventil einschalten setState("hm-rpc.0.NEQ1316670.4.STATE", true); // Pumpe einschalten } else if (counter < 0) { setStateDelayed("m-rpc.0.NEQ1316670.1.STATE", false); // Ventil ausschalten setStateDelayed("hm-rpc.0.NEQ1316670.4.STATE", false); // Pumpe ausschalten }
Bevor ich wieder alles neu starten muss und dann mein Synology vielleicht noch abkratzt.
Gruss Superdad
P.S. habe ich vergessen: Ich möchte die Zeit auswählen und dann das Widget für Start Pumpe drücken.
-
Also,
ich hab mir jetzt auch mal sowas gebastelt:
- Anlage Variablen
Du legst manuell bei Objekten Variablen an (dann brauchst du dies nicht im Script zu machen-> hält das Script schmaler und übersichtlicher)
filename="bild1.jpg" index="0">~~
Countdown ist ZahlTrigger ist boolean
Zeitvorgabe ist Zahl
- Countdown Script
! ````
// Countdown Brunnen
! var count,timer;
! function countdown(){
count--;
if(count > 0) setState('javascript.0.Countdown.Brunnen.countdown', count);
else {
setState('javascript.0.Countdown.Brunnen.countTrigger', false );
}
}
! on({id: "javascript.0.Countdown.Brunnen.countTrigger", change: "ne"}, function(obj){
if(obj.state.val) {
count = getState('javascript.0.Countdown.Brunnen.Zeitvorgabe').val; // in Minuten
setState('javascript.0.Countdown.Brunnen.countdown', count);
timer = setInterval(countdown, 60000); // 1000 = 1 Sek. ; 60000 = 60 Sek.
} else {
clearInterval(timer);
setState('javascript.0.Countdown.Brunnen.countdown', 0 );
}
});3) Widget in vis : filename="bild2.jpg" index="1">~~ Brunnen-Symbol ist ein "hywidget on/off" Die blaue Leiste ist ein "radiobuttons valuelist" Dort schreibst du bei Werte und bei Texte: 15;30;60;90;120 Das gelbe Widget "Sting" zeigt die verbleibende Zeit an. 4) Script Folgendes Script anlegen: >! ```` // Brunnen: Ausschalten nach x Minuten >! function weiter() { var Zeitvorgabe = getState('javascript.0.Countdown.Brunnen.Zeitvorgabe').val ; log (Zeitvorgabe); if (Zeitvorgabe === 0 || Zeitvorgabe === isNaN) Zeitvorgabe = 30; setState('hm-rpc.0.KEQ0926502.1.STATE', true); // Aktor Terrasse-Strom ein setStateDelayed("hm-rpc.0.LEQ0129396.1.STATE", true, 10000); // nach 10 Sek. Brunnen-Wasser ein setStateDelayed("hm-rpc.0.LEQ0129396.2.STATE", true, 10000); // nach 10 Sek. Brunnen-Licht ein >! // Countdown starten für Anzeige der Zeit auf View setState('javascript.0.Countdown.Brunnen.countTrigger', true); // Countdown Brunnen starten setStateDelayed("hm-rpc.1.CUX0200005.1.STATE", 0, (Zeitvorgabe*60*1000)); // nach x Min. ausschalten -> Cux: Brunnen sendTo('telegram', "Brunnen eingeschaltet. \nNach " + (Zeitvorgabe*60*1000) + " Minuten wird er wieder automatisch ausgeschaltet."); log ("Brunnen eingeschaltet. Nach " + (Zeitvorgabe*60*1000) + " Minuten wird er wieder automatisch ausgeschaltet."); } >! function weiter2() { setState("hm-rpc.0.LEQ0129396.1.STATE", false); // Brunnen-Wasser aus setState("hm-rpc.0.LEQ0129396.2.STATE", false); // Brunnen-Licht aus setStateDelayed('hm-rpc.0.KEQ0926502.1.STATE', false, 5000); // nach 5 Sek. Aktor Terrasse-Strom aus sendTo('telegram', "Brunnen ausgeschaltet."); log ("Brunnen ausgeschaltet."); setState('javascript.0.Countdown.Brunnen.countTrigger', false); // Countdown Brunnen aus } >! on({id: "hm-rpc.1.CUX0200005.1.STATE", change: "ne", val: 1}, function() { // Cux: Brunnen ein log("Auslöser Schalter - Cux: Brunnen ein"); weiter(); }); >! on({id: "hm-rpc.1.CUX0200005.1.STATE", change: "ne", val: 0}, function() { // Cux: Brunnen aus log("Auslöser Schalter - Cux: Brunnen aus"); weiter2(); }); >! ```` Ich hatte mir dafür mal ne Cux.Variable in Homematic angelegt. Diese cux überwache ich mit on. Wenn noch Fragen sind meld dich. mfg Dieter
-
Vielen, vielen Dank!
Probiere ich gleich mal aus.
Gruss
-
-
Hallo Dieter,
jetzt brauch ich doch deine Hilfe.
Habe die Variablen angelegt.
Nicht unter Brunnen, da ich den Ordner nicht anlegen kann.
Sind unter Countdown angelegt.
Dein Script habe ich dementsprechend geändert.
Das string-Widget verknüpft mit Countdown.countdown.
Das radiobuttons valuelist ebenfalls mit Countdown.countdown.
Das hywidget on/off hast du bestimmt mit "hm-rpc.1.CUX0200005.1.STATE" von deinem Script verknüpft?
Oder wie schaltest du das Ganze ein?
Wie lege ich das in CuxD an?
CuxD habe ich installiert. Hatte dort schon eine Fernbedienung angelegt. Natürlich auch mit Hilfe vom Homematic-Forum.
-
nicht ganz richtig.
mit radiobuttons gibt doch doch die laufzeit vor:
also verknüpfen mit Zeitvorgabe
filename="bild1.jpg" index="0">~~Das string-Widget verknüpft mit Countdown.countdown.
ja, richtig.
Wie lege ich das in CuxD an?
cux brauchst du nicht.
Lege einfach eine neue Variable an mit der du an/aus machen willst z.B. 'javascript.0…....'
und die trägst du dann bei den on's ein.
mfg
-
Mal eine Rückmeldung von mir.
Es funktioniert sehr gut.
Vielen Dank noch einmal.
Wie baut man eine Schleife oder Funktion ein wenn man drei Bewässerungskreise hat?
Und kann man die Zeitvorwahl auch abbrechen? Wenn man sich z.Bsp. vertippt hat?
Habe es gestern schon probiert mit dem Countdown von Pix. Bekomme es aber nicht hin.
Hänge mal das Script an wie es jetzt bei mir läuft.
// Pumpe: Ausschalten nach x Minuten function weiter() { var Zeitvorgabe = getState('javascript.0.Countdown.Zeitvorgabe').val ; // Zeit auswählen log (Zeitvorgabe); if (Zeitvorgabe === 0 || Zeitvorgabe === isNaN) Zeitvorgabe = 30; setStateDelayed("hm-rpc.0.NEQ1316670.1.STATE", true); // Kreis 1 Ventil einschalten setStateDelayed("hm-rpc.0.NEQ1316670.4.STATE", true, 1000); // nach 1 Sek. Pumpe ein // Countdown starten für Anzeige der Zeit auf View setState('javascript.0.Countdown.countTrigger', true); // Countdown Brunnen starten setStateDelayed("javascript.0.AnAus", 0, (Zeitvorgabe*60*1000)); // nach x Min. ausschalten -> Pumpe //sendTo('telegram', "Brunnen eingeschaltet. \nNach " + (Zeitvorgabe*60*1000) + " Minuten wird er wieder automatisch ausgeschaltet."); //log ("Brunnen eingeschaltet. Nach " + (Zeitvorgabe*60*1000) + " Minuten wird er wieder automatisch ausgeschaltet."); } function weiter2() { setState("hm-rpc.0.NEQ1316670.1.STATE", false); // Brunnen-Wasser aus setState("hm-rpc.0.NEQ1316670.4.STATE", false); // Brunnen-Licht aus //sendTo('telegram', "Brunnen ausgeschaltet."); //log ("Brunnen ausgeschaltet."); setState('javascript.0.Countdown.countTrigger', false); // Countdown Brunnen aus setState('javascript.0.Countdown.Zeitvorgabe', 0); // Zeitvorwahl auf Null setzen } on({id: "javascript.0.AnAus", change: "ne", val: 1}, function() { // Bewaesserung Kreis1 einschalten //log("Auslöser Schalter - Cux: Brunnen ein"); weiter(); }); on({id: "javascript.0.AnAus", change: "ne", val: 0}, function() { // Bewaesserung Kreis1 ausschalten //log("Auslöser Schalter - Cux: Brunnen aus"); weiter2(); });
Gruss Andreas
-
Wie baut man eine Schleife oder Funktion ein wenn man drei Bewässerungskreise hat?
Einfach 3 Scripte schreiben.
Und kann man die Zeitvorwahl auch abbrechen? Wenn man sich z.Bsp. vertippt hat?
Das versteh ich nicht. Wo denn vertippt?
Die Zeitvorwahl kannst du doch mit dem widget radiobutton auswählen. Wo kann man sich vertippen.
Und was meinst du mit Zeitvorwahl abbrechen?
Wenn du meinst, die Zeit vorzeitig zu beenden, dann musst du den trigger auf false setzen.
Habe es gestern schon probiert mit dem Countdown von Pix. Bekomme es aber nicht hin.
Was hast du wie probiert?
mfg
Dieter
-
3 Scripte habe ich schon.
Was anderes ist mir nicht eingefallen. Bzw. hab ich was anderes nicht hin bekommen.
Mit vertippen meine ich, wenn man auf dem widget radiobutton auf 10min. getippt hat und eigentlich 15min. wollte.
Ich hatte das Script von Pix (siehe 1. Beitrag) genommen und dann die Zeit in dein Script übergeben.
Und dann versucht zu starten. Aber irgendwie habe ich es nicht zum laufen gebracht.
Wollte es nur ausprobieren, weil man in dem Script von Pix ebend die Zeitvorwahl abbrechen und dann neu eintippen kann.
Versuche es mal mit dem Trigger auf false.
Danke und Gruss!
-
Mit vertippen meine ich, wenn man auf dem widget radiobutton auf 10min. getippt hat und eigentlich 15min. wollte.
Du musst in dem widget die Zeit eintragen die du willst.
Wenn du 15 min. willst warum schreibt du dann nicht 15 min hin ????????
Hier hatte ich das schon beschrieben.
filename="bild1.jpg" index="0">~~mfg
-
Hallo Dieter,
@bahnuhr:Wenn du 15 min. willst warum schreibt du dann nicht 15 min hin ???????? `
Hat er doch!
Er hat nur mit seinem Wurschtfingern den falschen Button getippt!
Ruhig Brauner!
-
Hat er doch!
Woran siehst du das, dass er das hat.
mfg
-
Woran siehst du das, dass er das hat. `
Weil bei dir im code keine 10 Minuten vorkommen.Und wenn er einen 10 Minuten Button hat, hat er die Zeiten angepasst.
Den Rest hast du zitiert.
Gruß
Rainer
-
-
auf hessisch:
nicht: wurst
sondern: wurscht
-
Hier noch der Beweis mit der 10.
~~[attachment=0]~~Beregnung.jpg[/attachment]" />
Gruss
-
sieht ja cool aus, respekt.
Funktioniert das jetzt mit 10 oder 15 oder wie auch immer.
-
Habe ich noch nicht geschafft.
Ich kann 10min. auswählen und dann Pumpe drücken und es läuft.
Wenn ich wieder Pumpe drücke ist es aus. Wenn ich unter VIS Objekte schaue, dann ist es da auch Null.
Nur in der VIS-Anzeige ist die 10 weiterhin weiss unterlegt.
Aber vielleicht ist das ja auch ein Problem von VIS? Das es sich da nicht aktualisiert.