NEWS
[gelöst]Einschalten mit Nachlauf
-
Hallo,
Ich möchte gerne einen Homematic Schaltaktor einschalten und dann Verzögert ausschalten.
ich komme aus der fhem Welt. Da war das keine Thema. einfach einen Wert in on-for-timer und schon hats funktioniert.
In ioBroker geht das bestimmt ähnlich einfach. Nur sehe ich den Wald vor lauter Bäumen glaub ich nicht.
Ich möchte : einen Schaltaktor für 6 / 12 / 24 Stunden einschalten können. Die Zeit würde ich gerne über vis Verstellen können.
Kann mir jemand bitte einen Tipp geben? Ich muss ja erst den Timer setzten und danach den state, oder?
Vielen Dank schon mal.
Gruß Thomas
-
Hallo,
versuche es so. Ist nur im Forum zusammengetippt, was nicht gerade meine Stärke ist. Aber ich hoffe, ich habe alles richtig gemacht
// Danke an paul53 für die Korrektur zum Timer // Generelle Einstellungen var debug = true; // log Ausgaben ein-/ ausschalten var instanz = "javascript.0."; // kann angepasst werden var pfad = "homematic.nachlauf."; // kann angepasst werden var idAktor = XXXXXXXXXXXXXXXXXX ; // hier den Pfad zu deinem zu schaltenden Aktor eintragen (z.B. "hm-rpc.1.000000000ABC.4.STATE") // States anlegen createState(instanz + pfad + "schalter", false , { read: true, write: true, name: "Schalter für zu schaltenden Aktor", type: "boolean", def: false }); createState(instanz + pfad + "dauer", 6 , { name: 'Einschaltdauer', type: 'number', min: '1', max: '24', desc: 'Dauer des Einschaltens zwischen 1 und 24 Std' }); var idSchalter = instanz + pfad + "schalter"; var idDauer = instanz + pfad + "dauer"; var timer = null; // TRIGGER on(idSchalter, function(dp) { if (dp.state.val) { setState(idAktor, true); var ontime = getState(idDauer).val * 3600000; // Dauer in Stunden mal 3600 Sekunden mal 1000 Milisekunden timer = setTimeout( fAusschalten, ontime); } else { clearTimeout(timer); fAusschalten(); } }); // Ausschalt-Funktion function fAusschalten(){ setState(idAktor, false); timer = null; }
In Vis baust du dann einen Schalter ein zum ein bzw ausschalten und daneben etwas, mit dem du die Dauer an den erzeugten Datenpunkt übergibst. Das kann quasi alles sein, ein Schieberegler oder radio buttons mit vordefinierten Werten…
-
timer = getState(idDauer).val * 60 * 1000; // Dauer in Stunden mal 60 Minuten mal 1000 Milisekunden setTimeout( fAusschalten, timer); } else { clearTimeout(timer); timer = null; } ```` `
Das funktioniert so nicht, denn die Variable timer ist ein Timer-Objekt und keine Zeit. Korrektur:
var ontime = getState(idDauer).val * 3600000; // Dauer in Stunden mal 3600 Sekunden mal 1000 Milisekunden timer = setTimeout(fAusschalten, ontime); } else { clearTimeout(timer); timer = null; }
-
grml
irgendwann lerne ich das noch. danke für die Korrektur; ich übernehme sie gleich mal oben ins Skript
-
Vielen Dank hat funktioniert!!
-
Dann setze bitte im ersten Posting das Topic auf [gelöst].
Danke
-
muss jetzt doch nochmal nachhaken. habe das script jetzt nochmal getestet. ich kann einschalten mit "nachlaufe" zwischen 1 und 24 h . nur ich kann nicht vorzeitig abbrechen wenn ich den Schalter wieder auf aus stelle. Ich hätte war eine Idee mit "und-oder" Geschichten aber ich kann kein javascript maximal blocky.
-
Da es sich bei der Frage um Homematic handelt, gibt es noch einen anderen Weg:
setState('hm-rpc.0.xEQxxxxxxx.1.ON_TIME', 300, function() { setStateDelayed("hm-rpc.0.xEQxxxxxxx.1.STATE", true, 100); });
Als erstes wird die Einschaltdauer in Sekunden übermittelt, und im Callback dann der Aktor eingeschaltet.
Hat den Vorteil, dass sich der Aktor auch abschaltet wenn nach dem Einschalten kein Funkkontakt mehr bestehen würde.
-
Setze bitte bei der else Anweisung statt des "timer = null" ein fAusschalten (); ein
Habs oben angepasst
-
Jetzt ists perfekt, danke.
-
Hallo,
jetzt habe auch mal eine Frage zum obigen Script. ich möchte gerne 2 Aktoren schalten.
Reicht es wenn ich die Zeile
"var idAktor = XXXXXXXXXXXXXXXXXX ;"
kopiere und darunter in einer neuen Zeile einfüge.
also z.B.:
var idAktor = "hm-rpc.0.OEQ0098506.2.STATE"/Poolpumpe.STATE/ ;
var idAktor = "hm-rpc.0.OEQ0098506.3.STATE"/Clorinator.STATE/ ;
Oder wie muss ich da vorgehen. Ich hatte es in der Kombination versucht doch nur die untere Zeile wird "geschaltet".
Über ein wenig Hilfe wäre ich dankbar.
-
Ist zwar schon länger her aber falls jemand hier mal drüber stolpert:
Klar wird nur der zweite Aktor geschaltet - du überschriebst ja auch die Variable mit dem zweiten Statement:
var idAktor = "hm-rpc.0.OEQ0098506.2.STATE"/Poolpumpe.STATE/ ;
var idAktor = "hm-rpc.0.OEQ0098506.3.STATE"/Clorinator.STATE/ ;
Du musst dem zweiten Aktor dann schon eine eigene Variable spendieren:
var idAktor1 = "hm-rpc.0.OEQ0098506.2.STATE"/Poolpumpe.STATE/ ;
var idAktor2 = "hm-rpc.0.OEQ0098506.3.STATE"/Clorinator.STATE/ ;