Ankündigung

Einklappen
Keine Ankündigung bisher.

MQTT RGB Licht

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    MQTT RGB Licht

    Hallo und noch ein "Problemchen" mit .rules...

    Versuche gerade ein MQTT RGB Licht über einen KNX-Taster via Rule zu steuern.

    Der Taster sendet ON/OFF und bei langem drücken DIMMEN. Diese beiden Funktionen habe ich mit folgender Rule auch schon abbilden können:
    Code:
    rule "control MQTT RGBW light"
    
    when
    Item KNX_Ta_ONOFF received command
    then
    
    switch receivedCommand {
    case ON: {
    MQTT_Light_ONOFF.sendCommand(ON)
    }
    case OFF: MQTT_Light_ONOFF.sendCommand(OFF)
    case INCREASE: MQTT_Light_Dimm.sendCommand((MQTT_Light_Dimm.state as Number) + 5)
    case DECREASE: MQTT_Light_Dimm.sendCommand((MQTT_Light_Dimm.state as Number) - 5)
    }
    
    end​
    Nun möchte ich aber auch gerne die Farben spielen lassen...
    und hierfür den Taster mehrfach betätigen...
    2mal drücken -> letzte Farbe einschalten
    3mal drücken -> Farbwechsel einschalten

    Allerdings schaffe ich es nichtmal den Counter hochzusetzen, wenn ich innerhalb 2 Sekunden den Taster mehrfach betätige

    Hier mal meine Rule -teilweise mit Funktionsbeschreibungen- so wie ich mir das vorstellen würde:
    Code:
    rule "control MQTT RGBW light"
    
    when
        Item KNX_Ta_ONOFF received command
    then
        var Timer myTimer = null
        var Number rCounter
    
        switch receivedCommand {
            case ON: {
                if (myTimer !== null) {
                    rCounter = rCounter + 1
                }
                else {
                    myTimer = createTimer(now.plusSeconds(2), [ |
                    //Do something...
                    rCounter = 1
                ])
                }            
            }
            case OFF: // wie bei ON
            case INCREASE: MQTT_Light_Dimm.sendCommand((MQTT_Light_Dimm.state as Number) + 5)
            case DECREASE: MQTT_Light_Dimm.sendCommand((MQTT_Light_Dimm.state as Number) - 5)
        }
    
        switch rCounter {
            case 1: {
                if (Licht ist aus) {
                    MQTT_Light_ONOFF.sendCommand(ON)}
                else {
                    MQTT_Light_ONOFF.sendCommand(OFF)
                }
            }
            case 2: {
                // Licht in letzter Farbe anschalten
            }
            case 3: {
                // Licht in letzter Farbe anschalten
            }
        }
    end​
    Wäre toll wenn da jemand weiterhelfen könnte
    cu Yfkt5A
    DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
    microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

    #2
    Schön wäre ja, wenn knx Doppel- bzw. Dreifachklick als separates KO anböte...

    Der Punkt mit der Auswertung des Zählers ist, dass Du das im Timer erledigen musst.
    Code:
    // Globale Variablen immer vor der ersten Rule in der Datei definieren!
    var Timer  tRGBLicht = null
    var Integer iCounter = 0
    
    
    rule "control MQTT RGBW light"
    when
        Item KNX_Ta_ONOFF received command
    then
        var Integer iState = (MQTT_Light_Dimm.state as Number).intValue
        switch(receivedCommand) {
            case INCREASE: {
                iState += 5
                if(iState > 100) iState = 100
                MQTT_Light_Dimm.sendCommand(iState)
            }
            case DECREASE: {
                iState -= 5
                if(iState < 0) iState = 0
                MQTT_Light_Dimm.sendCommand(iState)
            }
            case ON: {
                iCounter += 1
                if(tRGBLicht === null)
                    tRGBLicht = createTimer(now.plusSeconds(2), [ |
                        switch(iCounter) {
                           case 1: {
                               MQTT_Light_ONOFF.sendCommand(
                                   if(MQTT_Light_Dimm.state == 0) ON else OFF
                               )
                           }
                           case 2: {
                               // Farbe umschalten
                           }
                           case 3: {
                               // Farbe umschalten
                           }
                        }
                        iCounter = 0
                        tRGBLicht = null
                    ]
                )
            }
            case OFF: // wie bei ON
        }
    end​
    Wichtig ist auch, dass sowohl die Timer Variable als auch der Counter global definiert sein müssen. Und natürlich sollte man niemals versuchen, einem Dimmer den Befehl zu geben, auf über 100% oder unter 0% zu regeln, auch wenn der Dimmer das sicher abfangen wird. Das Objekt Integer beherrscht die Abkürzung += und -=
    Nachteilig ist hier sicher, dass der einfache Tastendruck erst nach 2 Sekunden ausgeführt werden kann, wobei vielleicht auch eine Sekunde reichen würde.

    Man könnte das Ganze etwas optimieren (hier nur der case ON-Teil der Rule):
    Code:
            case ON: {
                iCounter += 1
                if(tRGBLicht === null)
                    tRGBLicht = createTimer(now.plusNanos(500000000), [ |
                        switch(iCounter) {
                           case 1: {
                               MQTT_Light_ONOFF.sendCommand(
                                   if(MQTT_Light_Dimm.state == 0) ON else OFF
                               )
                           }
                           case 2: {
                               // Licht in letzter Farbe anschalten
                           }
                           default: {
                               // Licht in letzter Farbe anschalten
                           }
                        }
                        iCounter = 0
                        tRGBLicht = null
                    ]
                ) else if(iCounter < 3) tRGBLicht.reschedule(now.plusNanos(500000000))
            }
    ​
    Nun muss man den Doppelklick innerhalb einer halben Sekunde (500.000.000 Nanosekunden) auslösen, für den Dreifachklick hat man 500 + 500 Millisekunden Zeit.
    Auf diese Weise wird der Befehl eine halbe Sekunde nach dem letzten Klick ausgeführt, egal ob nun Einfach-, Doppel- oder Dreifachklick.
    default statt case wird immer ausgeführt, ein Vierfach- oder noch-mehr-klick würde also als Dreifachklick behandelt.

    Kommentar

    Lädt...
    X