OH2: Selection Widget und manuelle Änderungen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
OliverCJ
Beiträge: 405
Registriert: 29. Aug 2017 12:41
Answers: 3
Wohnort: Bergisch Gladbach

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von OliverCJ »

Hallo Udo,
das ist es ja gerade, die Positionsmeldungen sind genau und der Status geht m.E. auch nicht verloren. Ich habe ja extra noch mal auf den Kanal 3 gewechselt, da dort die tatsächliche Behanghöhe geliefert wird. Ich zeig noch mal gerade, wie es jetzt genau ausschaut:

Code: Alles auswählen

var Timer tWoZiRollladen = null

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(82)
            WoZi_Rollladen_reFe_Kanal4_LEVEL.sendCommand(82)
        }
    }
end

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 == 82 && nRe == 82) // && nTuer == 0)
            theState = 3
        if(theState != WoZi_Rollladen_Szenen.state)
            WoZi_Rollladen_Szenen.postUpdate(theState)
    tWoZiRollladen = null
    ])
end
  • Den Timer habe ich einfach mal global definiert.
  • Bei case 3 bin ich auf 82% Behanghöhe gegangen, da er sich sonst aktuell - wegen der noch fehlenden Terrassentüre - nicht von case 1 unterschieden hat (da hatte ich vermutet, dass sich das irgendwie verschluckt)
  • Da ein Rollladen maximal 29 Sekunden fährt, hatte ich mir gedacht, mit dem Timer wartet er 40 Sekunden und schreibt dann den Status der beiden Behanghöhen in die beiden values nLi und nRe
  • Anschließend werden die IFs durchlaufen und theState korrekt gesetzt. Der spring aber immer wieder auf NULL oder einen case, der nicht passt (eben waren alle Rollladen oben - von meiner Frau manuell gefahren) und trotzdem wurde case 1 "Alle Rollladen geschlossen" angezeigt.
Habe jetzt manuell noch mal ein beliebige Position angefahren. Anzeige ist korrekt:
Rollladen1.JPG
Jetzt fahre ich, wieder manuell, bis auf 0%, also nach ganz oben. 40 Sek gewartet, aber die Anzeige bleibt:
Rollladen2.JPG
Die beiden Behanghöhe, die dort angezeigt werden, sind die LEVEL von Kanal 3. Hier noch mal ein Bild aus VSC:
Rollladen3.JPG
Der zeigt zumindest mal für das linke Fenster den Wert, der beim Mouse-over angezeigt wird. Ich kann aber versichern, dass der beim rechten auch 0 ist. Das Log zeigt das auch:

Code: Alles auswählen

2021-04-25 13:48:26.690 [vent.ItemStateChangedEvent] - WoZi_Rollladen_liFe_Kanal3_LEVEL changed from 5 to 0

2021-04-25 13:48:26.728 [vent.ItemStateChangedEvent] - WoZi_Rollladen_liFe_Kanal4_LEVEL changed from 100 to 0

2021-04-25 13:48:27.889 [vent.ItemStateChangedEvent] - WoZi_Rollladen_reFe_Kanal3_LEVEL changed from 7 to 0

2021-04-25 13:48:27.928 [vent.ItemStateChangedEvent] - WoZi_Rollladen_reFe_Kanal4_LEVEL changed from 100 to 0

  <null>.tWoZiRollladen = <XNullLiteralImplCustom>

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

  <null>.tWoZiRollladen = <XNullLiteralImplCustom>

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Allerdings habe ich keine Ahnung, was mir die vier letzten Zeilen sagen wollen...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_______________________________________________
Homematic IP Komponenten an CCU 3 (wächst stetig)
Innogy Smarthome System (verabschiedet sich langsam)
Philips Hue Beleuchtung
Fritz!Box
VU+ Solo SAT-Receiver
2 Squeezeboxen
Denon Heos System

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von Backbe01 »

Edit: Sorry Oliver das ich in den Threads geplatzt bin. Hatte die Seite nicht aktualisiert und deinen neuen Post nicht gesehen. Dachte dein Problem wäre erledigt.

Ich habe mir die "Rückmelde-Rule" etwas umgebaut für meine Lichtszenen. Leider bekomme ich eine Fehlermeldung im Log. An was könnte das liegen?

Fehlermeldung:

Code: Alles auswählen

2021-04-25 21:43:14.898 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Esszimmer - Scene Rückmeldung': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.postUpdate(org.eclipse.smarthome.core.items.Item,org.eclipse.smarthome.core.types.State) on instance: null
Hier meine Rule (ganz unten):

Code: Alles auswählen

rule "Szenen_Esszimmer_Auswahl"

when 
    Item nSzene_Esszimmer received command 
then 
    if(!(receivedCommand instanceof Number)) return;
    switch receivedCommand  {
        //Szene aus
        case 1: {
            LEDstripe_EG_EsszimmerDF.sendCommand(75)
            LEDstripe_EG_EsszimmerDH.sendCommand(0)
            
        }    
        
        //Morgenlicht
        case 2: {
            LEDstripe_EG_EsszimmerDF.sendCommand(39)
            LEDstripe_EG_EsszimmerDH.sendCommand(75)
            
        }
        //Nachtlicht
        case 3: {
            LEDstripe_EG_EsszimmerDF.sendCommand(85)
            LEDstripe_EG_EsszimmerDH.sendCommand(1)
            
        }
        
        //Entspannen
        case 4: {
            LEDstripe_EG_EsszimmerDF.sendCommand(85)
            LEDstripe_EG_EsszimmerDH.sendCommand(57)
            
        }
        //Lesen
        case 5: {
            LEDstripe_EG_EsszimmerDF.sendCommand(56)
            LEDstripe_EG_EsszimmerDH.sendCommand(100)
            
        }
        //Konzentrieren
        case 6: {
            LEDstripe_EG_EsszimmerDF.sendCommand(23)
            LEDstripe_EG_EsszimmerDH.sendCommand(100)
            
        }
        //Energie tanken
        case 7: {
            LEDstripe_EG_EsszimmerDF.sendCommand(1)
            LEDstripe_EG_EsszimmerDH.sendCommand(100)
            
        }
        //Sonnenuntergang
        case 8: {
            LEDstripe_EG_EsszimmerDF.sendCommand(67)
            LEDstripe_EG_EsszimmerDH.sendCommand(93)
           
        }
        //Tropendämmerung
        case 9: {
            LEDstripe_EG_EsszimmerDF.sendCommand(49)
            LEDstripe_EG_EsszimmerDH.sendCommand(74)
           
        }
        //Nordlichter
        case 10: {
            LEDstripe_EG_EsszimmerDF.sendCommand(0)
            LEDstripe_EG_EsszimmerDH.sendCommand(59)
           
        }
        //Frühlingsblüten
        case 11: {
            LEDstripe_EG_EsszimmerDF.sendCommand(17)
            LEDstripe_EG_EsszimmerDH.sendCommand(83)
           
        }
        //Hell
        case 12: {
            LEDstripe_EG_EsszimmerDF.sendCommand(62)
            LEDstripe_EG_EsszimmerDH.sendCommand(100)
           
        }
        //Gedimmt
        case 13: {
            LEDstripe_EG_EsszimmerDF.sendCommand(62)
            LEDstripe_EG_EsszimmerDH.sendCommand(31)
            
        }
    }
end 

rule "Esszimmer - Scene Rückmeldung"
when
    Member of gSzenengeraete changed 
then
    val Number nEZDF   = LEDstripe_EG_EsszimmerDF.state as Number
    val Number nEZDH   = LEDstripe_EG_EsszimmerDH.state as Number
    var theState       = NULL

    //Szene aus
    if(nEZDF == 75 && nEZDH == 0 )
        theState = 1
    //Nachtlicht
    if(nEZDF == 85 && nEZDH == 1 )
        theState = 3
    //Morgenlicht
    if(nEZDF == 39 && nEZDH == 75 )
        theState = 2
    //Benutzerdefiniert
    if(nSzene_Esszimmer.state != theState)
        nSzene_Esszimmer.postUpdate(theState)
end
OH 4.1.0M2 auf nuc in Docker

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von Backbe01 »

Hi Oliver, klappt bei Dir die Rückmeldung? Ich habe die Rule jetzt etwas umgebaut, das zumindest der Fehler ausbleibt (statt = habe ich ==). Fehler weg, aber Rückmeldung erfolgt keine.

Rule:

Code: Alles auswählen

rule "Esszimmer - Scene Rückmeldung"
when
    Member of gSzenengeraete changed 
then
    val Number nEZDF   = LEDstripe_EG_EsszimmerDF.state as Number
    val Number nEZDH   = LEDstripe_EG_EsszimmerDH.state as Number
    var theState       = NULL

    //Szene aus
    if(nEZDF == 75 && nEZDH == 0 )
        theState == 1
    //Nachtlicht
    if(nEZDF == 85 && nEZDH == 1 )
        theState == 3
    //Morgenlicht
    if(nEZDF == 39 && nEZDH == 75 )
        theState == 2
    //Benutzerdefiniert
    if(nSzene_Esszimmer.state != theState)
        nSzene_Esszimmer.postUpdate(theState)
end
OH 4.1.0M2 auf nuc in Docker

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von udo1toni »

Nein, das ist Quatsch.

== -> Vergleich, wahr wenn linke und rechte Seite gleich sind
= -> Zuweisung, Wert auf der rechten Seite wird der Variablen auf der linken Seite zugewiesen.

NULL -> Itemstatus
null -> Variablenwert (bzw. die Abwesenheit eines solchen)

=== -> Vergleich, wahr wenn linke und rechte Seite IDENTISCH sind. Dieser spezielle Vergleich ist nur im Zusammenhang mit null sinnvoll (nicht mit NULL!)
Dazu muss man wissen, wie Variablen "wirklich" gespeichert werden, und zwar wird der Wert in einer bestimmten Speicherzelle gespeichert, die Variable enthält dann einen Zeiger auf die Speicherzelle, in der der Wert gespeichert ist. Wenn eine Variable nicht initialisiert ist bzw. deinitialisiert wurde, so wird der Zeiger auf eine ganz bestimmte Speicherzelle "verbogen", so dass die Variable nun auf die Speicherzelle verweist, die für den Wert null steht.
Es geht also darum, dass der Zeiger auf die selbe Speicherzelle verweist, es handelt sich dann um den selben (und eben nicht um den gleichen) Wert.

Es ist möglich, dass openHAB die Definition der Variablen theState nicht korrekt als NumberItemType vornimmt, dann würde die Zuweisung schief gehen.
Ich bin mir nicht sicher, ob es reicht, die Variablendefinition einfach so zu schreiben:

Code: Alles auswählen

var NumberItem theState = NULL
Wohlgemerkt, es geht um eine Variable, es ist kein Item, die Variable kann dann aber mit allen Werte gefüllt werden, die auch ein entsprechendes Item annimmt (eben auch NULL oder UNDEV, was eine Variable vom Typ Number nicht speichern könnte).
Falls das nicht klappt, könnte man (etwas komplizierter) drumherum arbeiten, indem man die Variable als Number definiert und sie z.B. mit -1 füllt. Dann muss der letzte Vergleich aber anders aussehen:

Code: Alles auswählen

if(theState > -1) {
    if(nSzene_Esszimmer.state != theState)
        nSzene_Esszimmer.postUpdate(theState)
} else
    if(nSzene_Esszimmer.state != NULL)
        nSzene_Esszimmer.postUpdate(NULL)
Die geschweiften Klammern sind in diesem Fall notwendig, damit die Rules Engine weiß, dass sich das else auf das erste if bezieht.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von Backbe01 »

Hallo Udo, vielen Dank für Deine Unterstützung und danke für die Info´s.

Leider will es mit beiden deiner Vorschläge nicht klappen. Ist aber für mich nicht weiter schlimm. Ich habe nur den Thread gelesen und dachte, das wäre was für mich. Aber absolut kein Musthave! Das sind schon Luxusprobleme.

Ich hoffe, ihr findet bei OliverCJ noch die Lösung...

Viele Grüße
Gerhard
OH 4.1.0M2 auf nuc in Docker

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von udo1toni »

Sicher? Reden wir über diese Änderungen?

Code: Alles auswählen

rule "Esszimmer - Scene Rückmeldung"
when
    Member of gSzenengeraete changed 
then
    val Number nEZDF   = LEDstripe_EG_EsszimmerDF.state as Number
    val Number nEZDH   = LEDstripe_EG_EsszimmerDH.state as Number
    var Number theState = -1

    //Szene aus
    if(nEZDF == 75 && nEZDH == 0 )
        theState = 1
    //Nachtlicht
    if(nEZDF == 85 && nEZDH == 1 )
        theState = 3
    //Morgenlicht
    if(nEZDF == 39 && nEZDH == 75 )
        theState = 2
    //Benutzerdefiniert

    if(theState > -1) {
        if(nSzene_Esszimmer.state != theState)
            nSzene_Esszimmer.postUpdate(theState)
    } else
        if(nSzene_Esszimmer.state != NULL)
            nSzene_Esszimmer.postUpdate(NULL)
end
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04
Answers: 0

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von Backbe01 »

Udo... Du bist aber auch ein Fuchs!! Asche auf mein Haupt!! Es läuft.

Wo könnte ich denn einstellen, dass statt NULL, wenn die Scene nicht passt, "Benutzerdefiniert" steht?
OH 4.1.0M2 auf nuc in Docker

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von udo1toni »

Du kannst die map Transformation installieren, eine *.map Datei anlegen und dort für jeden möglichen Wert einen Text hinterlegen, auch für NULL.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Benutzeravatar
OliverCJ
Beiträge: 405
Registriert: 29. Aug 2017 12:41
Answers: 3
Wohnort: Bergisch Gladbach

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von OliverCJ »

Hallo zusammen und Sorry, dass ich mich heute erst wieder melde... zu viel zu tun...

Tatsächlich läuft es jetzt bei mir, nachdem ich noch ein wenig rumgefummelt habe. Ich weiß zwar nicht genau, welche der Änderungen zum Erfolg geführt hat (vielleicht hätte ich nicht alle gleichzeitig machen sollen), vermute aber, dass es an einer zusätzlichen Szene liegt, die ich hinzugefügt habe.

Udo hat ja theState auf NULL gesetzt, ich hab's jetzt so gemacht:

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", 4="manuell gefahren"]
4="manuell gefahren" ist neu.

Die erste Rule ist unverändert, da ich die Auswahl "manuell gefahren" ja nie im Selection treffen würde (und wenn, dann eben einfach nichts passiert).

Die zweite Rule dann einfach so angepasst:

Code: Alles auswählen

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 = 4

        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 == 82 && nRe == 82) // && nTuer == 0)
            theState = 3
        if(theState != WoZi_Rollladen_Szenen.state)
            WoZi_Rollladen_Szenen.postUpdate(theState)
    tWoZiRollladen = null
    ])
end
  • Ich setze theState also jetzt auf 4 und nicht mehr auf NULL
  • Die Prüfung im letzten if habe ich umgedreht (keine Ahnung, ob das eine Auswirkung hat, vermute aber nicht
  • Den Timer habe ich erstmal drin gelassen, versuche aber am Wochenende noch mal ohne

_______________________________________________
Homematic IP Komponenten an CCU 3 (wächst stetig)
Innogy Smarthome System (verabschiedet sich langsam)
Philips Hue Beleuchtung
Fritz!Box
VU+ Solo SAT-Receiver
2 Squeezeboxen
Denon Heos System

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: OH2: Selection Widget und manuelle Änderungen

Beitrag von udo1toni »

Ja, statt NULL kannst Du natürlic hauch einen gültigen Wert verwenden.

Aber der Timer ist immer noch unnötig. ;)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten