Code: Alles auswählen
myDimmer.sendCommand((myDimmer.state as Number) if (bDimmDir) + 10 else - 10) //Dimmer auf neuen Wert setzen
Hab das so umgebaut:
Code: Alles auswählen
var Timer tDimm = null //der Timer
var Boolean bDimmDir = true //Dimmrichtung
var Boolean bDimm = false //Dimmen aktiv
// Wohnzimmer_Taster_Tuer: ein TasterItem
// Wohnzimmer_Licht_Couch: ein DimmerItem
rule "relatives dimmen"
when
Item Wohnzimmer_Taster_Tuer received command //Taster wurde gedrückt oder losgelassen
then
if (receivedCommand==ON) { //Taster gedrückt
if(tDimm !== null) tDimm.cancel //irgendwas ist schief gegangen, deshalb aktiven Timer canceln
tDimm = createTimer(now.plusMillis(500), [ | //Timer mit 500mSec starten
bDimm = true //Verzögerung abgelaufen, ab jetzt wird gedimmt
Wohnzimmer_Licht_Couch.sendCommand(Wohnzimmer_Licht_Couch.state as Number) //Dimmer auf neuen Wert setzen
if(bDimmDir == true) (Wohnzimmer_Licht_Couch.state as Number) + 10
else (Wohnzimmer_Licht_Couch.state as Number) - 10
if((Wohnzimmer_Licht_Couch.state as Number) == 100) bDimmDir = false //oben angekommen, Richtung nach unten
if((Wohnzimmer_Licht_Couch.state as Number) == 0) bDimmDir = true //unten angekommen, Richtung nach oben
tDimm.reschedule(now.plusMillis(100)) //Timer mit 100mSec neu starten
]
)
} else { //Taster wurde losgelassen
tDimm.cancel //Dimming stoppen
tDimm = null //und gleich Variable reinitialisieren
// Drei Möglichkeiten, eine davon aktivieren (die dritte wäre dann default, falls nichts ausgewählt wurde):
// bDimmDir = true //Dimmen startet immer in Richtung heller
bDimmDir = !bDimmDir //Dimmen kehrt Richtung um
// bDimmDir = bDimmDir // bDimmDir nicht ändern -> Dimmrichtung bleibt erhalten
if(!bDimm) //falls Dimmen nicht aktiv war
Wohnzimmer_Licht_Couch.sendCommand(if((Wohnzimmer_Licht_Couch.state as Number) == 0) ON else OFF) //schalte den Dimmer um
else
bDimm = false //Variable reinitialisieren
}
end
So sah übrigens mein Code auf dem ESP direkt aus. Hat einwandfrei funktioniert. Bei jedem erneutem gedrückt halten hat der auch die Richtung geändert. Hab ich auch lang dran gesessen. Aber im openHAB ist die Sprache echt schwer für mich zu raffen...
Arbeitet openHAB eigentlich jede rule gleichzeitig ab? Oder hintereinander? Kann da auch mit z.B. einer "while" schleife das komplette Programm hängen bleiben?
Code: Alles auswählen
//Taster gedrückt halten
if (millis()-Taster_Millis >= 500 && Taster_Zustand == 1) {
Dimmung_Aktiv = 1;
Umschalten = 1;
Dim_Richtung = !Dim_Richtung;
while (Taster_Zustand == 1) {
if (Taster_Eingabe.update()) {
if (Taster_Eingabe.fell()) {
Taster_Zustand = 0;
}
}
if (Dim_Richtung == 1) {
Dimmstufe = Dimmstufe + 1;
delay(1);
if (Dimmstufe >= 870) {
Dim_Richtung = 0;
}
}
if (Dim_Richtung == 0) {
Dimmstufe = Dimmstufe - 1;
delay(1);
if (Dimmstufe <= 600) {
Dim_Richtung = 1;
}
}
}