Dimmzustand Lampe anzeigen lassen.

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
mad-mike
Beiträge: 500
Registriert: 6. Jan 2021 18:05
Answers: 4

Dimmzustand Lampe anzeigen lassen.

Beitrag von mad-mike »

Moin zusammen.

Ich habe im Wohnzimmer eine Lampe welche über 3 Stufen per "ON" "OFF" "ON" ..... dimmbar ist. Ich weiss, nicht so schön, ist aber ist so gekommen.
Jedenfalls wird diese Lampe über ein Shelly -Wohnzimmer2 geschalten. Der Schalter ist ein Taster.

Nun Schalte ich diese Lampe öffters mal über das Tab welches im Flur sich befindet. Hier läuft ein HABPanel.
Nun dachte ich mir das man eine rule erstellen kann, welche ermittelt, welchen zustand die Lampe hat.

Dabei hat die Lampe keine Memory funktion :!: .

Schalt zustand ist:
ON = 100 %
ON - OFF - ON = 66 %
ON - OFF - ON - OFF - ON = 33%

Der befehl ON OFF ON muss innerhalb 3 sekunden passieren. Weil Beispiel:

Wenn ich 66 % aktuell habe, schalte weiter OFF warte 3 Sekunden dann wieder ON Dann ist die Lampe wieder bei 100 % Helligkeit.

Ich dachte, das ganze müsste man doch mit einer Rule auswerten können, und dann in ein String schreiben können, oder??


Jemand eine Idee?

Danke und Gruss ;)
Gruss mad-mike

openHABian 5.0.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 15440
Registriert: 11. Apr 2018 18:05
Answers: 248
Wohnort: Darmstadt

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von udo1toni »

"Das kommte halt so!" ist eines meiner Lieblingszitate (Tjorven - Ferien auf Saltkrokan von Astrid Lindgren) :D

Zu Deinem "Problem":
Es läuft darauf hinaus, dass Du ein Number Item anlegst (wobei - Dimmer Item ginge auch...) und den Status dieses Items per Rule setzt.
Erster Versuch:

Code: Alles auswählen

var Timer tLampe = null

rule "Lampe auswerten"
when
    Item LampeSw changed                                                              // Statuswechsel
then
    tLampe?.cancel                                                                    // timer löschen
    if(newState == ON) {                                                              // Lampe eingeschaltet
        if(!LampeSw.changedBetween(now.minusNanos(100000000), now.minusSeconds(4))) { // falls kein Wechsel seit 4 Sekunden
            LampeDim.postUpdate(100)                                                  // Dimmwert 100
        } else {                                                                      // ansonsten
            var nSoll = (LampeDim.state as Number) - 33                               // Sollwert = Istwert - 33
            if(nSoll < 30) nSoll = 100                                                // Falls unter kleinster Stufe -> 100
            LampeDim.postUpdate(nSoll)                                                // Dimmwert setzen
        }
    } else {                                                                          // Lampe wurde ausgeschaltet
        tLampe = createTimer(now.plusSeconds(3),[|                                    // nach 3 Sekunden
            LampeDim.postUpdate(0)                                                    // Lampe aus
        ])
    }
end
Ich bin gerade nicht Zuhause...
Die Theorie:
Zunächst wird ein eventuell laufender Timer abgebrochen (siehe weiter unten)

Die Schaltstellung hat nach ON gewechselt:
Gab es in den letzten 4 Sekunden keinen Statuswechsel, so war die Lampe vorher aus, ergo muss die Lampe 100 % haben.
Gab es innerhalb des Zeitfensters bereits einen Statuswechsel, war die Lampe vorher an und wurde gedimmt, ergo muss die Stufe um 1 reduziert werden (bzw. um 33 %). Landet die neue Stufe unter 33 %, so war die Lampe schon auf niedrigster Stufe und muss deshalb wieder auf 100 sein.

Die Schaltstellung hat nach OFF gewechselt:
Der Timer wird gestartet. Läuft der Timer ab, so wird der Status auf 0 geändert.

Interessant wäre natürlich auch ein Rule, die die Lampe durch die passende Schaltfolge auf eine Wunschhelligkeit bringt (natürlich von jeder beliebigen Stufe aus...)

Code: Alles auswählen

var Timer tLamp2 = null

rule "Lampe schalten"
when
    Item LampeDim received command
then
    switch(receivedCommand) {
        case OFF : {
            LampeSw.sendCommand(OFF)
        }
        case ON : {
            val nLevel = LampeDim.state as Number
            if(nLevel == 0) {
                LampeSw.sendCommand(ON)
            } else if(nLevel < 100) {
                tLamp2?.cancel
                LampeSw.sendCommand(OFF)
                tLamp2 = createTimer(now.plusSeconds(4), [|
                    LampeSw.sendCommand(ON)
                ])
            }
        }
        default : {
            val nSoll = ((receivedCommand as Number)/33).intValue
            if(((LampeDim.state as Number)/33).intValue != nSoll) {
                var int iSchritt = (((LampeDim.state as Number)/33).intValue + 3 - nSoll) % 3
                while(iSchritt > 0) {
                    LampeSw.sendCommand(OFF)
                    Thread.sleep(100)
                    LampeSw.sendCommand(ON)
                    iSchritt --
                }
            }
        }
    }
end
Alles nur theoretisch... :)
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)

mad-mike
Beiträge: 500
Registriert: 6. Jan 2021 18:05
Answers: 4

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von mad-mike »

Danke für deine Mühe...

Leider gibts da ein kleines Problem...

Code: Alles auswählen

2024-12-07 13:30:08.958 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'wohnzimmer-1' failed: begin (2024-12-07T13:30:08.853568451+01:00[Europe/Berlin]) before end (2024-12-07T13:30:04.954289756+01:00[Europe/Berlin]) in wohnzimmer
Wie geht das denn?? :lol:

:?:

Habe Item erstellt und angepasst:

Code: Alles auswählen

var Timer tLampe = null

rule "Lampe auswerten"
when
    Item Wohnzimmerlampe2 changed                                                              // Statuswechsel
then
    tLampe?.cancel                                                                    // timer löschen
    if(newState == ON) {                                                              // Lampe eingeschaltet
        if(!Wohnzimmerlampe2.changedBetween(now.minusNanos(100000000), now.minusSeconds(4))) { // falls kein Wechsel seit 4 Sekunden
            LampeDim.postUpdate(100)                                                  // Dimmwert 100
        } else {                                                                      // ansonsten
            var nSoll = (LampeDim.state as Number) - 33                               // Sollwert = Istwert - 33
            if(nSoll < 30) nSoll = 100                                                // Falls unter kleinster Stufe -> 100
            LampeDim.postUpdate(nSoll)                                                // Dimmwert setzen
        }
    } else {                                                                          // Lampe wurde ausgeschaltet
        tLampe = createTimer(now.plusSeconds(3),[|                                    // nach 3 Sekunden
            LampeDim.postUpdate(0)                                                    // Lampe aus
        ])
    }
end


Schönes Wochenende.
Gruss mad-mike

openHABian 5.0.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 15440
Registriert: 11. Apr 2018 18:05
Answers: 248
Wohnort: Darmstadt

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von udo1toni »

Ups, Reihenfolge vertauscht...
Ändere bitte die erste Zeile nach if(newState == ON) ab:

Code: Alles auswählen

    if(newState == ON) {                                                              // Lampe eingeschaltet
        if(!Wohnzimmerlampe2.changedBetween(now.minusSeconds(4), now.minusNanos(100000000))) { // falls kein Wechsel seit 4 Sekunden
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)

mad-mike
Beiträge: 500
Registriert: 6. Jan 2021 18:05
Answers: 4

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von mad-mike »

Ich glaube, wir sind auf dem Richtigen weg...

Er kann nun korrekt zwischen 0 und 100 unterscheiden. Ein pausiertes 66 % brachte jedoch keine Berechnung...

Code: Alles auswählen

2024-12-08 14:04:20.691 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Wohnzimmerlampe2' received command ON
2024-12-08 14:04:20.694 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Wohnzimmerlampe2' predicted to become ON
2024-12-08 14:04:20.698 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 14:04:20.705 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 0 to 100
2024-12-08 14:04:21.310 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Wohnzimmerlampe2' received command OFF
2024-12-08 14:04:21.313 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Wohnzimmerlampe2' predicted to become OFF
2024-12-08 14:04:21.316 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 14:04:21.943 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Wohnzimmerlampe2' received command ON
2024-12-08 14:04:21.945 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Wohnzimmerlampe2' predicted to become ON
2024-12-08 14:04:21.945 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 14:04:45.121 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Wohnzimmerlampe2' received command OFF
2024-12-08 14:04:45.123 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Wohnzimmerlampe2' predicted to become OFF
2024-12-08 14:04:45.125 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 14:04:45.575 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Wohnzimmerlampe2' received command ON
2024-12-08 14:04:45.576 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Wohnzimmerlampe2' predicted to become ON
2024-12-08 14:04:45.579 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 14:05:25.315 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'Wohnzimmerlampe2' received command OFF
2024-12-08 14:05:25.317 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'Wohnzimmerlampe2' predicted to become OFF
2024-12-08 14:05:25.327 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 14:05:28.330 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 100 to 0
Gruss mad-mike

openHABian 5.0.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 15440
Registriert: 11. Apr 2018 18:05
Answers: 248
Wohnort: Darmstadt

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von udo1toni »

1. Welchen Persistence Service nutzt Du?
2. Kannst Du spaßeshalber mal mal etwas mehr Zeit zwischen OFF und ON verstreichen lassen, also z.B. etwa eine Sekunde, statt nur einer drittel Sekunde?
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)

mad-mike
Beiträge: 500
Registriert: 6. Jan 2021 18:05
Answers: 4

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von mad-mike »

1. Welchen Persistence Service nutzt Du?
RRD4J
2. Kannst Du spaßeshalber mal mal etwas mehr Zeit zwischen OFF und ON verstreichen lassen, also z.B. etwa eine Sekunde, statt nur einer drittel Sekunde?
Selbstverständlich, ändert aber nix...

Code: Alles auswählen

2024-12-08 20:19:27.697 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 100 to 0
2024-12-08 20:19:29.050 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 20:19:29.056 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 0 to 100
2024-12-08 20:19:34.030 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 20:19:37.037 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 100 to 0
2024-12-08 20:19:37.351 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 20:19:37.366 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 0 to 100
2024-12-08 20:19:40.656 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 20:19:42.087 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 20:19:43.612 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 20:19:44.627 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 20:19:48.094 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 20:19:51.100 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 100 to 0
2024-12-08 20:19:51.290 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
2024-12-08 20:19:51.297 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'LampeDim' changed from 0 to 100
2024-12-08 20:19:54.153 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from ON to OFF
2024-12-08 20:19:56.617 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Wohnzimmerlampe2' changed from OFF to ON
Gruss mad-mike

openHABian 5.0.2 auf Raspberry Pi 4 Mod. b (8GB) ;)

Benutzeravatar
udo1toni
Beiträge: 15440
Registriert: 11. Apr 2018 18:05
Answers: 248
Wohnort: Darmstadt

Re: Dimmzustand Lampe anzeigen lassen.

Beitrag von udo1toni »

Das ist sch...ade...
Ok, weiterer Versuch:

Code: Alles auswählen

var Timer tLampe = null

rule "Lampe auswerten"
when
    Item Wohnzimmerlampe2 changed                                        // Statuswechsel
then
    tLampe?.cancel                                                       // timer löschen
    if(newState == ON) {                                                 // Lampe eingeschaltet
        if(!Wohnzimmerlampe2.changedSince(now.minusSeconds(4))) { // falls kein Wechsel seit 4 Sekunden
            logInfo("lamp","Licht an (100)")
            LampeDim.postUpdate(100)                                     // Dimmwert 100
        } else {                                                         // ansonsten
            var nSoll = (LampeDim.state as Number) - 33                  // Sollwert = Istwert - 33
            logInfo("lamp","Licht dimmen ({})",nSoll)
            if(nSoll < 30) nSoll = 100                                   // Falls unter kleinster Stufe -> 100
            LampeDim.postUpdate(nSoll)                                   // Dimmwert setzen
        }
    } else {                                                             // Lampe wurde ausgeschaltet
        tLampe = createTimer(now.plusSeconds(3),[|                       // nach 3 Sekunden
            logInfo("lamp","Licht aus (0)")
            LampeDim.postUpdate(0)                                       // Lampe aus
        ])
    }
end
Diesmal mit etwas Logging und verändertem Zeitraum (ohne minusNanos)
Edit: und changedSince sollte ja genauso funktionieren...
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)

Antworten