NEWS
Tradfri: Lampen und Rollos mit HomeMatic Wandtaster steuern
-
@homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit
on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.
@dtp sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
@homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit
on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.
ich kann doch immer noch kein js :-(
auf Aktualisierung, nicht auf Änderung!
wie immer das mit js geht -
@dtp sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
@homoran Alles klar. Verstanden. Aber kann ich jetzt, nachdem ich @paul53s Skript ausgeführt habe, direkt den Datenpunkt als Trigger mit
on("hm-rpc.1.00019F299738F8.1.PRESS_SHORT", function (obj){...}verwenden, oder geht das so nicht? Irgendwie habe ich da noch ein Verständnisproblem.
ich kann doch immer noch kein js :-(
auf Aktualisierung, nicht auf Änderung!
wie immer das mit js geht@homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
auf Aktualisierung, nicht auf Änderung!
wie immer das mit js gehton({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) { } -
@codierknecht sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
@homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
auf Aktualisierung, nicht auf Änderung!
wie immer das mit js gehton({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) { }sischer datt?
ist ne nicht not equal, also Änderung? -
@codierknecht sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
@homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
auf Aktualisierung, nicht auf Änderung!
wie immer das mit js gehton({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) { }sischer datt?
ist ne nicht not equal, also Änderung?@homoran Korrekt "ne" ist not equal. Damit geht's nicht. Aber so hat's funktioniert, nachdem ich das Skript von @paul53 für PRESS_SHORT beider Kanäle ausgeführt habe.
on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT"}, async function (obj) { setState('tradfri.0.L-65547.lightbulb.brightness', 40); }); on({id: "hm-rpc.1.00019F299738F8.2.PRESS_SHORT"}, async function (obj) { setState('tradfri.0.L-65547.lightbulb.brightness', 0); });Danke euch. Da muss man erst mal drauf kommen.
Nun kann ich mir noch Gedanken über eine Umsetzung für die Dimmfunktion mit PRESS_LONG_START und PRESS_LONG_RELEASE machen.
-
@codierknecht sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
@homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
auf Aktualisierung, nicht auf Änderung!
wie immer das mit js gehton({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "ne"}, async function (obj) { }sischer datt?
ist ne nicht not equal, also Änderung?@homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
ist ne nicht not equal, also Änderung?
Natürlich - Du hast natürlich Recht.
Muss mal endlich die Tomaten von den Augen kratzen

Das hier wäre "Änderung":
on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "any"}, async function (obj) { }Wobei man in diesem Fall das
changeauch komplett weglassen kann. Also so wie @dtp es schon herausgefunden hat. -
@homoran sagte in hm-rpc, keine Statusänderung bei HMIP-Tasterbetätigung:
ist ne nicht not equal, also Änderung?
Natürlich - Du hast natürlich Recht.
Muss mal endlich die Tomaten von den Augen kratzen

Das hier wäre "Änderung":
on({id: "hm-rpc.1.00019F299738F8.1.PRESS_SHORT", change: "any"}, async function (obj) { }Wobei man in diesem Fall das
changeauch komplett weglassen kann. Also so wie @dtp es schon herausgefunden hat.So, hier dann mal mein Skript zum Ein- und Ausschalten sowie Hoch- und Runterdimmen einer Tradfri-Leuchte mit einem HomeMatic-Taster.
var triggerID = "hm-rpc.1.00019F299738F8"; // ID des auslösenden Tasters var channelUp = 1; // Kanal des auslösenden Tasters zum Hochschalten var channelDown = 2; // Kanal des auslösenden Tasters zum Runterschalten var loadID = "tradfri.0.L-65547.lightbulb.brightness"; // Datenpunkt des zu steuernden Verbrauchers var step = 5; // Schrittweite beim Dimmen in Prozent var speed = 0.5; // Dauer einen einzelnen Dimmschrittes in Sekunden var count = 0; // Zähler (sollte immer auf 0 initialisiert werden) var IntervalId; // kurze Tasterbetätigung zum Einschalten on({id: triggerID+"."+channelUp+".PRESS_SHORT"}, async function (obj) { setState(loadID, 100); count = 100 / step; }); // kurze Tasterbetätigung zum Ausschalten on({id: triggerID+"."+channelDown+".PRESS_SHORT"}, async function (obj) { setState(loadID, 0); count = 0; }); // lange Tasterbetätigung zum Hochdimmen on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count++; log((count * step).toString()); setState(loadID, count * step); if(count * step > 99) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); }); // lange Tasterbetätigung zum Runterdimmen on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count--; log((count * step).toString()); setState(loadID, count * step); if(count * step < 1) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); });Das Skript funktioniert im Prinzip auch für Rollos, allerdings fehlt da noch eine Funktion, um das Rollo bei einem kurzen Tastendruck wieder an der gewünschten Position durch einen erneuten kurzen Tastendruck stoppen zu können. Zudem muss man den Wert für "speed" und "step" an die Fahrzeit des Rollos anpassen. Bei meinen Rollos von Ikea hat sich z.B. ein Wert von 0,3 Sekunden mit einer Schrittweite von 1 als ganz gut erwiesen.
-
So, hier dann mal mein Skript zum Ein- und Ausschalten sowie Hoch- und Runterdimmen einer Tradfri-Leuchte mit einem HomeMatic-Taster.
var triggerID = "hm-rpc.1.00019F299738F8"; // ID des auslösenden Tasters var channelUp = 1; // Kanal des auslösenden Tasters zum Hochschalten var channelDown = 2; // Kanal des auslösenden Tasters zum Runterschalten var loadID = "tradfri.0.L-65547.lightbulb.brightness"; // Datenpunkt des zu steuernden Verbrauchers var step = 5; // Schrittweite beim Dimmen in Prozent var speed = 0.5; // Dauer einen einzelnen Dimmschrittes in Sekunden var count = 0; // Zähler (sollte immer auf 0 initialisiert werden) var IntervalId; // kurze Tasterbetätigung zum Einschalten on({id: triggerID+"."+channelUp+".PRESS_SHORT"}, async function (obj) { setState(loadID, 100); count = 100 / step; }); // kurze Tasterbetätigung zum Ausschalten on({id: triggerID+"."+channelDown+".PRESS_SHORT"}, async function (obj) { setState(loadID, 0); count = 0; }); // lange Tasterbetätigung zum Hochdimmen on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count++; log((count * step).toString()); setState(loadID, count * step); if(count * step > 99) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); }); // lange Tasterbetätigung zum Runterdimmen on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count--; log((count * step).toString()); setState(loadID, count * step); if(count * step < 1) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); });Das Skript funktioniert im Prinzip auch für Rollos, allerdings fehlt da noch eine Funktion, um das Rollo bei einem kurzen Tastendruck wieder an der gewünschten Position durch einen erneuten kurzen Tastendruck stoppen zu können. Zudem muss man den Wert für "speed" und "step" an die Fahrzeit des Rollos anpassen. Bei meinen Rollos von Ikea hat sich z.B. ein Wert von 0,3 Sekunden mit einer Schrittweite von 1 als ganz gut erwiesen.
Und nun habe ich auch eine Lösung für die Rollos gefunden. Das folgende Skript steuert mit einem HMIP-Wandtaster zwei Rollos gleichzeitig.
var triggerID = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren var loadID1 = "tradfri.0.B-65540"; // ID eines ersten zu steuernden Rollos var loadID2 = "tradfri.0.B-65544"; // ID eines zweiten zu steuernden Rollos var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden var count = 0; // Zähler (sollte immer auf 0 initialisiert werden) var IntervalId; // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "eq", val: true}, async function (obj) { setState(loadID1+".blind.position", 100); setState(loadID2+".blind.position", 100); count = 100 / step; setState(triggerID+"."+channelUp+".PRESS_SHORT", false); }); on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "ne", val: true}, async function (obj) { setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); count = getState(loadID1+".blind.position").val / step; }); // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "eq", val: true}, async function (obj) { setState(loadID1+".blind.position", 0); setState(loadID2+".blind.position", 0); count = 0; setState(triggerID+"."+channelDown+".PRESS_SHORT", false); }); on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "ne", val: true}, async function (obj) { setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); count = getState(loadID1+".blind.position").val / step; }); // lange Tasterbetätigung zum Hochfahren on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count++; log((count * step).toString()); setState(loadID1+".blind.position", count * step); setState(loadID2+".blind.position", count * step); if(count * step > 99) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); }); // lange Tasterbetätigung zum Runterfahren on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count--; log((count * step).toString()); setState(loadID1+".blind.position", count * step); setState(loadID2+".blind.position", count * step); if(count * step < 1) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); });Dabei ist es folgendermaßen über die zwei Tasterkanäle des HMIP-Wandtasters gelöst:
- Eine kurze Betätigung von Taste 1 fährt das Rollo hoch. Drückt man Taste 1 noch mal kurz, wird das Rollo gestoppt.
- Eine kurze Betätigung von Taste 2 fährt das Rollo runter. Drückt man Taste 2 noch mal kurz, wird das Rollo gestoppt.
- Eine lange Betätigung von Taste 1 fährt das Rollo so lange hoch bis man Taste 1 wieder loslässt.
- Eine lange Betätigung von Taste 2 fährt das Rollo so lange runter bis man Taste 2 wieder loslässt.
Zur richtigen Einstellung von "speed" misst man einfach die Dauer, die das Rollo für eine vollständige Fahrt benötigt und teilt die gemessene Zeit dann durch 100/"step". Beispiel: braucht das Rollo 30 Sekunden für eine vollständige Fahrt und hat man "step" = 1 gesetzt, so ergibt sich für "speed" ein Wert von 0.3. Ich empfehle, die Schrittweite
-
Und nun habe ich auch eine Lösung für die Rollos gefunden. Das folgende Skript steuert mit einem HMIP-Wandtaster zwei Rollos gleichzeitig.
var triggerID = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren var loadID1 = "tradfri.0.B-65540"; // ID eines ersten zu steuernden Rollos var loadID2 = "tradfri.0.B-65544"; // ID eines zweiten zu steuernden Rollos var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden var count = 0; // Zähler (sollte immer auf 0 initialisiert werden) var IntervalId; // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "eq", val: true}, async function (obj) { setState(loadID1+".blind.position", 100); setState(loadID2+".blind.position", 100); count = 100 / step; setState(triggerID+"."+channelUp+".PRESS_SHORT", false); }); on({id: triggerID+"."+channelUp+".PRESS_SHORT", change: "ne", val: true}, async function (obj) { setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); count = getState(loadID1+".blind.position").val / step; }); // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "eq", val: true}, async function (obj) { setState(loadID1+".blind.position", 0); setState(loadID2+".blind.position", 0); count = 0; setState(triggerID+"."+channelDown+".PRESS_SHORT", false); }); on({id: triggerID+"."+channelDown+".PRESS_SHORT", change: "ne", val: true}, async function (obj) { setState(loadID1+".blind.stop", true); setState(loadID2+".blind.stop", true); count = getState(loadID1+".blind.position").val / step; }); // lange Tasterbetätigung zum Hochfahren on({id: triggerID+"."+channelUp+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count++; log((count * step).toString()); setState(loadID1+".blind.position", count * step); setState(loadID2+".blind.position", count * step); if(count * step > 99) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); }); // lange Tasterbetätigung zum Runterfahren on({id: triggerID+"."+channelDown+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count--; log((count * step).toString()); setState(loadID1+".blind.position", count * step); setState(loadID2+".blind.position", count * step); if(count * step < 1) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerID+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); });Dabei ist es folgendermaßen über die zwei Tasterkanäle des HMIP-Wandtasters gelöst:
- Eine kurze Betätigung von Taste 1 fährt das Rollo hoch. Drückt man Taste 1 noch mal kurz, wird das Rollo gestoppt.
- Eine kurze Betätigung von Taste 2 fährt das Rollo runter. Drückt man Taste 2 noch mal kurz, wird das Rollo gestoppt.
- Eine lange Betätigung von Taste 1 fährt das Rollo so lange hoch bis man Taste 1 wieder loslässt.
- Eine lange Betätigung von Taste 2 fährt das Rollo so lange runter bis man Taste 2 wieder loslässt.
Zur richtigen Einstellung von "speed" misst man einfach die Dauer, die das Rollo für eine vollständige Fahrt benötigt und teilt die gemessene Zeit dann durch 100/"step". Beispiel: braucht das Rollo 30 Sekunden für eine vollständige Fahrt und hat man "step" = 1 gesetzt, so ergibt sich für "speed" ein Wert von 0.3. Ich empfehle, die Schrittweite
Hallo,
ich musste feststellen, dass die Zeile
setState(triggerID+"."+channelUp+".PRESS_SHORT", false);zu einer Fehlermeldung führte:

Das Skript funktioniert aber, weil der Datenpunkt trotzdem mit dem Wert "false" beschrieben wird. Er kann halt nur nicht an den Taster gesendet werden. Jetzt meine Frage. Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?
Wenn nicht, dann muss ich wohl mit einer Zusatzvariablen arbeiten.
-
Hallo,
ich musste feststellen, dass die Zeile
setState(triggerID+"."+channelUp+".PRESS_SHORT", false);zu einer Fehlermeldung führte:

Das Skript funktioniert aber, weil der Datenpunkt trotzdem mit dem Wert "false" beschrieben wird. Er kann halt nur nicht an den Taster gesendet werden. Jetzt meine Frage. Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?
Wenn nicht, dann muss ich wohl mit einer Zusatzvariablen arbeiten.
@dtp sagte: Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?
Lass setState(...PRESS_SHORT, false) weg, denn HomeMatic-Taster haben immer den Wert true und sind nicht umsonst "read only". Bei Tastenbetätigung wird nur der Zeitstempel aktualisiert.
-
@dtp sagte: Kann man diese Fehlermeldung unterdrücken durch einen Zusatzparameter?
Lass setState(...PRESS_SHORT, false) weg, denn HomeMatic-Taster haben immer den Wert true und sind nicht umsonst "read only". Bei Tastenbetätigung wird nur der Zeitstempel aktualisiert.
@paul53 sagte in Ikea Lampen und Rollos mit HomeMatic Wandtaster steuern:
Lass setState(...PRESS_SHORT, false) weg
Das geht leider nicht so einfach, weil ich dann nicht mit einem kurzen Tastendruck zwischen einen Fahr- und Stoppbefehl toggeln kann. Aber ich habe es jetzt mit einer Hilfsvariablen gelöst.
//Skript zum Steuern eines nicht HM-Kompatiblen Beschattungsgeräts mittels HM-Tasterbetätigung //Autor: dtp, Version: 1.0 var triggerId = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren var blindsIdList = ['tradfri.0.B-65540','tradfri.0.B-65544']; // ID-Liste der zu steuernden Rollos var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden var auxTriggerId = 'javascript.0.variables.blindsAuxLivingroom'; // Hilfsvariable für die kurze Tasterbetätigung var auxTriggerName = 'Hilfsvariable Wohnzimmer Wandtaster Rollos'; // Name der Hilfsvariablen //weitere zu deklariende Variablen var IntervalId; var i; var count = 1; // Hilfsvariable für Taster anlegen if(!existsState(auxTriggerId)){ createState(auxTriggerId, true, {name: auxTriggerName, type: 'boolean', role: 'value'}, function () {}); } else{setState(auxTriggerId, true);} // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel on({id: triggerId+"."+channelUp+".PRESS_SHORT"}, async function (obj) { if(getState(auxTriggerId).val){ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 100); count = 100 / step; //log('go up'); setState(auxTriggerId, false); } else{ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true); count = getState(blindsIdList[1]+".blind.position").val / step; //log('stopp'); setState(auxTriggerId, true); } }); // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel on({id: triggerId+"."+channelDown+".PRESS_SHORT"}, async function (obj) { if(getState(auxTriggerId).val){ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 0); count = 0; //log('go down'); setState(auxTriggerId, false); } else{ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true); count = getState(blindsIdList[1]+".blind.position").val / step; //log('stopp'); setState(auxTriggerId, true); } }); // lange Tasterbetätigung zum Hochfahren on({id: triggerId+"."+channelUp+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count++; //log((count * step).toString()); for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step); if(count * step > 99) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerId+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); }); // lange Tasterbetätigung zum Runterfahren on({id: triggerId+"."+channelDown+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count--; //log((count * step).toString()); for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step); if(count * step < 1) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerId+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); });Nicht ganz so schön ist, dass bei langem Tastendruck die Rollos gelegentlich etwas ruckeln, wenn mehrere quasi als Gruppe angesteuert werden sollen. Mit einem einzigen Rollo läuft es dagegen smooth.
-
@paul53 sagte in Ikea Lampen und Rollos mit HomeMatic Wandtaster steuern:
Lass setState(...PRESS_SHORT, false) weg
Das geht leider nicht so einfach, weil ich dann nicht mit einem kurzen Tastendruck zwischen einen Fahr- und Stoppbefehl toggeln kann. Aber ich habe es jetzt mit einer Hilfsvariablen gelöst.
//Skript zum Steuern eines nicht HM-Kompatiblen Beschattungsgeräts mittels HM-Tasterbetätigung //Autor: dtp, Version: 1.0 var triggerId = 'hm-rpc.1.000B5D8995CA16'; // ID des auslösenden Tasters var channelUp = 5; // Kanal des auslösenden Tasters zum Hochfahren var channelDown = 6; // Kanal des auslösenden Tasters zum Runterfahren var blindsIdList = ['tradfri.0.B-65540','tradfri.0.B-65544']; // ID-Liste der zu steuernden Rollos var step = 1; // Schrittweite für das Hoch- und Runterfahren in Prozent var speed = 0.3; // Dauer eines einzelnen Schritts in Sekunden var auxTriggerId = 'javascript.0.variables.blindsAuxLivingroom'; // Hilfsvariable für die kurze Tasterbetätigung var auxTriggerName = 'Hilfsvariable Wohnzimmer Wandtaster Rollos'; // Name der Hilfsvariablen //weitere zu deklariende Variablen var IntervalId; var i; var count = 1; // Hilfsvariable für Taster anlegen if(!existsState(auxTriggerId)){ createState(auxTriggerId, true, {name: auxTriggerName, type: 'boolean', role: 'value'}, function () {}); } else{setState(auxTriggerId, true);} // kurze Tasterbetätigung zum Hochfahren und Stoppen im Wechsel on({id: triggerId+"."+channelUp+".PRESS_SHORT"}, async function (obj) { if(getState(auxTriggerId).val){ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 100); count = 100 / step; //log('go up'); setState(auxTriggerId, false); } else{ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true); count = getState(blindsIdList[1]+".blind.position").val / step; //log('stopp'); setState(auxTriggerId, true); } }); // kurze Tasterbetätigung zum Runterfahren und Stoppen im Wechsel on({id: triggerId+"."+channelDown+".PRESS_SHORT"}, async function (obj) { if(getState(auxTriggerId).val){ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", 0); count = 0; //log('go down'); setState(auxTriggerId, false); } else{ for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.stop", true); count = getState(blindsIdList[1]+".blind.position").val / step; //log('stopp'); setState(auxTriggerId, true); } }); // lange Tasterbetätigung zum Hochfahren on({id: triggerId+"."+channelUp+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count++; //log((count * step).toString()); for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step); if(count * step > 99) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerId+"."+channelUp+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); }); // lange Tasterbetätigung zum Runterfahren on({id: triggerId+"."+channelDown+".PRESS_LONG_START"}, async function (obj) { IntervalId = setInterval(function(){ count--; //log((count * step).toString()); for(i = 0; i < blindsIdList.length; i++) setState(blindsIdList[i]+".blind.position", count * step); if(count * step < 1) clearInterval(IntervalId); }, speed * 1000); }); on({id: triggerId+"."+channelDown+".PRESS_LONG_RELEASE"}, async function (obj) { clearInterval(IntervalId); });Nicht ganz so schön ist, dass bei langem Tastendruck die Rollos gelegentlich etwas ruckeln, wenn mehrere quasi als Gruppe angesteuert werden sollen. Mit einem einzigen Rollo läuft es dagegen smooth.
-
Um doppeltes Schreiben zu vermeiden, habe ich im HomeMatic-Forum einen kleinen Thread zu dem Projekt gestartet. Alles weitere dann dort (klick!)
Jetzt ist mir in Verbindung mit den Skripten noch ein kleines Problem aufgefallen. Starte ich die entsprechende Instanz des hm-rpc-Adapters neu, dann werden alle Skripte getriggert. Sprich, die Leuchten gehen an und die Rollos fahren runter. Wie kann ich das vermeiden?
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden