Gruppe von Rollos auf eine bestimmte Position fahren

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von jensilein »

Hallo, ich möchte unsere Rollo-Steuerung so weiterentwickeln, dass ich alle Rollos im Wohnzimmer (4 Rollos) mit einem einzigen Gruppen-(Sprach)Befehl gleichzeitig auf eine bestimmte Position fahren kann, z.B., sagen wir mal, alle Rollos sollen gemeinsam jeweils auf 50% abfahren. Aktuell funktioniert das „nur“ auf dem Weg, dass ich jedem Rollo einen eigenen separaten Befehl gebe. Die entsprechende rule hierfür sieht wie folgt aus. Das Ganze ist Timer-basiert, da ein direktes Anfahren einer bestimmten Position bei unseren Rollos nicht funktioniert:
val Number WZ_Rollo_01_100 = 20 // gemessene Zeit in Sekunden, die das Rollo von komplett offen auf komplett geschlossen fährt (hier 20sek)
var Number RolloTime_01 = -1 // das wird die Länge der Fahrt von der aktuellen bis zur gewünschten Position
var Number RolloDifference = NULL // Delta der Rollofahrt
var String RolloDirection = NULL // rauf oder runter

rule "WZ_Rollo_01_Alexa"
when
Item WZ_Rollo_01_Alexa received command
then
logInfo("Rollo 1 Alexa", "Actual Rollo Position: " + WZ_Rollo_01_Pos.state)
logInfo("Rollo 1 Alexa", "receivedCommand: " + receivedCommand)

var Timer timer = null

if ((receivedCommand as DecimalType).intValue == 100) {
// wenn Befehl 100%, dann Rollo ganz runter, ohne Timer (zum Reset)
RolloDirection = "DOWN"
RolloTime_01 = NULL
}

if ((receivedCommand as DecimalType).intValue == 0) {
// wenn Befehl 0%, dann Rollo ganz hoch, ohne Timer (zum Reset)
RolloDirection = "UP"
RolloTime_01 = NULL
}

if (receivedCommand > WZ_Rollo_01_Pos.state) {
// wir vergleichen die gewünschte neue Rollo-Position mit der aktuellen Rollo-Position, wenn „Neu“ größer „Ist“, muss das Rollo also runterfahren
RolloDifference = ((receivedCommand as DecimalType).intValue - (WZ_Rollo_01_Pos.state as DecimalType).intValue) // wir ermitteln den Abstand zwischen der aktuellen Position und der neuen Position als Prozent-Wert)
logInfo("Rollo 1 Alexa", "Rollo Difference: " + RolloDifference)
RolloDirection = "DOWN"
}

if (receivedCommand < WZ_Rollo_01_Pos.state) {
// wir vergleichen die gewünschte neue Rollo-Position mit der aktuellen Rollo-Position, wenn „Neu“ kleiner „Ist“, muss das Rollo also rauffahren
RolloDifference = ((WZ_Rollo_01_Pos.state as DecimalType).intValue-(receivedCommand as DecimalType).intValue) // wir ermitteln den Abstand zwischen der aktuellen Position und der neuen Position als Prozent-Wert)
logInfo("Rollo 1 Alexa", "Rollo Difference: " + RolloDifference)
RolloDirection = "UP"
}

if (RolloTime_01 === NULL) {
logInfo("Rollo 1 Alexa", "Rollo received command: " + RolloDirection)
WZ_Rollo_01.sendCommand(RolloDirection)
WZ_Rollo_01_Pos.sendCommand(receivedCommand) // wir geben die aktuelle Position ans Item.
RolloTime_01 = -1
logInfo("Rollo 1 Alexa", "Rollo Time: " + RolloTime_01)
} else {
RolloTime_01 = (RolloDifference/100) * WZ_Rollo_01_100 // wir errechnen die Fahrtlänge in Sekunden
logInfo("Rollo 1 Alexa", "Rollo received command: " + RolloDirection)
WZ_Rollo_01.sendCommand(RolloDirection)
logInfo("Rollo 1 Alexa", "Rollo Time: " + RolloTime_01)
timer = createTimer(now.plusSeconds(RolloTime_01.intValue), [|
logInfo("Rollo 1 Alexa", "Timer expired and Rollo set to STOP") // wenn Timer abgelaufen ist, stoppt die Rollofahrt
WZ_Rollo_01.sendCommand(STOP)
])
WZ_Rollo_01_Pos.sendCommand(receivedCommand) // wir geben die aktuelle Position ans Item.
}
end
Die rule habe ich analog für alle 4 Rollos so durchprogrammiert. Da die Rollos alle unterschiedlich groß sind und damit auch unterschiedliche Fahrzeiten aufweisen, muss hierbei natürlich für jedes Rollo seine eigene individuelle Fahrzeit gemessen und zugewiesen werden. Das war’s dann aber auch schon, das Ganze funktioniert auf dieser Basis soweit einwandfrei. Jetzt kommt aber wie gesagt der Wunsch, möglichst alle 4 Rollos gleichzeitig auf eine bestimmte Position fahren zu können, also z.B. alle Rollos gleichzeitig auf 50%. Wie könnte ich das möglichst elegant auf Basis des o.g. Ansatzes umsetzen? Ich hatte da an eine Art Programmschleife gedacht, in welcher für alle 4 Rollos individuell die betreffenden Positions-Vergleiche und Fahrzeit-Berechnungen durchgeführt und dann die Timer-basierten Fahrbefehle ausgelöst werden. Wäre das ein möglicher Lösungsansatz? Leider bin ich mit meinen Programmier-Kenntnissen an dieser Stelle am Ende der Fahnenstange angelangt, so dass ich Euch für entsprechende Unterstützung sehr dankbar wäre.

VG

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von Cyrelian »

Hi,

eigentlich ist alles was du suchst in dem Thread:

viewtopic.php?f=8&t=2193&start=40.
Das was du bauen willst passt eigentlich super in ein Lambda Funktion (Verschattung FUNKTION) und eine Map (val Map<String, Number> targetHights = newHashMap).

CU
Cyrelian

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von jensilein »

Hi Cyrelian,

vielen Dank für den Tipp. Werde mal versuchen, da durchzusteigen. Kurze Frage: wäre das Prinzip so, dass ich in der Map die Fahrzeiten der 4 Rollos hinterlege und in der „Lambda“ dann die notwendigen Berechnungen wie Positionsvergleich, Fahrzeitberechnung und Timer? Kannst Du mir hierzu noch ein wenig unter die Arme greifen, wie ich das vom Programmier-Code her am besten aufbauen kann...

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von Cyrelian »

Hi,

klar, kann ich machen. Ich schaue mir das mal an und fang mal an zu "bauen". Allerdings würde ich nicht auf Fahrzeit der Rollos gehen, sondern auf eine fixe Position.Das Problem mit der Fahrzeit ist, das diese im Winter und Sommer unterschiedlich ist. Nicht viel, aber man kann das geht ein den Werten sehen. Also am besten das Rollo in die gewünscht Position fahren und dann den Wert auslesen.

CU
Cyrelian

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von jensilein »

Hi Cyrelian,

ganz toll! Vielen Dank für Deine Hilfe.

LG, JG

Benutzeravatar
Cyrelian
Beiträge: 601
Registriert: 24. Sep 2015 17:55
Answers: 4

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von Cyrelian »

Hi,

hier mal meine Überlegung dazu.....nicht getestet!

Code: Alles auswählen

import org.eclipse.xtext.xbase.lib.Procedures

val Procedures.Procedure2<GroupItem, Number> rolloDirection = [rollo, rolloValue |
	 
    val Map<String, Number> targetHights25 = newHashMap ( 
                "WZ_Rollo_01" -> 25,
                "WZ_Rollo_02" -> 30,
                "WZ_Rollo_03" -> 27,
                "WZ_Rollo_04" -> 28,
                )

     rollo.members.forEach[ rollo |
                    if ((rollo.state as Number) < rolloValue) {
                        logInfo ("Lambda", logPrefix + "Fahre Rollladen (" + rollo.name.toString() + ") auf (" + rolloValue.intValue + ") %" )
                        rollo.sendCommand(rolloValue)
                        //Pushnachricht versenden
                        sendPushoverMessage(pushoverBuilder("Fahre Rollladen " + rollo.name.toString + " auf " + rolloValue + " %"))
                    } else {
                        logInfo ("Lambda", logPrefix + "Rollladen ist bereits weiter geschlossen (" + rollo.state.toString() + "%) als er geschlossen werden sollte und wird daher ignoriert")
                    }
                ]
]


rule "Rollo_01_Alexa"
when
    Item WZ_Rollo_Alexa received command
then
        rolloDirection.apply(WZ_Rollos,(receivedCommand as DecimalType).intValue)
end
Mit der val Map kannst du dann die tatsächlichen Position der Rollos angeben. ggf.macht man eine für 25% 50% usw. in der Lambda kann man dann noch mit ein paar IF abfragen arbeiten.

Hoffe das dient Dir etwas zur Inspiration ;)

CU
Cyrelian

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von jensilein »

Hi Cyrelian,

vielen Dank für Deine Anregung. Das Problem bei meinen Rollos ist, dass diese nicht auf eine konkrete Position bzw. %-Wert geschickt werden können, sondern eine Positionierung nur über die Fahrzeit möglich ist... :shock:

VG

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von PeterA »

Was hast Du denn für Rolladenaktoren?

Gruß Peter
- OpenHab 2.4
#PWRUP

jensilein
Beiträge: 34
Registriert: 24. Feb 2018 09:11

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von jensilein »

Hi Peter,

ich habe bei mir im Haus LCN verbaut.

VG

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Gruppe von Rollos auf eine bestimmte Position fahren

Beitrag von PeterA »

Ok, zu denen kann ich leider nichts sagen.
Hier werkeln Shellys...Die können, nach einer Kalibrierung den Rolladen auf +/- 3% genau Positionieren.

Gruß Peter
- OpenHab 2.4
#PWRUP

Antworten