Seite 1 von 3

OH2: Selection Widget und manuelle Änderungen

Verfasst: 21. Apr 2021 12:44
von OliverCJ
Hallo zusammen,

heute habe ich mir eine kleine Rule für die Rollladen im Wohnzimmer gebastelt. Das ganze mit einem Selection-Widget in der sitemap.

Das Item:

Code: Alles auswählen

Number WoZi_Rollladen_Szenen
    "Voreinstellungen Rollladen Wohnzimmer"
    <rollershutter>
    (gWoZiRollladen)
Die Sitemap:

Code: Alles auswählen

Selection item=WoZi_Rollladen_Szenen label="Szenen" mappings=[0="Alle offen", 1="Alle geschlossen", 2="Abendessen", 3="Straßenseite geschlossen"]
und die Rule dazu:

Code: Alles auswählen

rule "Wohzimmer - Rollladen Szenen"
when
 	Item WoZi_Rollladen_Szenen received update
then
 	if(WoZi_Rollladen_Szenen.state == 0) {
		logInfo("SceneRules:WoZi Rollladen", "Alle Rollläden offen gewählt")
		WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(0)
		WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(0)
	}
	if(WoZi_Rollladen_Szenen.state == 1) {
		logInfo("SceneRules:WoZi Rollladen", "Alle Rollläden geschlossen gewählt")
		WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
		WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
	}
 	if(WoZi_Rollladen_Szenen.state == 2) {
	    logInfo("SceneRules:WoZi Rollladen", "Abendessen gewählt")
   		WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(35)
		WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(55)
	}
	if(WoZi_Rollladen_Szenen.state == 3) {
		logInfo("SceneRules:WoZi Rollladen", "Nur Straßenseite geschlossen gewählt")
		WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
		WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
	}
end
Direkt zwei Anmerkungen dazu:
  • Der Aktor für den Rollladen an der Terrassentür kommt erst nächste Woche, dann werden es insgesamt drei Rollläden im Wohnzimmer sein, so dass es dann auch eine Unterscheidung zwischen state 1 und state 3 gibt.
  • Ich weiß, man hätte das über eine Group lösen können, aber bei drei Rollläden halte ich den Aufwand noch für vertretbar
Nun aber zur Frage: die Steuerung über die Auswahl klappt super, die Rollläden fahren immer schön in die gewünschte Position. Wenn ich aber nun am Taster bediene und die beiden Rollläden dadurch eine andere Einstellung erhalten, dann bleibt das Selection auf dem zuletzt gewählten Wert stehen.
Da steht dann also z.B. "Alle offen", dabei ist links auf 10% und rechts bei 20% (oder wie auch immer). Ich würde gerne noch einen Eintrag "Manuell gefahren" haben (den kann ich mir ja über das mapping in der sitemap dazu bauen), der dann gesetzt wird, wenn eben manuell gefahren wird und keiner der anderen Einträge zutreffend ist.
Richtig cool wäre es natürlich noch, sollte man bei der manuellen Fahrt tatsächlich genau die Einstellungen aus den Szenen treffen (bei "Alle offen" bekommt man das wohl hin, ohne das man es Zufall nennen muss), dass dann auch diese Szene im Selection eingestellt wird.

Und da gehen mir leider die Ideen aus :-)

Mag mir hier jemand mit einer rule helfen? DANKE!
Oliver

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 21. Apr 2021 19:24
von udo1toni
Nun ja... Du musst eigentlich nur das Gegenstück für Deine Rule schreiben:

Code: Alles auswählen

rule "Wohzimmer - Rollladen Rückmeldung"
when
    Item WoZi_Rollladen_liFe_Kanal4_LEVEL changed or
    Item WoZi_Rollladen_reFe_Kanal4_LEVEL changed or
    Item WoZi_Rollladen_Tuer_Kanal4_LEVEL changed
then
    val Number nLi   = WoZi_Rollladen_liFe_Kanal4_LEVEL.state as Number
    val Number nRe   = WoZi_Rollladen_reFe_Kanal4_LEVEL.state as Number
    val Number nTuer = WoZi_Rollladen_Tuer_Kanal4_LEVEL.state as Number
    var theState     = NULL

    if(nLi == 0 && nRe == 0 && nTuer == 0)
        theState = 0
    if(nLi == 85 && nRe == 85 && nTuer == 85)
        theState = 1
    if(nLi == 35 && nRe == 55 && nTuer == 0)
        theState = 2
    if(nLi == 85 && nRe == 85 && nTuer == 0)
        theState = 3
    if(WoZi_Rollladen_Szenen.state != theState)
        WoZi_Rollladen_Szenen.postUpdate(theState)
end
Es wäre natürlich schöner, wenn die Rule auf Member of gRollladenWZ changed triggern würde, aber Du hast ja auf diese Gruppe verzichtet... ;)
Egal... Der eigentliche Punkt: Sobald eines der Items seinen Status ändert, werden die Status aller drei beteiligten Items in lokale Konstanten geladen, anschließend werden die Status mit den Sollwerten der Positionen für die Items verglichen. Trifft eine der Bedingungen zu, so wird die Variable theState mit dem entsprechenden Wert gefüllt, ansonsten bleibt als Wert NULL bestehen.
Zum Abschluss wird der Wert in das Item geschrieben, sofern der aktuelle Wert vom Sollwert abweicht.

Die Rule wird für jedes Item triggern sobald der Laden seine Sollposition erreicht, das heißt, die Anzeige wird dreimal pro Gruppenfahrt umgeschaltet, eben bei jedem Stop eines Ladens.

Damit Deine Rule nicht ebenfalls jedesmal triggert, ist es aber unerlässlich, den korrekten Trigger zu verwenden, und das ist "received command".

Abgesehen davon bietet es sich hier natürlich an, switch-case einzusetzen:

Code: Alles auswählen

rule "Wohzimmer - Rollladen Szenen"
when
    Item WoZi_Rollladen_Szenen received command
then
    if(!(receivedCommand instanceof Number))
        return;
    switch(receivedCommand as Number) {
        case 0:{
            logInfo("scenes", "Wohnzimmer: Alle Rollläden offen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(0)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(0)
        }
        case 1:{
            logInfo("scenes", "Wohnzimmer: Alle Rollläden geschlossen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
        }
        case 2:{
            logInfo("scenes", "Wohnzimmer: Abendessen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(35)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(55)
        }
        case 3:{
            logInfo("scenes", "Wohnzimmer: Nur Straßenseite geschlossen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
        }
    }
end
Noch ein Hinweis am Rande: der erste String im Aufruf logInfo ist der Loggername (bzw. der letzte Teilstring des Loggernamens). Es mag sein, dass man alle möglichen Zeichen eingeben kann, ohne dass es zu Fehlermeldungen kommt, aber korrekt ist das nicht. Keine Leerzeichen, keine Sonderzeichen, keine Umlaute, nur Kleinbuchstaben oder camelCase, nicht das Wort rules (das wäre unnötige Redundanz). Das wäre so im Kurzen, wie man den Loggernamen festlegt.
Über den Loggenamen lässt sich steuern, welche Meldungen ausgegeben werden, und zwar, ohne openHAB neu zu starten (geht von der Karaf Konsole aus).

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 21. Apr 2021 22:10
von OliverCJ
Hallo Udo,

erstmal und mal wieder vielen Dank! Das werde ich dann morgen gleich mal ausprobieren und dann Rückmeldung geben... heute bin ich zu müde :-)

Es ist übrigens nicht so, dass ich keine Gruppe gRolladenWZ hätte. Die gibt es schon. Meine Anmerkung bezog sich nur darauf, dass ich sie bei den sendCommand-Befehlen nicht nutze. Eben weil es derzeit nur zwei sind und weil - wenn die Türe auch noch angeschlossen ist - es zwei Status gibt, die eh unterschiedliche Behanghöhen an die Aktoren schicken. Bei 0 und 1 könnte man aber sicherlich das Command auch an die Gruppe schicken...

Und auch Danke für die Verbesserung meiner bestehenden rule! Auch das werde ich dann morgen mal umbauen
Bei "received update" könnte das Ganze auch auslösen, wenn das item auf anderem Wege ein update erhält... hab ich nicht dran gedacht.
Switch-case: auch schön, aber wirklich kürzer ist der nicht. Gibts einen technischen Vorteil?
log-info: Stimmt, jetzt wo du es schreibst, fällt mir auch ein, dass ich das schon mal von Dir gelesen habe in einem Thread :-)

Gutes Nächtle

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 22. Apr 2021 00:38
von udo1toni
OliverCJ hat geschrieben: 21. Apr 2021 22:10 Es ist übrigens nicht so, dass ich keine Gruppe gRolladenWZ hätte. Die gibt es schon. Meine Anmerkung bezog sich nur darauf, dass ich sie bei den sendCommand-Befehlen nicht nutze.
Ja, dann kannst Du statt der vielen Trigger einfach Member of gRolladenWZ changed verwenden, das spart zwei Zeilen Code.
OliverCJ hat geschrieben: 21. Apr 2021 22:10 unterschiedliche Behanghöhen an die Aktoren schicken. Bei 0 und 1 könnte man aber sicherlich das Command auch an die Gruppe schicken...
Bei drei Items wird es tatsächlich keinen Vorteil bringen, aber man kann mit einer Hashmap die Behanghöhen sehr elegant speichern. Man könnte sogar die zweite Rule so gestalten, dass sie auf die selbe Hashmap zugreift und diese als Grundlage verwendet (allerdings etwas umständlich, da man die Hashmap nicht in beiden Richtungen lesen kann, man müsste also jeweils alle möglichen Werte überprüfen)
OliverCJ hat geschrieben: 21. Apr 2021 22:10 Bei "received update" könnte das Ganze auch auslösen, wenn das item auf anderem Wege ein update erhält... hab ich nicht dran gedacht.
Die Rule wird bei jedem Update triggern, das ist ja die Funktion des Triggers received update. Deshalb muss man unbedingt received command verwenden, weil der Status des Items ja aktiv umgeschrieben wird.
OliverCJ hat geschrieben: 21. Apr 2021 22:10 Switch-case: auch schön, aber wirklich kürzer ist der nicht. Gibts einen technischen Vorteil?
Aber Hallo, der Code hat vielleicht genauso viele Zeilen, aber da solltest Du dann doch mal etwas genauer auf den Code schauen.
Streng genommen kannst Du sogar die ersten beiden Zeilen (if... return;) weglassen, wenn Du statt receivedCommand as Number einfach receivedCommand.toString angibst und dann die Zahlen im case-Zweig in Anführungszeichen schreibst.
Für switch-case muss der Wert (receivedCommand) nur einmalig angegeben werden, das heißt auch, der Wert wird nur einmalig ausgelesen. Im Fall von receivedCommand spielt dieser Punkt natürlich keine Rolle, da es sich schon un eine Variable handelt, aber wenn man einen Status ausliest (so wie in der ursprünglichen Fassung) wird der Wert für if() viermal aus der Item Registry ausgelesen, im Fall von switch() nur einmalig (da geht es um tausende Taktzyklen gegenüber vielleicht zehn Taktzyklen, vermutlich könnte man das bei der Größenordnung sogar messen...)

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 22. Apr 2021 22:10
von OliverCJ
Hallo Udo,

vielen Dank für die Erklärungen im letzten Absatz. Ist einleuchtend und habe ich so übernommen.
Die Group gRolladenWZ habe ich dann tatsächlich noch verwendet und spare mir also die zwei Zeilen. Vielleicht mach ich das in case 0 und 1 auch noch... noch mal zwei Zeilen.

Kurz: Funktioniert alles und ich kann die 4 wichtigsten Positionen, die bei uns täglich vorkommen mit einer Auswahl anfahren. Sehr komfortabel.

Danke!

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 23. Apr 2021 08:24
von OliverCJ
Guten Morgen,

jetzt muss ich mich doch noch mal melden. Nachdem ich gestern Abend auf "Alle Rollläden geschlossen" gestellt habe, wurden die Positionen angefahren und die Szene ist auch so stehen geblieben. Auch heute früh stand sie noch auf dem Status.

Dann habe ich "Alle Rollläden offen" gewählt. Auch diese Position wurde angefahren, aber die Szene ist dann wieder auf die NULL-Auswahl gesprungen:
Rolladen-Szenen.JPG
Man sieht die beiden Positionen auf 0% aber das Selection ist leer. Hast Du - oder jemand anders - eine Idee warum?

Hier noch mal die beiden rules, wie ich sie jetzt verwende:

Code: Alles auswählen

rule "Wohzimmer - Rollladen Szenen"
when
    Item WoZi_Rollladen_Szenen received command
then
    if(!(receivedCommand instanceof Number))
        return;
    switch(receivedCommand as Number) {
        case 0:{
            logInfo("scenes", "Wohnzimmer: Alle Rollläden offen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(0)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(0)
        }
        case 1:{
            logInfo("scenes", "Wohnzimmer: Alle Rollläden geschlossen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
        }
        case 2:{
            logInfo("scenes", "Wohnzimmer: Abendessen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(35)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(55)
        }
        case 3:{
            logInfo("scenes", "Wohnzimmer: Nur Straßenseite geschlossen gewählt")
            WoZi_Rollladen_liFe_Kanal4_LEVEL.sendCommand(85)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(85)
        }
    }
end

rule "Wohzimmer - Rollladen Rückmeldung"
when
    Member of gRollladenWZ changed 
then
    val Number nLi   = WoZi_Rollladen_liFe_Kanal4_LEVEL.state as Number
    val Number nRe   = WoZi_Rollladen_reFe_Kanal4_LEVEL.state as Number
    //val Number nTuer = WoZi_Rollladen_Tuer_Kanal4_LEVEL.state as Number
    var theState     = NULL

    if(nLi == 0 && nRe == 0) // && nTuer == 0)
        theState = 0
    if(nLi == 85 && nRe == 85) // && nTuer == 85)
        theState = 1
    if(nLi == 35 && nRe == 55) // && nTuer == 0)
        theState = 2
    if(nLi == 85 && nRe == 85) // && nTuer == 0)
        theState = 3
    if(WoZi_Rollladen_Szenen.state != theState)
        WoZi_Rollladen_Szenen.postUpdate(theState)
end
Also eigentlich, genau wie Udo sie geschrieben hat, nur dass ich doch auf Member of gRollladenWZ changed als trigger geändert habe und das ich die Terrassentüre noch auskommentiert habe...

Danke!


PS. Gerade noch ein wenig hoch und runter gefahren. Das passiert immer dann, wenn ich die sitemap neu lade. Aber der Wert müsste doch im item WoZi_Rollladen_Szenen gespeichert bleiben...

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 23. Apr 2021 16:28
von OliverCJ
So, mal wieder ist mir in einer völlig abstrusen Situation ein Gedanke gekommen, der die Lösung sein könnte... werd ich nachher mal ausprobieren.
Ich hatte sogar selbst mal hier darüber berichtet...

Meine bisherigen Rolladenaktoren von Innogy kannten quasi nur einen Kanal, auf dem sowohl die Steuerung lief als auch die Behanghöhe geliefert wurde.

Bei den Homematic IP Geräten ist das etwas anders... Auf Kanal 0 kommen diverse Infos zum Gerät selbst, auf Kanal 3 wird die tatsächliche Behanghöhe geliefert und auf Kanal 4 wird gesteuert. Dort gibt es zwar auch eine Behanghöhe, das muss aber nicht die tatsächliche sein (Beispiel: Rolladen ist ganz oben und ich drücke auf den Schalter nach unten. In dem Moment spring die Behanghöhe von Kanal 4 auf 100%, völlig egal, ob ich die Fahrt schon nach 3 Sek. wieder anhalte). Kanal 3 zeigt nach der Fahrt die tatsächliche Höhe an...

Ich habe also jetzt mal in der zweiten Rule einfach den anderen Channel, der auf Kanal 3 zeigt, angegeben... bin gespannt, ob es damit klappt...

Nöö, Mist. Klappt auch nicht :(

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 23. Apr 2021 19:37
von OliverCJ
So, Lösung gefunden.. Ich habe einfach noch einen Timer eingebaut (die Rolladen fahren ca. 29 sec von 0 auf 100%):

Code: Alles auswählen

var Timer tWoZiRollladen = null

rule "Wohzimmer - Rollladen Rückmeldung"
when
    Member of gRollladenWZ changed 
then
    if (tWoZiRollladen !== null) {
        tWoZiRollladen.cancel()
        tWoZiRollladen = null
    }
    tWoZiRollladen = createTimer(now.plusSeconds(40), [|
        val Number nLi   = WoZi_Rollladen_liFe_Kanal3_LEVEL.state as Number
        val Number nRe   = WoZi_Rollladen_reFe_Kanal3_LEVEL.state as Number
        //val Number nTuer = WoZi_Rollladen_Tuer_Kanal4_LEVEL.state as Number
        var theState     = NULL

        if(nLi == 0 && nRe == 0) // && nTuer == 0)
            theState = 0
        if(nLi == 85 && nRe == 85) // && nTuer == 85)
            theState = 1
        if(nLi == 35 && nRe == 55) // && nTuer == 0)
            theState = 2
        if(nLi == 85 && nRe == 85) // && nTuer == 0)
            theState = 3
        if(WoZi_Rollladen_Szenen.state != theState)
            WoZi_Rollladen_Szenen.postUpdate(theState)
    tWoZiRollladen = null
    ])
end
Es wird also zuerst 40 Sek gewartet und erst dann werden die Werte in die val und var geschrieben. Dann werden die Werte verglichen, und theState gesetzt und zum Schluss die Szene gesetzt.

So passt das für mich...

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 24. Apr 2021 12:59
von OliverCJ
Oh man, ich geb's auf... heute klappt es schon wieder nicht, während es gestern - nach der Änderung an der Regel - erstmal funktioniert hat.
Woran könnte das denn nur liegen?

Re: OH2: Selection Widget und manuelle Änderungen

Verfasst: 24. Apr 2021 17:29
von udo1toni
Also, einen Timer solltest Du dafür gar nicht brauchen. Die Idee ist ja gerade, dass der Status gesetzt wird, wenn die Positionen angefahren wurden.

Möglichkeit 1: Die Positionsmeldung weicht vom Soll ab (kommt auf die verbaute Hardware an), dann müsstest Du halt entsprechend "Fenster" definieren, innerhalb deren der Wert als Wahr akzeptiert wird.
Möglichkeit 2: Die Status der Rollläden gehen verloren. Dann müsstest Du zunächst den Fehler lokalisieren, damit das nicht mehr passiert.