Licht einschalten dauert ab und zu lange

Allgemeine Fragen rund um die "Smart Home" Hardware/Komponenten

Moderatoren: seppy, udo1toni

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Licht einschalten dauert ab und zu lange

Beitrag von Quautiputzli »

Hallo, bei mir dauert das Einschalten des Lichtes ab und zu recht lange. ( bis zu 4 sec.)

Es handelt sich um eine Phillips HUE die über zigbee2mqtt angebunden ist. Der Schalter ist ein Aquara Opple, der ebenfalls über zigbee2mqtt angebundnen ist. Wenn ich mir das logfile ansehe, sieht es aber danach aus, als ob die Verzögerung von openhab kommt.

Code: Alles auswählen

2021-04-18 09:51:58.090 [INFO ] [openhab.event.ChannelTriggeredEvent ] - mqtt:topic:broker:gf_office_switch:office_switch_trigger triggered button_1_single
2021-04-18 09:52:00.117 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'GF_Office_Light' received command 0,6,100
2021-04-18 09:52:00.127 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'GF_Office_Light' predicted to become 0,6,100
2021-04-18 09:52:00.132 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'GF_Office_Light' changed from 44,39,0 to 0,6,100
Hier sind es nun ca. 2 sec.
Das ist aber immer nur der Fall, wenn die Lampe eine Zeit lang nicht benutzt wurde, z.B. also morgens. Wenn ich dann nochmal schalte geht es ganz rasch.

Code: Alles auswählen

2021-04-18 10:03:28.453 [INFO ] [openhab.event.ChannelTriggeredEvent ] - mqtt:topic:broker:gf_office_switch:office_switch_trigger triggered button_4_single
2021-04-18 10:03:28.461 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'GF_Office_Light' received command 0,0,100
2021-04-18 10:03:28.462 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'GF_Office_Light' predicted to become 0,0,100
2021-04-18 10:03:28.465 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'GF_Office_Light' changed from 0,6,0 to 0,0,100
Das ganze wird über eine Rule gesteuert:

Code: Alles auswählen

var Timer tbuero = null

rule "Buero Schalter"
when
    Channel "mqtt:topic:broker:gf_office_switch:office_switch_trigger" triggered 
then
    if (tbuero !== null) tbuero.cancel() 
    switch(receivedEvent)  {
        case "button_1_single" : GF_Office_Light.sendCommand("0,6,100")
        case "button_2_single" : GF_Office_Light.sendCommand("180,6,100")
        case "button_3_single" : {
            if (GF_Office_Light.getStateAs(OnOffType) != ON)
                GF_Office_Light.sendCommand(ON)
            else
                GF_Office_Light.sendCommand(OFF)
        }
        case "button_4_single" : {
            if (GF_Office_Light.getStateAs(OnOffType) != ON)
                GF_Office_Light.sendCommand("0,0,100")
            else
                GF_Office_Light.sendCommand(OFF)
        }
        case "button_5_single" : GF_Office_Shutter.sendCommand(UP)
        case "button_6_single" : GF_Office_Shutter.sendCommand(DOWN)
        case "button_1_double" : GF_Office_Light.sendCommand("0,15,100")
        case "button_2_double" : GF_Office_Light.sendCommand("70,20,100")
        case "button_3_double" : {
            Office_Light_temp.sendCommand((Office_Light_temp.state as Number) + 20)
        }
        case "button_4_double" : {
            Office_Light_temp.sendCommand((Office_Light_temp.state as Number) - 20)
        }
        case "button_5_double" : GF_Office_Shutter.sendCommand(STOP)
        case "button_6_double" : GF_Office_Shutter.sendCommand(STOP)
        case "button_1_triple" : GF_Office_Light_str.sendCommand("blink")
        case "button_2_triple" : GF_Office_Light_str.sendCommand("breathe")
        case "button_3_triple" : GF_Office_Light_str.sendCommand("okay")
        case "button_4_triple" : GF_Office_Light_str.sendCommand("finish_effect")
        case "button_5_triple" : GF_Office_Light_str.sendCommand("color_loop")
        case "button_6_triple" : GF_Office_Light.sendCommand(new HSBType(new DecimalType(30), new PercentType(64), new PercentType(40)))
        case "button_1_hold" : {
            tbuero = createTimer(now, [ |
                var HSBType currentState
                currentState = GF_Office_Light.state as HSBType
                var DecimalType new_H = currentState.hue
                var PercentType new_S = currentState.saturation
                var PercentType new_B = new PercentType(currentState.brightness + 5)
                if( new_B > 98)
                    new_B = new PercentType(100)
                var HSBType newState = new HSBType(new_H,new_S,new_B)
                sendCommand(GF_Office_Light,newState.toString)
                if(new_B < 100)
                    tbuero.reschedule(now.plusNanos(200000000))
            ])
        }
        case "button_1_release" : {
            if(tbuero !== null) tbuero.cancel
        }
        case "button_2_hold" : {
            tbuero = createTimer(now, [ |
                var HSBType currentState
                currentState = GF_Office_Light.state as HSBType
                var DecimalType new_H = currentState.hue
                var PercentType new_S = currentState.saturation
                var PercentType new_B = new PercentType(currentState.brightness - 5)
                if( new_B < 20)
                    new_B = new PercentType(0)
                var HSBType newState = new HSBType(new_H,new_S,new_B)
                sendCommand(GF_Office_Light,newState.toString)
                if(new_B > 0)
                    tbuero.reschedule(now.plusNanos(200000000))
            ])
        }
        case "button_2_release" : {
            if(tbuero !== null) tbuero.cancel
        }
        case "button_5_hold" : {
            tbuero = createTimer(now, [ |
                var HSBType currentState
                currentState = GF_Office_Light.state as HSBType
                var DecimalType new_H = new DecimalType(currentState.hue + 10)
                var PercentType new_S = currentState.saturation
                var PercentType new_B = currentState.brightness
                if( new_H > 359)
                    new_H = new DecimalType(0)
                var HSBType newState = new HSBType(new_H,new_S,new_B)
                sendCommand(GF_Office_Light,newState.toString)
//                if(new_H < 360)
                    tbuero.reschedule(now.plusNanos(200000000))
            ])
        }
        case "button_5_release" : {
            if(tbuero !== null) tbuero.cancel
        }
        case "button_6_hold" : {
            tbuero = createTimer(now, [ |
                var HSBType currentState
                currentState = GF_Office_Light.state as HSBType
                var DecimalType new_H = new DecimalType(currentState.hue - 10)
                var PercentType new_S = currentState.saturation
                var PercentType new_B = currentState.brightness
                if( new_H < 10)
                    new_H = new DecimalType(359)
                var HSBType newState = new HSBType(new_H,new_S,new_B)
                sendCommand(GF_Office_Light,newState.toString)
//                if(new_H > 0)
                    tbuero.reschedule(now.plusNanos(200000000))
            ])
        }
        case "button_6_release" : {
            if(tbuero !== null) tbuero.cancel
        }
        case "button_3_hold" : {
            tbuero = createTimer(now, [ |
                var HSBType currentState
                currentState = GF_Office_Light.state as HSBType
                var DecimalType new_H = currentState.hue
                var PercentType new_S = new PercentType(currentState.saturation + 5)
                var PercentType new_B = currentState.brightness
                if( new_S > 95)
                    new_S = new PercentType(100)
                var HSBType newState = new HSBType(new_H,new_S,new_B)
                sendCommand(GF_Office_Light,newState.toString)
                if(new_S < 100)
                    tbuero.reschedule(now.plusNanos(200000000))
            ])
        }
        case "button_3_release" : {
            if(tbuero !== null) tbuero.cancel
        }
        case "button_4_hold" : {
            tbuero = createTimer(now, [ |
                var HSBType currentState
                currentState = GF_Office_Light.state as HSBType
                var DecimalType new_H = currentState.hue
                var PercentType new_S = new PercentType(currentState.saturation - 5)
                var PercentType new_B = currentState.brightness
                if( new_S < 5)
                    new_S = new PercentType(0)
                var HSBType newState = new HSBType(new_H,new_S,new_B)
                sendCommand(GF_Office_Light,newState.toString)
                if(new_S > 0)
                    tbuero.reschedule(now.plusNanos(200000000))
            ])
        }
        case "button_4_release" : {
            if(tbuero !== null) tbuero.cancel
        }
    }
end
Dauert es evtl. zu lange bis der aktuelle Status der Lampe ermittelt wird? Wie kann man nun rausfinden woran das liegt?
Servus

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

Re: Licht einschalten dauert ab und zu lange

Beitrag von udo1toni »

Das ist recht einfach erklärbar. openHAB lädt die Rules erst bei Bedarf in den Arbeitsspeicher. Wenn die Rule längere Zeit nicht genutzt wird, kann es sein, dass sie aus dem RAM-Cache fliegt. Die interessantere Frage ist natürlich, ob es eine Möglichkeit gibt, dieses Problem zu umgehen :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Licht einschalten dauert ab und zu lange

Beitrag von Quautiputzli »

Okay, die Info ist schonmal interessant.
Vielleicht sollte man dann doch versuchen soviel wie möglich nicht über Rules sondern mit verlinkten Channels zu machen.

Wie könnte ich denn die Eingangskommandos des Tasters wie z.B. "button_5_single" in einem Rollershutter Channel zuordnen? Brauch ich da eine Javascript-Transformation, oder kann man das "button_5_single" im Channel ins Feld Up Value schreiben. Muss ich mal ausprobieren.
Servus

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

Re: Licht einschalten dauert ab und zu lange

Beitrag von udo1toni »

Ich fürchte, das wird in dem fall gar nicht gehen, da der Channel ein Event Channel ist. Verknüpfungen zwischen Channels (unterschiedlicher Bindings) müssen zwingend über ein Item erfolgen. Wenn beide Channel zueinander passen (z.B. Number Channel des gleichen Typs, Switch Channel zu Switch Channel usw.) geht die Verknüpfung gewöhnlich über ein einfaches follow Profile. Das ist in Deinem Fall aber leider nicht gegeben, Du wirst um eine Rule nicht herum kommen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Licht einschalten dauert ab und zu lange

Beitrag von Quautiputzli »

Ja, bisher habe ich an dem Taster nur einen Trigger Channel, aber ich kann doch an dem Thing (Taster) noch mehrere Channels anlegen. z.B. ein rollorshutter, ein Switch usw., und die dann mit dem entsprechenden Item verlinken. Das sollte schon klappen. Das muss ich eben mal probieren, Ich weiß nur nicht, was ich im Channel des Tasters eintragen soll, da die Befehle die vom Tastet kommen ja "button_5_single" heißen, und nicht UP DOWN STOP.
Servus

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

Re: Licht einschalten dauert ab und zu lange

Beitrag von udo1toni »

Wenn die Tasterstatus über mqtt Topics rein kommen, musst Du eigentlich nur eine entsprechende Transformation einbauen, z.B. mit einer map Datei. Du musst dann nur noch den Channel so konfigurieren, dass der ankommende Status als Command gewertet wird und beide Channel mit demselben Item koppeln, dann wird der eingegebene Befehl vom Transformation Service in den passenden Befehl gemappt und an den Aktor gesendet.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Licht einschalten dauert ab und zu lange

Beitrag von Quautiputzli »

Ich denke, das habe ich verstanden. Das werde ich mal versuchen.

Eine andere Idee, die mit gestern gekommen ist, wäre von Zeit zu Zein eine Art "Wake Up Kommando" auf dem entsprechenden mqtt Topic zu senden, um die Rule im Arbeitsspeicher zu halten. Aber die direkt verlinkte Variante wäre wohl besser.
Servus

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Licht einschalten dauert ab und zu lange

Beitrag von Quautiputzli »

Ich habe gestern Abend noch kurz einen Test gemacht.
Ich habe beim dem betroffenen Aquara Schaltet einen Channel vom Typ Rollorshutter angelegt.

Code: Alles auswählen

UID: mqtt:topic:broker:gf_office_switch
label: Lichtschalter Büro
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:broker
location: Büro
channels:
  - id: office_switch_trigger
    channelTypeUID: mqtt:trigger
    label: Büro Schalter Trigger
    description: ""
    configuration:
      stateTopic: zigbee2mqtt/GF_Office_Switch
      transformationPattern: JSONPATH:$.action
  - id: office_switch_shutter
    channelTypeUID: mqtt:rollershutter
    label: Büro Schalter Rollo
    description: ""
    configuration:
      stop: button_5_double
      stateTopic: zigbee2mqtt/GF_Office_Switch
      transformationPattern: JSONPATH:$.action
      off: button_6_single
      on: button_5_single
Dabei kann man einfach die benötigten Befehle wie z.B. "button_5_single" eintragen. Das funktioniert schonmal.

Mit einer einfachen MAP Transformation habe ich es nicht geschafft, denn wenn ich im transformationPattern die Map Datei eintrage, kann diese ja die ankommenden JSON nicht verarbeiten, ich denke da müsste man dann mit einer JAVASCRIPT arbeiten.
Oder die MAP erst "zwischen" dem Channel und dem verlinktem Item, dann müsste man wahrscheinlich einen Channel vom Typ String nehmen. Ich weiß aber nicht, ob ich dann einen String Channel mit Items vom Typ Dimmer, Color usw. überhaupt verlinken kann.

Ich werde testen.
Servus

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

Re: Licht einschalten dauert ab und zu lange

Beitrag von udo1toni »

Wenn Du ankommend ein JSON hast, kannst Du JSONPATH verwenden, um das herauszufiltern. Eventuell kanst Du das Ergbnis dann anschließend noch mit map umsetzen (dafür kannst Du mehrere Transformations verknüpfen)

EDIT:

Ach so, ich sehe mir gerade Deine Konfiguration an, das legt ja den Schluss nahe, dass ON als DOWN ausgegeben wird und OFF als UP. Probiere es einfach mal aus, den Channel mit einem Rollershutter Item zu verknüpfen. Eventuell musst Du noch das Profile auf Follow setzen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 317
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Licht einschalten dauert ab und zu lange

Beitrag von Quautiputzli »

udo1toni hat geschrieben: 22. Apr 2021 13:07 Ach so, ich sehe mir gerade Deine Konfiguration an, das legt ja den Schluss nahe, dass ON als DOWN ausgegeben wird und OFF als UP. Probiere es einfach mal aus, den Channel mit einem Rollershutter Item zu verknüpfen. Eventuell musst Du noch das Profile auf Follow setzen.
Hi, so wie meine Configuration im Moment ist, funktioniert es ja. Und bei meiner Config kommt als JSON über mqtt "{"action": "button_5_single"}" an und gibt "up" aus (in Richutn Rollo Item). Keine Ahnung warum im code "on" steht. Womöglich wegen der "Gleichhaltung" in der UI sieht es so aus:
Bild_2021-04-22_182515.png
Aber, wenn ich dann bestimmte Werte, z.B. "120,100,100" an ein color Item senden will, wird es auf diese Art schwierig.
udo1toni hat geschrieben: 22. Apr 2021 13:07 Wenn Du ankommend ein JSON hast, kannst Du JSONPATH verwenden, um das herauszufiltern. Eventuell kanst Du das Ergbnis dann anschließend noch mit map umsetzen (dafür kannst Du mehrere Transformations verknüpfen)
Wie kann ich mehrere Transformationen verknüpfen?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Servus

Antworten