Seite 1 von 1

MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 18. Dez 2023 22:55
von Proton
Hallo zusammen,
ich habe mit Hilfe des Forums, in Form von udo1toni, meine Rollladensteuerung für meine ZigBee-Rolllade über MQTT zum Laufen bekommen.
Diese würde ich jetzt gerne der entsprechenden non-semantic Gruppe hinzufügen.
Bild
In den entsprechenden Gruppen ist immer nur ein Item, dass die Werte UP, DOWN, STOP und Prozentwerte verarbeiten kann.
Dadurch kann ich in einem Zimmer, einer Etage oder im ganzen Haus die Rollladen hoch- und herunterfahren oder auf einen Prozentwert setzen.
Das Problem ist, dass bei der Steuerung des ZigBee Geräts zwei Items verwendet werden, eins für den State, was UP, DOWN und STOP versteht und eins für Position, das den Prozentwert versteht.

Gibt es eine Möglichkeit die Steuerung mit beiden Funktionalitäten in die Gruppe zu integrieren?

Schönen Gruß

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 19. Dez 2023 06:16
von udo1toni
Sorge dafür, dass die Steuerung pro Rollladen über exakt ein Item funktioniert (das sollte kein Problem sein... z.B. könnte man mit einem Script dafür sorgen, dass die Befehle UP, DOWN und STOP auf Channel 1 ausgegeben werden, die Befehl 0-100 aber auf Channel 2)
Die Rückmeldung sollte ohnehin immer aus der aktuellen Position bestehen. Sobald Du nur noch ein Item pro Rollladen hast, existiert Dein Problem nicht mehr :)

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 20. Dez 2023 12:44
von Proton
Hallo Udo! :)
Vielen Dank für die Antwort.
Ich habe es jetzt so gemacht, dass ich ein Item angelegt und dazu eine Regel erstellt habe, die aufgerufen wird, wenn das Item einen Befehl erhält.
Das Skript der Regel sieht wie folgt aus:

Code: Alles auswählen

val command = receivedCommand.toString

if (command == "UP"){
    Gemeinschaftsraum_Rollladen_Gaube_Position.sendCommand(100)
} else if (command == "DOWN"){
    Gemeinschaftsraum_Rollladen_Gaube_Position.sendCommand(0)
} else if( command == "STOP") {
    Gemeinschaftsraum_Rollladen_Gaube_Status.sendCommand(receivedCommand)
} else {
    Gemeinschaftsraum_Rollladen_Gaube_Position.sendCommand(receivedCommand.toString)
}
Eine Konvertierung

Code: Alles auswählen

if (command == "UP"){
    Gemeinschaftsraum_Rollladen_Gaube_Status.sendCommand("OPEN")
    // bzw.
    Gemeinschaftsraum_Rollladen_Gaube_Status.sendCommand(OPEN)
hat nicht funktioniert. Es geht bestimmt, aber ich weiß halt nicht wie :D

Und jetzt kommen die Fragen :roll:
Der Code oben funktioniert, scheint aber keinen Wert zu liefern. Muss man dort noch die Rückgabewerte speichern und zurückgeben?

Beim Anlegen des Items unter der non-semantic Gruppe, wurde auch ein semantic Item angelegt, dass ich jetzt erstmal im Modell in den Raum verschoben habe wo das Gerät ist, aber irgendwie fühlt sich das nicht richtig an, weil es eigentlich ein "unnötiges" Item ist, was dort jetzt liegt. Habe ich beim Anlegen was falsch gemacht und kann man das ändern?

Jetzt was themenfremdes:
Ich habe im Badezimmer zwei Thermostate, die ich nicht über eine Gruppe gesteuert bekomme, macht man sowas auch über solch ein Skript?

Schönen Gruß

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 20. Dez 2023 17:20
von udo1toni
Proton hat geschrieben: 20. Dez 2023 12:44Eine Konvertierung

Code: Alles auswählen

if (command == "UP"){
    Gemeinschaftsraum_Rollladen_Gaube_Status.sendCommand("OPEN")
    // bzw.
    Gemeinschaftsraum_Rollladen_Gaube_Status.sendCommand(OPEN)
hat nicht funktioniert. Es geht bestimmt, aber ich weiß halt nicht wie :D
Nein, das kann nicht funktionieren, denn OPEN ist kein Befehl :)
Wenn Du ein Proxy Item verwendest, musst Du natürlich auch den Status in das Proxy Item schreiben. Z.B. die Items Rollladen_Proxy, Rollladen_Position und Rollladen_Relativ, benötigen zwei Rules (hier der Einfachheit halber als DSL Text Rules):

Code: Alles auswählen

rule "Befehl senden"
when
    Item Rollladen_Proxy received command
then
    switch(receivedCommand.toString) {
        case "UP"   : Rollladen_Relativ.sendCommand(UP)
        case "DOWN" : Rollladen_Relativ.sendCommand(DOWN)
        case "STOP" : Rollladen_Relativ.sendCommand(STOP)
        default     : Rollladen_Position.sendCommand(receivedCommand)
    }
end

rule "Position übernehmen"
when
    Item Rollladen_Position changed
then
    Rollladen_Proxy.postUpdate(Rollladen_Position.state)
end
Diese beiden Rules sollten reichen, gesetzt den Fall, dass die Items alle vom Typ Rollershutter sind, oder zumindest die beiden, welche UP, DOWN und STOP verarbeiten können, und Position muss natürlich die aktuelle Position rückmelden, wenn der Rollladen stoppt, genauso wie es auf den Positionsbefehl reagieren muss.
Wenn Du die Items sinnvoll in Gruppen zusammenfasst kommst Du für eine beliebige Anzahl an solchen Item-Triplets mit einer Variante dieser beiden Rules aus:

Code: Alles auswählen

rule "Befehl senden"
when
    Member of gRollProxy received command
then
    val strRoll = triggeringItem.name.split("_").get(0)
    switch(receivedCommand.toString) {
        case "UP"   :  gRollRelativ.members.filter[i|i.name.startsWith(strRoll)].head.sendCommand(UP)
        case "DOWN" :  gRollRelativ.members.filter[i|i.name.startsWith(strRoll)].head.sendCommand(DOWN)
        case "STOP" :  gRollRelativ.members.filter[i|i.name.startsWith(strRoll)].head.sendCommand(STOP)
        default     : gRollPosition.members.filter[i|i.name.startsWith(strRoll)].head.sendCommand(receivedCommand)
    }
end

rule "Position übernehmen"
when
    Member of gRollPosition changed
then
    val strRoll = triggeringItem.name.split("_").get(0)
    gRollProxy.members.filter[i|i.name.startsWith(strRoll)].head.postUpdate(newState)
end
Hier also einfach drei Gruppen, für jede "Sorte" eine Gruppe, der erste Namensteil muss jeweils ein passendes Gegenstück in den beiden anderen Gruppen haben.

Man könnte auch mit einer Gruppe arbeiten, dann wird halt der Code in der Rule komplexer, weil anhand des Itemnamens weitere Unterscheidungen zu treffen sind. Da es hier nur um wenige Zeilen Code geht, ist die drei-Gruppen-Variante sicher die einfachste Lösung.

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 21. Dez 2023 01:01
von Proton
udo1toni hat geschrieben: 20. Dez 2023 17:20 Nein, das kann nicht funktionieren, denn OPEN ist kein Befehl :)
Das war natürlich ein Denkfehler von mir. Der Wert UP wird im Channel auf OPEN gemapped, den muss ich gar nicht ändern. :oops:
udo1toni hat geschrieben: 20. Dez 2023 17:20 switch(receivedCommand.toString) {
case "UP" : Rollladen_Relativ.sendCommand(UP)
case "DOWN" : Rollladen_Relativ.sendCommand(DOWN)
case "STOP" : Rollladen_Relativ.sendCommand(STOP)
default : Rollladen_Position.sendCommand(receivedCommand)
}
Und ein Switch Statment ist natürlich schöner. :D
udo1toni hat geschrieben: 20. Dez 2023 17:20 Hier also einfach drei Gruppen, für jede "Sorte" eine Gruppe, der erste Namensteil muss jeweils ein passendes Gegenstück in den beiden anderen Gruppen haben.
Ich möchte die Proxy_Items ja in der Gruppen der Räume haben. Mir ist nicht klar wie das mit den drei Gruppen zur Steuerung funktionieren soll. :?

Schönen Gruß

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 21. Dez 2023 03:06
von udo1toni
Wieso? Das Proxy Item ist ein "ganz gewöhnliches" Item, nur dass es eben nicht mit einem Binding verlinkt ist, sondern ausschließlich über Rules kommuniziert (rein wie raus)

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 22. Dez 2023 13:24
von Proton
Es ist vermutlich wieder ein Layer 8 Problem, aber so wie ich das

Code: Alles auswählen

Member of gRollProxy received command
verstehe, müssen alle Proxys in einer Gruppe sein. Wie soll ich die dann in die Gruppen der jeweiligen Räume bringen?

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 22. Dez 2023 14:42
von udo1toni
Items können zu beliebig vielen Gruppen gehören (solange es sich nicht um das Semantic Model handelt), die Gruppen müssen auch nichts miteinander zu tun haben (also z.B. hierarchische Struktur oder sowas).
Ein Rollershutter Item kann also gleichzeitig in der Gruppe gRollProxy als auch in der Gruppe gWohnzimmer sein :)

Im Semantic Model darf ein Item genau einer Gruppe angehören.
Neben der Zugehörigkeit zu exakt einer Semantic Group darf das Item aber zeitgleich beliebig vielen non-Semantic Groups angehören.

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 22. Dez 2023 19:11
von Proton
udo1toni hat geschrieben: 22. Dez 2023 14:42 Items können zu beliebig vielen Gruppen gehören (solange es sich nicht um das Semantic Model handelt),
Das wusste ich, ich wollte nur nicht das non-semantic Modell mit items und Gruppen "zumüllen".

Da stellt sich die Frage: Was sollte man bevorzugen? Zusätzlich drei Gruppen mit jeweils drei Items und einer Regel oder drei Regeln? Falls es eine Antwort gibt, wäre das "Warum" interessant. :D

Dabei fällt mir nochmal die Frage ein: Beim erstellen des ersten Proxy-Items im non-semantic Modell wurde auch ein Item im semantic Modell angelegt.
Zufällig eine Idee was ich da falsch gemacht habe? :roll:

Schönen Gruß

Re: MQTT-Rollladensteuerung einer Gruppe hinzufügen

Verfasst: 22. Dez 2023 21:41
von udo1toni
Jenun, ich habe ja oben schon geschrieben, dass es die beste Lösung wäre, wenn das Item nativ funktioniert.
Dazu ist zu erwähnen, dass der Link zwischen Item und Channel eine n:m Beziehung darstellt. Man kann also sowohl mehrere Items mit einem Channel verknüpfen, als auch mehrere Channel mit einem Item. Die Herausforderung besteht vor allem darin, dafür zu sorgen, dass die Position-Befehle ausschließlich im Position-Channel ankommen und die relativen Befehle (UP/STOP/DOWN) ausschließlich im relativen Channel. Meine Idee dazu wäre ein Transformation Script im Link, ungefähr so:

Code: Alles auswählen

                   Link -> REGEX nur relativ -> rollershutter Channel für UP/STOP/DOWN
Rollershutter Item
                   Link <-> REGEX nur Prozent <-> rollershutter Channel für Position (mit Rückmeldung)

REGEX:[DSU].* (nur relativ)
REGEX:\d+     (nur Zahl)
Dann kannst Du bequem Shuttter-Gruppen für Fassaden oder Stockwerke oder was auch immer anlegen, über die Du dann alle Läden gemeinsam steuern kannst.
Ob der REGEX Filter für die Aufgabe taugt, weiß ich nicht, aber das wäre ein erster Versuch.