Die pragmatische Lösung wäre, den I3-Kanal auf Switch zu stellen und in openHAB die Auswertung short/double/tripple/long zu erledigen. Ich haeb vor Jahren im englischen Forum mal dazu eine Rule programmiert, das war nicht selbsterklärend, aber verhältnismäßig leicht realisierbar.
PS: Tasmota bietet hier leider auch nicht mehr Möglichkeiten.
PPS: So ungefähr könnte es funktionieren:
Code: Alles auswählen
var Timer tTaster = null // Timer für Messung Short Press
var Timer tTasterLong = null // Timer für Befehlswiederholung
var Integer iTaster = 0 // Zähler Short Press
val Long lTasterShort = 400 // Erkennung Short <-> Long Press
val Long lMio = 1000000 // Abkürzung für Million
var Boolean bTasterDir = false // Dimmrichtung
rule "Multi Taste"
when
Item My Taster changed // Taster gedrückt oder losgelassen
then
tTasterLong?.cancel // falls long press Timer läuft stoppen
if(newState == ON) { // falls Taste gedrückt
iTaster += 1 // Zähler für Tastendruck erhöhen
tTaster?.cancel // Timer für Unterscheidung short-long löschen
tTaster = createTimer(now.plusNanos(lTasterShort * lMio), [| // Messung starten
// hier beginnt longPress
iTaster = 0 // Zähler für short press auf 0
tTaster = null // und Timer entfernen
bTasterDir = !bTasterDir // Dimmrichtung umkehren
tTasterLong = createTimer(now.plusNanos(10 * lMio), [| // und Timer für Dimmvorgang starten
var Integer iLevel = 0 // erzeuge ein lokalea Integer Objekt
if(LED_WZ_Indirekt_ColorWhite.state instanceof Number) // Falls der Status vom Typ Number ist
nLevel = (LED_WZ_Indirekt_ColorWhite.state as Number).intValue // fülle das Objekt mit dem Integerwert
if(bTasterDir) // falls heller dimmen
iLevel += 2 // erhöhe den Level
else // ansonsten
iLevel -= 2 // verringere den Level
if(iLevel > 100) { // Prüfe auf Überschreiten, falls ja
iLevel = 100 // setze auf Maximum
bTasterDir = false // und setze Dimmrichtung auf dunkler
} else if(iLevel < 0) { // ansonsten prüfe auf Unterschreiten, falls ja
iLevel = 0 // setze Minimum
bTasterDir = true // und setze Dimmrichtung auf heller
}
LED_WZ_Indirekt_ColorWhite.sendCommand(iLevel) // Sende Befehl an die Lampe
tTasterLong.reschedule(now.plusNanos(100 * lMio)) // und plane den Timer erneut in 100 mSec
])
])
} else if(tTaster !== null){ // short press erkannt, da Timer noch lief
tTaster?.cancel // timer löschen
tTaster = createTimer(now.plusNanos(lTasterShort * lMio), [| // kurz warten ob weiterer Tastendruck folgt
switch(iTaster) { // abhängig von der Anzahl Tastendrücke
case 1: {
Licht1.sendCommand(if(Licht1.state == OFF) ON else OFF) // Licht 1 Toggle
}
case 2: {
Licht2.sendCommand(if(Licht2.state == OFF) ON else OFF) // Licht 2 Toggle
}
case 3: {
Licht3.sendCommand(if(Licht3.state == OFF) ON else OFF) // Licht 3 Toggle
}
}
iTaster = 0
])
}
end
Man kann die Liste der Tastendrücke beliebig verlängern, also auch vierfach, fünffach... n-fach auswerten.
Das Funktionsprinzip ist einfach: Beim Drücken der Taste wird ein Timer gestartet, beim Loslassen der Taste wird geprüft, ob der Timer läuft. Ist das der Fall, so handelt es sich um einen kurzen Tastendruck. Da wir eventuell weitere Tastendrücke erwarten, startet der Timer erneut. Läuft dieser Timer ab, so wurde die Taste nicht erneut gedrückt, also wird der passende Schaltbefehl ausgeführt (hier exemplarisch mit einem Toggle versehen, genauso könnte man aber auch ein bestimmtes Licht explizit ein- oder ausschalten oder auch wesentlich komplexere Dinge treiben).
Läuft der erste Timer ab, so wurde ein langer Tastendruck erkannt. Der Dimmvorgang startet wie gehabt.