Seite 1 von 1

Dimmer 5128.10 von iluminize über Rollershutter steuern (Rollladen)

Verfasst: 4. Jan 2022 21:55
von Tommy
Hallo zusammen! Ich bin ein openHAB Neuling. Habe mich aber schon Stunden damit beschäftigt und viel gelesen. Hatte lange Pimatic mit 433Mhz Aktoren. Möchte nun auf Zigbee umsteigen. Einfache Steckdosen funktionieren bereits ohne Probleme. :-)

Um die Rollläden zu schalten habe ich mir die Aktoren 5128.10 von iluminize besorgt. Der Aktor wird in openHab als Dimmer angezeigt. Nutze ich den Slider kann ich über den Dimmwert den Rolladen steuern: hoch > 70%, 70% > stop > 30%, 1% < runter < 30%

Ich würde aber gerne ein Item "Rollershutter" für die Steuerung nutzen. Jetzt könnte ich vermutlich über Regeln arbeiten. Allerdings müsste ich ja dann für jeden Rollladen 3 Regeln (hoch, runter, stop) einrichten.

Gibt es evtl. eine elegantere Möglichkeit? Bin für jeden Tipp dankbar.

Re: Dimmer 5128.10 von iluminize über Rollershutter steuern (Rollladen)

Verfasst: 5. Jan 2022 23:18
von Tommy
Habe jetzt erst mal die weniger elegante Lösung umgesetzt. Habe für jeden Aktor ein neues Item "Rollershutter" angelegt und dann pro Aktor drei Regeln für Hoch, Runter und Stopp.

Ich habe die Hoffnung aber noch nicht aufgegeben, dass man das irgendwie eleganter gelöst bekommt. Falls noch jemand einen Tipp hat wäre ich sehr dankbar.

Re: Dimmer 5128.10 von iluminize über Rollershutter steuern (Rollladen)

Verfasst: 6. Jan 2022 10:13
von udo1toni
Also, grundsätzlich lassen sich solche Regeln eleganter erstellen, allerdings ist die Frage, warum das überhaupt als Dimmer angelegt wird, schließlich ist das gesteuerte Gerät ja gar nicht als Dimmer verwendbar.

Wie ist das Gerät angebunden (wie verbindest Du Dich mit Zigbee)? Es könnte sein, dass das Gerät falsch in der Datenbank hinterlegt ist. Mit Zigbee arbeite ich aber nicht, ich stochere da also genauso im Trüben.

Wie sendest Du denn das Stopp-Signal?

Hier dennoch mal eine Variante, wie ich das lösen würde, wenn es beim Dimmer Channel bleibt:
Gegeben für jeden Aktor ein Dimmer Item, Itemname entspricht der Form RSDim_Aktor, Wobei RSDim_ exakt so verwendet wird, das Wort Aktor wird durch ein eindeutiges Wort ersetzt, welches für jeden Shutter unterschiedlich ist. Wichtig: es muss exakt ein Wort sein, so dass das Item anschließend exakt einen Unterstrich enthält. Nun erzeugen wir dazu jeweils passend ein Rollershutter Item, dieses trägt den gleichen Namen, der vordere Teil lautet aber RSCtl_. Wir haben nun je Aktor zwei Items, z.B. RSDim_Wohnzimmer1 und RSCtl_Wohnzimmer1.
Weiterhin legen wir zwei Gruppen an, Typ der Gruppen ist egal, die eine Gruppe heißt gRSDim, die andere Gruppe heißt gRSCtl. Du kannst es Dir denken, alle Items, die mit RSDim_ anfangen kommen in die Gruppe gRSDim, alle Items, die mit RSCtl_ anfangen, kommen in die Gruppe gRSCtl.

Nun reichen zwei Rules:

Code: Alles auswählen

rule "RSCtl to RSDim"
when
    Member of gRSCtl received command
then
    val String strCtl = triggeringItem.name.split("_").get(1) // der Teil hinter dem _
    val myItem = gRSDim.members.filter[i|i.name.endsWith(strCtl)].head    // das passende Dimmer Item
    switch(receivedCommand) {
        case STOP: {
            myItem.sendCommand(STOP)  // hier noch korrekten Stop-Befehl einfügen
        }
        case UP: {
            myItem.sendCommand(100)
        }
        case DOWN: {
            myItem.sendCommand(0)
        }
        default:  {
            myItem.sendCommand(100-(receivedCommand as Number).intValue)
        }
    }
end

rule "RSDim to RSCtl"
when
    Member of gRSDim changed
then
    val String strDim = triggeringItem.name.split("_").get(1) // der Teil hinter dem _
    val myItem = gRSCtl.members.filter[i|i.name.endsWith(strDim)].head    // das passende Rollershutter Item
    myItem.postUpdate(100 - (newState as Number).intValue)
end
Die Rules lassen sich auch über die UI erstellen, aber ich habe sie hier in der normalen DSL Notation angegeben.

Funktionsweise:
Die erste Rule triggert, sobald eines der Rollershutter Items einen Befehl sendet. Zuerst wird der eindeutige Teil des Itemnamens ermittelt, anschließend wird das passende Item aus der zweiten Gruppe herausgesucht.
Danach wird abhängig vom empfangenen Befehl der passende Befehl an das Item gesendet. Dabei habe ich hier berücksichtigt, dass der Aktor offensichtlich falsch herum arbeitet. In openHAB ist ein Rolladen zu 100% geschlossen oder zu 0% geschlossen, "oben" ist also 0 und "unten" ist 100.

Die zweite Rule nimmt die Rückmeldung des Aktors entgegen, das läuft genauso wie in der ersten Rule, nur wird hier statt sendCommand ein postUpdate verwendet, um die Position in das passende Rollershutter Item zu schreiben. Der Status ist ausschließlich 0 - 100, so dass der "aktive" Teil der Rule nur aus einer Zeile besteht.
Es ist essenziell, dass die Rules mit exakt den angegeben Triggern arbeiten, weil sich sonst eine Endlosschleife bildet.

Aber wie gesagt, das wäre nur die zweite Wahl, erst mal würde ich versuchen, herauszufinden, ob man das Gerät nicht auch korrekt mit Rollershutter Channeln einbinden kann...

Re: Dimmer 5128.10 von iluminize über Rollershutter steuern (Rollladen)

Verfasst: 21. Jan 2022 22:09
von Tommy
Erst mal vielen Dank für die Rückmeldung und den ausführlichen Lösungsvorschlag! :)
Habe es leider erst jetzt gesehen. Bin mir eigentlich sicher keine Benachrichtigung erhalten zu haben. Muss ich mal die Tage beobachten.

Nun aber nochmal zur Sache: Die Schalter sind in der Tat etwas merkwürdig. Habe ich leider erst so richtig realisiert als sie schon eingebaut waren. Aber sie funktionieren grundsätzlich. Aktuell über 3 Regeln pro Rollladen. Der Schalter bietet zur Steuerung lediglich einen Dimmer-Channel. Weitere Channels gibt es nicht.

Die von dir vorgeschlagene Lösung würde die Anzahl der Regeln deutlich reduzieren. Auf den ersten Blick scheint das Skript aber auch eine gewisse Komplexität zu haben für eine eigentlich simple Aufgabe.

Da mich das Thema in den letzten Tagen nicht losgelassen hat habe ich mich weiter eingelesen und bin über die Transform Funktionalität von openhab gestolpert. Nach meinem Verständnis müsste es doch damit sehr elegant möglich sein!? Ich habe ein Item vom Typ "rollershutter". Dieses sendet mir UP, STOP und DOWN. Über ein einfaches mapping müsste es doch möglich sein den Korrekten Dimmer-Wert an den Channel zu übergeben. Ich habe dazu eine Datei shutter.map mit folgenden Werten im Verzeichnis transform abgelegt:
UP=99
STOP=50
DOWN=1

Wenn ich nun das Item mit dem Channel verlinke kann ich dort das Profil auswählen.

Bis dahin fühlt sich alles so richtig gut an. Aber es passiert einfach nichts. Bin ich auf dem Holzweg? Kann das überhaupt funktionieren? Bin für jede Einschätzung dankbar.

PS: Jetzt habe ich die Option "Mich benachrichtigen, sobald eine Antwort geschrieben wurde" gefunden :oops:

Re: Dimmer 5128.10 von iluminize über Rollershutter steuern (Rollladen)

Verfasst: 21. Jan 2022 23:41
von udo1toni
Vergiss bitte die Sache mit dem Profile, das ist eine one-way-Verbindung und Du greifst auf die falsche Seite zu.

Ich habe mir gerade mal die Bedienungsanleitung runtergeladen... Nun ja... wer nur Dimmer kann, kommt auf seltsame Bedienkonzepte.
Macht aber nichts, spart nur Code (weil das Ding ja quasi nichts kann...)

Code: Alles auswählen

rule "RSCtl to RSDim"
when
    Member of gRSCtl received command
then
    val String strCtl = triggeringItem.name.split("_").get(1)             // der Teil hinter dem _
    val myItem = gRSDim.members.filter[i|i.name.endsWith(strCtl)].head    // das passende Dimmer Item
    switch(receivedCommand) {
        case STOP: {
            myItem.sendCommand(50)
        }
        case UP: {
            myItem.sendCommand(99)
        }
        case DOWN: {
            myItem.sendCommand(1)
        }
    }
end
Reicht also. Das heißt, eine Rule, für beliebig viele Rollläden. Ich sehe da jetzt nicht die große Komplexität.
Wie oben erwähnt brauchst Du nur zwei Items pro Laden, eben das Dimmer Item und das Rollershutter Item. Damit es eine eindeutige Zuordnung zwischen beiden Items gibt, muss ein Teil des Namens identisch sein. Ein weiterer Teil des Namens muss sich zwischen beiden Items unterscheiden, da Itemnamen immer eineindeutig sein müssen. Damit openHAB mit den Items vernünftig umgehen kann, werden sie zwei Gruppen zugeordnet, für die Dimmer Items die eine Gruppe, für die Rollershutter Items die andere Gruppe. Der Code der Rule ist schnell erklärt. Nehmen wir an, wir haben ein Itempaar RSCtl_Wohnzimmer1 und RSDim_Wohnzimmer1.

Code: Alles auswählen

when
    Member of gRSCtl received command
Der Trigger. Eines der Items aus der Gruppe gRSCtl hat ein Kommando empfangen (entweder durch ein sendCommand() oder durch einen Channel, der ein Command an das Item senden kann oder halt durch die UI).

Code: Alles auswählen

val String strCtl = triggeringItem.name.split("_").get(1)
Erzeuge einen lokale Konstante (val) vom Typ String mit dem Namen strCtl und weise ihr den zweiten Teilstring (get(1)) des Namens (name) des triggernden Items (triggeringItem) zu. Trenne (split("_")) dazu den Namen an allen Stellen, an denen ein _ vorkommt auf. Aus RSCtl_Wohnzimmer1 wird eine Liste: {RSCtl, Wohnzimmer1}. Der zweite Eintrag in der Liste heißt Wohnzimmer1 -> die Konstante strCtl enthält nun also den String Wohnzimmer1.

Code: Alles auswählen

val myItem = gRSDim.members.filter[i|i.name.endsWith(strCtl)].head
Erzeuge einen lokale Konstante (val) mit dem Namen myItem (wähle den passenden Typ selbst) und weise dieser Konstanten das erste Item (.head) aus der Liste aller Items (members) der Gruppe gRSDim für die gilt (filter): der Name des Items endet mit dem String aus der Konstanten strCtl.
Die lokale Konstante myItem ist danach ein Zeiger auf das Item RSDim_Wohnzimmer1, da dies das einzige Item ist, bei dem der zweite Teilstring mit dem Inhalt der Konstanten übereinstimmt.

Code: Alles auswählen

switch(receivedCommand) {
wähle abhängig vom empfangenen Kommando (receivedCommand) aus folgenden Optionen:

Code: Alles auswählen

case STOP: {
receivedCommand enthält den Befehl STOP.

Code: Alles auswählen

myItem.sendCommand(50)
Sende den Befehl 50 an das Item myItem (welches synonym zu RSDim_Wohnzimmer1 ist...)
Die übrigen Zeilen erspare ich mir :)

Die Codezeilen mögen komplex aussehen, das liegt aber nur daran, dass Du nicht gewohnt bist, mit der DSL zu programmieren, bzw. noch nicht gelernt hast, wie das Objektmodell in der DSL funktioniert.

Re: Dimmer 5128.10 von iluminize über Rollershutter steuern (Rollladen)

Verfasst: 22. Jan 2022 23:38
von Tommy
Ich bin absolut begeistert! Vielen vielen Dank für die ausführliche und sehr gut nachvollziehbare Lösung. :) :)

Musste lediglich einen Teil der Items mit neuen Namen anlegen, die beiden Gruppen mit den entsprechenden Items anlegen und eine neue Regel anlegen. Dann den Quellcode an die Gruppennamen angepasst und fertig. Es hat auf Anhieb funktioniert. Einfach großartig!

Und ja, du hast Recht. Diese Lösung ist eigentlich nicht kompliziert, wenn man den Code versteht. ;)

Code: Alles auswählen

val String strCtl = triggeringItem.name.split("_").get(0) // Text vor dem _ 
val myItem = gRollershutterDim.members.filter[i|i.name.startsWith(strCtl)].head // Passendes Dimmer Item 
switch(receivedCommand) {
    case STOP: {
        myItem.sendCommand(50)
    }
    case UP: {
        myItem.sendCommand(99)
    }
    case DOWN: {
        myItem.sendCommand(1)
    }
}