Seite 1 von 1

Ikea On/Off Taster (Dimmen und Doppelklick)

Verfasst: 22. Mai 2021 21:14
von Dasgen
Hallo zusammen,
ich such schon lange nach einer passenden Lösung für mein Problem :(

Ich habe einen IKEA Trådfri On / OFF Taster den ich mittels DeConz in openhab eingebunden habe.
Der Taster wird erkannt und hat folgende Zustände
1002 = EIN kurz Drücken
1001 = EIN Lange Drücken
1003 = EIN nach "Lange Drücken" loslassen

2002 = AUS kurz Drücken
2001 = AUS Lange Drücken
2003 = AUS nach "Lange Drücken" loslassen

Soweit so gut, jedoch möchte ich mit diesem Taster nun einige Aktionen auslösen z.B.
Einmal EIN drücken --> Lampe an (kein Problem)
Ein lange drücken --> Lampe heller bis taste wieder los gelassen wird
Doppelklick (innerhalb von 1-2 Sekunden) --> Farbe = Blau
Dreifachklick ... und so weiter

An dem Dimmer und dem Doppelklick scheiter ich, obwohl das doch eigentlich eine "Grundfunktion" eines solchen Tasters sein sollte.

Ich habe schon viel zu dem Thema gelesen und ausprobiert, aber diese beiden Punkte habe ich nie hinbekommen.
Hat hier jemand einen Tipp für mich?

Grüße

Dasgen

Re: Ikea On/Off Taster (Dimmen und Doppelklick)

Verfasst: 22. Mai 2021 23:07
von ErrPunktErr
Dasgen hat geschrieben: 22. Mai 2021 21:14 An dem Dimmer und dem Doppelklick scheiter ich, obwohl das doch eigentlich eine "Grundfunktion" eines solchen Tasters sein sollte.
Da möchte ich widersprechen.
Die Grundfunktion eines solchen Tasters ist eigentlich nur zu melden wenn er geschlossen und wenn er wieder geöffnet wird. Alles andere ist eigentlich schon Bonus. ;)

Was du vor hast, wirst du nur mit Programmierarbeit und timern lösen können, da der Button das, wie du selbst schon herausgefunden hast, einfach nicht unterstützt. Ich kann es dir hier nur kurz skizzieren. Genauer wird dir das Udo wahrscheinlich noch erklären.

Beispiel: Helligkeit erhöhen bei gedrückt halten:

Wenn ein Button Event ausgelöst wird, musst du prüfen ob es Event 1001 war und rufst dann eine Funktion auf welche die Helligkeit um einen bestimmten Wert erhöht. Danach startest du einen Timer, der z.B. für 500 Millisekunden wartet, erneut das letzte Buttonevent prüft und bei unverändertem Wert, die gleiche Funktion erneut aufruft. Wenn du die Taste loslässt, ändert sich das letzte Event auf 1003 und die Schleife wird nicht weiter ausgeführt. Das ganze dann natürlich noch mit 2001 und der Verringerung der Helligkeit.

Ich habe so einen Button hier liegen und zufällig etwas ähnliches vor. Das werde ich aber erst morgen in Angriff nehmen können. Wenn bis dahin hier noch keine Lösung steht, werfe ich den Code hier ab. :)

Re: Ikea On/Off Taster (Dimmen und Doppelklick)

Verfasst: 25. Mai 2021 14:09
von ErrPunktErr
Halli hallo,

etwas später als erwartet, bin ich heute dazu gekommen das Dimmen in meinen Button einzubauen. Ich poste den JS Code einfach mal im ganzen, du kannst dir ja das für dich notwendige raussuchen. Wenn du Hilfe brauchst, sag bescheid.

Code: Alles auswählen

var light1, light1Brightness, light2, light1State, light2State, buttonEventNumber, timer;
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
var ScriptExecution = Java.type('org.openhab.core.model.script.actions.ScriptExecution');
var ZonedDateTime = Java.type('java.time.ZonedDateTime');

var delay = 1; // Sekunden
var step = 5;
light1 = 'lightTintTemp13_Helligkeit';
light1Brightness = 'lightTintTemp14_Helligkeit';
light2 = 'swLightOffice';

function getButtonEventNumber() {
  return itemRegistry.getItem('TRADFRIonoffswitch1_Button').getState();
}

function changeBrightness(light, amount, delay) {
  buttonEventNumber = getButtonEventNumber();
  if (buttonEventNumber == 1001 || buttonEventNumber == 2001) {
    var state = itemRegistry.getItem(light).getState();
    var newState = state + amount;
    if (newState > 100) {newState = 100;}
    if (newState < 0) {newState = 0;}
    events.sendCommand(light, newState);
    timer = ScriptExecution.createTimer(ZonedDateTime.now().plusSeconds(delay), function() {
      changeBrightness(light, amount, delay);
    });
  }
}


light1State = itemRegistry.getItem(light1).getState();
light2State = itemRegistry.getItem(light2).getState();
buttonEventNumber = getButtonEventNumber();

if (buttonEventNumber == 1002) {
  if (light1State == 'OFF') {
    events.sendCommand(light1, 'ON');
  } else if (light2State == 'OFF') {
    events.sendCommand(light2, 'ON');
  }
} else if (buttonEventNumber == 2002) {
  if (light2State == 'ON') {
    events.sendCommand(light2, 'OFF');
  } else if (light1State == 'ON') {
    events.sendCommand(light1, 'OFF');
  }
} else if (buttonEventNumber == 1001) {
  changeBrightness(light1Brightness, step, delay);
} else if (buttonEventNumber == 2001) {
  changeBrightness(light1Brightness, -step, delay);
} else if (buttonEventNumber == 1003 || buttonEventNumber == 2003) {
  if (timer) {
    timer.cancel()
  }
}
Kurze Erklärung:
Mein Schalter schaltet nacheinander 2 Lampen ein und aus, bei lange drücken aber immer nur die Helligkeit einer Lampe. Lass dich also von der zweiten Lampe nicht verwirren. ;)

Re: Ikea On/Off Taster (Dimmen und Doppelklick)

Verfasst: 27. Mai 2021 19:05
von Dasgen
Perfekt das hat funktioniert.
Schon mal vielen Dank für das Dimmen :)
Nun brauche ich nur noch einen Tipp für den Doppel / X-fachklick

Hat dazu jemand eine Idee?

Grüße

Dasgen

Re: Ikea On/Off Taster (Dimmen und Doppelklick)

Verfasst: 27. Mai 2021 19:51
von ErrPunktErr
Gerne doch.

Ach ja, den Teil hatte ich ganz vergessen.
Das mache ich etwas komplizierter, dafür dann aber sehr variabel und erweiterbar.

Beispielsweise meine Szenen: Ich habe ein Number Item für die Szenen im Wohnzimmer welches sich nach 1 Sekunde ohne Änderung wieder auf 0 zurücksetzt. Das geht über die Metadaten einzustellen. Alle meine Szenenregeln benutzen als Trigger dieses Item. Wechselt das Item z.B. auf 1, wird die Szene Fernsehen aktiviert, bei 2 der Essbereich entsprechend beleuchtet, usw.
Eine weitere Regel lauscht dann nur noch auf den Tastendruck eines Schalters der die Szenen durchschalten soll, holt sich den aktuellen Wert des Number Items, erhöht ihn um 1 und sendet den neuen Wert wieder zurück. Wenn also länger als eine Sekunde der Schalter nicht gedrückt wurde, wird wieder von vorn angefangen. Vorteil: Man kann sich das relativ leicht mit Blockly zusammenklicken und wenn man irgendwie eine Szene direkt auslösen will, setzt man einfach das Number Item direkt auf den Wert den man haben möchte. Nachteil: Man muss erst alles durchschalten und hat bei vielen Szenen erstmal Party im Wohnzimmer. ;)

Man könnte das ganze noch mit Verzögerung bauen, so dass die Szene erst ausgelöst wird wenn man nichts mehr drückt, dann wird es aber etwas komplexer und nicht mehr mit Blockly zu bauen.