Seite 1 von 1

Dimmzustand Lampe anzeigen lassen.

Verfasst: 2. Dez 2024 19:47
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 ;)

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 3. Dez 2024 19:28
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... :)

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 7. Dez 2024 13:34
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.

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 7. Dez 2024 22:14
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

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 8. Dez 2024 14:10
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

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 8. Dez 2024 20:05
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?

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 8. Dez 2024 20:23
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

Re: Dimmzustand Lampe anzeigen lassen.

Verfasst: 8. Dez 2024 20:45
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...