Seite 1 von 2

Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 25. Okt 2019 10:27
von OH-RNHome
Hallo Zusammen,

ich habe ein Problem mit Tradfri-Lampen über ein RaspBee-Modul von Dresden. Es geht um 4 Lampen in der Diele die bei Bewegung angeschaltet werden und nach 2 Minuten wieder ausgehen "sollen" und da kommen wir zu meinem Problem!
Teilweise gehen alle Lampen aus, manchmal nur 2, manchmal nur 3 usw.
Im Webinterface von Phoscon zeigt er die Lampen dann auch noch als "AN" an während Openhab sagt das alle Lampen aus sind.
Das Raspbee-Modul ist auf einem eigenen Raspberry nur für Deconz und von den Lampen 1m entfernt. Alle Lampen sind auf aktuellstem Stand.

Bin für Hilfe dankbar!
Gruß Olaf

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 25. Okt 2019 10:53
von curius
Hallo,

ich kann dir leider nicht weiterhelfen, aber vielleicht haben wir ja dasselbe Problem.

viewtopic.php?f=15&t=2534

Wenn ich meine drei Ikea Lichtpanele als Gruppe anspreche, reagieren nicht immer alle Teilnehmer zuverlässig.
Ich verwende jedoch nicht das RaspBee Modul sondern den CC2531 mit ZigBee2MQTT.

Meine Vermutung ist immer noch, dass es sich um ein Zeitproblem handelt.

Grüße
Christian

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 25. Okt 2019 12:00
von KellerK1nd
Eventuell ein Delay einbauen? Ich hab das bei der HUE Bridge, kommen zu viele Signale, dann verschluckt die Bridge die Signale, bzw. kommen gar nicht an. Darum hab ich mir Timer im Millisekunden Bereich eingebaut um ein Signaldelay zu erzeugen.

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 25. Okt 2019 22:51
von OH-RNHome
Wenn ich meine drei Ikea Lichtpanele als Gruppe anspreche, reagieren nicht immer alle Teilnehmer zuverlässig.
Ich verwende jedoch nicht das RaspBee Modul sondern den CC2531 mit ZigBee2MQTT.

Meine Vermutung ist immer noch, dass es sich um ein Zeitproblem handelt.
Hallo Christian,

danke für Deine Antwort Deine Vermutung scheint richtig zu sein ich habe zu Testzwecken mal eine Rule erstellt die alle Lampen einzeln ausschaltet bis jetzt gab es noch keine Probleme.

@ KellerKind
Kannst Du mir eventuell auf die Sprünge helfen mit den Delays?

Gruß Olaf

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 25. Okt 2019 22:51
von OH-RNHome
Wenn ich meine drei Ikea Lichtpanele als Gruppe anspreche, reagieren nicht immer alle Teilnehmer zuverlässig.
Ich verwende jedoch nicht das RaspBee Modul sondern den CC2531 mit ZigBee2MQTT.

Meine Vermutung ist immer noch, dass es sich um ein Zeitproblem handelt.
Hallo Christian,

danke für Deine Antwort Deine Vermutung scheint richtig zu sein ich habe zu Testzwecken mal eine Rule erstellt die alle Lampen einzeln ausschaltet bis jetzt gab es noch keine Probleme.

@ KellerKind
Kannst Du mir eventuell auf die Sprünge helfen mit den Delays?

Gruß Olaf

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 26. Okt 2019 08:13
von KellerK1nd
Ich hab zwischen den eigentlichen Befehlen die gesendet werden kleine Timer eingebaut.

Als Beispiel:

Code: Alles auswählen

Licht1.sendCommand(ON)
Timer = createTimer(now.plusMillis(600))[|
Licht2.sendCommand(ON)
Timer = null
]
Timer = createTimer(now.plusMillis(600))[|
Licht3.sendCommand(ON)
Timer = null
]
....
Das schöne, finde ich daran, man kann gezielt die Lampen anfahren und je nach Installation eine Art „Lauflicht“ bauen.

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 26. Okt 2019 08:36
von udo1toni
Die einfachste Möglichkeit, ein Delay einzubauen:

Items:

Code: Alles auswählen

Group:Dimmer gTradfri "Alle Tradfri"
Dimmer dTradfri_01 "Tradfri Lampe 1 [%d %%]" (gTradfri)
Dimmer dTradfri_02 "Tradfri Lampe 2 [%d %%]" (gTradfri)
Dimmer dTradfri_03 "Tradfri Lampe 3 [%d %%]" (gTradfri)

Dimmer pTradfri "Proxy Tradfri"
Rule:

Code: Alles auswählen

rule "control Tradfri Group"
when
    Item pTradfri changed
then
    gTradfri.members.forEach[i|
        i.sendCommand(pTradfri.state as Number)
        Thread::sleep(100)
    ]
end
Du musst natürlich immer das Proxy Item verwenden, um die Gruppe zu steuern, keinesfalls die Gruppe. Man könnte auf die Idee kommen, dioe Gruppe selbst zu verwenden, aber die Gruppe sendet dann selbst die Befehle (ohne Delay) und die Rule zeitgleich auch noch mal (mit Delay), was dann zu noch mehr Durcheinander führt.

Die Zeit in Thread::sleep() kannst Du natürlich anpassen, da ist Platz für Experimente (wieviele Telegrammme/Sekunde verträgt Tradfri?)

Noch kurz ein Hinweis: Thread::sleep() sollte keinesfalls für Verzögerungen über 500 Millisekunden verwendet werden, auch wenn das natürlich möglich ist. Der Grund ist hier, dass openHAB 5 Threads für die Rule-Abarbeitung zur Verfügung hat. Eine laufende Rule blockiert also einen Thread, und die Bezeichnung sleep ist wörtlich zu nehmen, der Thread ist weiterhin blockiert und schläft halt. Wenn man also z.B. eine Rule hat, die mit Thread::sleep(120000) zwei Minuten wartet, bis sie mit der Arbeit fortfährt, und diese Rule vielleicht außerdem mehrfach aufgerufen werden kann, kann die Abarbeitung jeglicher anderer Rules verhindert werden, indem die Rule einfach fünf mal startet wird.
Die Alternative ist dann, einen Timer zu verwenden. Timer werden im Scheduler von openHAB verwaltet und benötigen keinen Thread, bis der Timer abläuft (dann natürlich schon, um den hinterlegten Code auszuführen).

Man könnte die Rule oben genauso auch mit einem Timer realisieren. Nicht empfohlen für kleine Zeitspannen (unter 500Millisekunden):

Code: Alles auswählen

var Timer tTradfri = null

rule "control Tradfri Group"
when
    Item pTradfri changed
then
    tTradfri?.cancel
    tTradfri = createTimer(now.plusMillis(500), [ |
        if(gTradfri.members.filter[i|i.state != pTradfri.state].size > 0) {
            gTradfri.members.filter[i|i.state != pTradfri.state].head.sendCommand(pTradfri.state as Number)
            tTradfri.reschedule(now.plusMillis(500))
        } else
            tTradfri = null
    ]
end
Dieses Konstrukt wird die Lampen solange ansteuern, bis alle Lampen auf dem korrekten Wert sind. Falls man die Tradfri Items mit autoupdate="false"konfiguriert, kann es zu einem Problem kommen, wenn eine der Lampen nicht mehr erreichbar ist, denn das betreffende Item wird dann seinen Status nicht mehr ändern. In der Folge bleibt die Rule an dieser Lampe hängen. Will man das vermeiden, muss man eine zusätzliche Variable als Zeiger nutzen, aber auch hier lauern Fallstricke ;)

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 26. Okt 2019 08:39
von udo1toni
KellerK1nd hat geschrieben: 26. Okt 2019 08:13 Ich hab zwischen den eigentlichen Befehlen die gesendet werden kleine Timer eingebaut.

Als Beispiel:

Code: Alles auswählen

Licht1.sendCommand(ON)
Timer = createTimer(now.plusMillis(600))[|
Licht2.sendCommand(ON)
Timer = null
]
Timer = createTimer(now.plusMillis(600))[|
Licht3.sendCommand(ON)
Timer = null
]
....
Das schöne, finde ich daran, man kann gezielt die Lampen anfahren und je nach Installation eine Art „Lauflicht“ bauen.
Da Du mehrere Timer der gleichen Variablen zuweist, wird das so nicht funktionieren. Da die Timer unmittelbar hintereinander angelegt werden, gibt es auch nicht das erhoffte Delay ;) also bis auf das erste Mal...

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 26. Okt 2019 08:58
von KellerK1nd
udo1toni hat geschrieben: 26. Okt 2019 08:39
KellerK1nd hat geschrieben: 26. Okt 2019 08:13 Ich hab zwischen den eigentlichen Befehlen die gesendet werden kleine Timer eingebaut.

Als Beispiel:

Code: Alles auswählen

Licht1.sendCommand(ON)
Timer = createTimer(now.plusMillis(600))[|
Licht2.sendCommand(ON)
Timer = null
]
Timer = createTimer(now.plusMillis(600))[|
Licht3.sendCommand(ON)
Timer = null
]
....
Das schöne, finde ich daran, man kann gezielt die Lampen anfahren und je nach Installation eine Art „Lauflicht“ bauen.
Da Du mehrere Timer der gleichen Variablen zuweist, wird das so nicht funktionieren. Da die Timer unmittelbar hintereinander angelegt werden, gibt es auch nicht das erhoffte Delay ;) also bis auf das erste Mal...
Richtig. Das war jetzt nur schnell hingetippt und sollte nur exemplarisch dienen.

Re: Openhab Raspbee-Modul Tradfri-Lampen

Verfasst: 27. Nov 2019 21:09
von curius
Hallo,

habe soeben versucht ein Delay einzubauen nach der Logik von udo1toni => Besten Dank noch mal dafür...
Irgendwas scheint aber in meiner Syntax nicht zu passen.

Ich bekomme nämlich folgende Fehlermeldung:

Code: Alles auswählen

2019-11-27 21:00:04.812 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Lichtgruppe - EG': Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(org.eclipse.smarthome.core.items.Item,java.lang.String) on instance: null
Meine Rule sieht wie folgt aus:

Code: Alles auswählen

rule "Lichtgruppe - EG"
when
    Item plpanel_EG changed
then
    glpanel_EG.members.forEach[i|
        i.sendCommand(plpanel_EG.state)
        Thread::sleep(400)
    ]
end
... und meine Items:

Code: Alles auswählen

Group:Switch:OR(ON, OFF) glpanel_EG "Lichtpanele - EG" <light> (Home)
Switch plpanel_EG "Proxy Lichtpanel"
Das Gruppenitem "glpanel_EG" ist den einzelnen Lampen zugeordnet.
Im Beispiel von udo1toni handelt es sich um ein Dimmer Item, bei mir wäre es ein Switch.
In der Rule habe ich dementsprechend das ".state to number" weggelassen => da es sich ja nur um ein ON bzw. OFF handelt.

Könnt ihr mir sagen, wo der Fehler liegt?

Besten Dank!

Grüße
Christian