Seite 1 von 2

Farbwert in Variable speichern?

Verfasst: 3. Mär 2022 21:33
von Steinspiel
Moin,

Vorweg: ich stochre hier im Variablennebel, die ich ganz zu Anfang schon falsch deklariere, nur wie ist es richtig?

Ich habe einen Türkontakt der, wenn er OPEN schaltet eine LED weiß einschaltet.
Wenn die Tür wieder schließt und CLOSED schaltet soll die LED den Farbwert annehmen die es vor dem Öffnen hatte. Also habe ich das mit einer Variablen Versucht, die mir gleich als Fehlerhaft (cannot infer type) angezeigt wird.

Code: Alles auswählen

var farb_Wert 

rule "Kontakt_EIN"
when
    Item tuerkont changed to OPEN                                          
then
    led.state = farb_Wert
    led.sendCommand("0,0,100")          
end

rule "Kontakt_AUS"
when
    Item tuerkont changed to CLOSED                                          
then
    led.sendCommand("farb_Wert")          
end
Kann man überhaupt "so einfach" einen Farbwert in einer Variablen speichern?
Danke und einen schönen Abend noch...

Re: Farbwert in Variable speichern?

Verfasst: 4. Mär 2022 00:14
von peter-pan
Ich nehme mal an, das "led" ein Item ist. Ich weiss nicht was da für ein Typ ist.
Wenn die Tür geöffnet wird sollte der Wert von "led" gespeichert werden. So wie ich das verstehe müsstest du dann eigentlich

Code: Alles auswählen

farb_Wert = led.state
in der "Open-Rule" verwenden.

Und dann kannst du diesen Wert beim schliessen (Close-Rule) wieder zurück schreiben, aber so:

Code: Alles auswählen

led.sendCommand(farb_Wert)
da "varb_Wert" eine Variable ist und kein Text.

Re: Farbwert in Variable speichern?

Verfasst: 4. Mär 2022 11:52
von udo1toni
Color Items arbeiten mit HSB als Farbmodell. Du kannst entweder eine Variable als HSBType definieren, oder Du speicherst den Status als String.
Da Du den Wert als solches nicht manipulieren, sondern nur wiederherstellen möchtest, dürfte der Weg über String der einfachere sein:

Code: Alles auswählen

var String strFarbe = "0,0,0" 

rule "Türkontakt geändert"
when
    Item tuerkont changed
then
    if(newState == OPEN) {
        strFarbe = led.state.toString
        led.sendCommand("0,0,100")
    } else {
        led.sendCommand(strFarbe)
    }
end
Es reicht eine Rule :) Natürlich ist die Rule nicht sicher, was passiert z.B., wenn der Türkontakt auf CLOSED wechselt, aber vorher openHAB neu gestartet wurde? Das wäre eine typische Situation, in der die Rule vermutlich fehlschlagen dürfte. Deshalb auch der Default Wert "0,0,0", so dass die Lampe dann halt aus schaltet.
Man könnte das Item allerdings auch persistieren und einfach zum vorigen Zustand zurückkehren, so:

Code: Alles auswählen

rule "Türkontakt geändert"
when
    Item tuerkont changed
then
    if(newState == OPEN) {
        led.sendCommand("0,0,100")
    } else {
        led.sendCommand(led.previousState(true).state.toString)
    }
end
Es muss eine Persistence wie rrd4j oder jdbc verwendet werden. Bei jdbc wäre ein everyChange,restoreOnStartup hinreichend, bei rrd4j muss noch everyMinute dazu. mapdb funktioniert nicht, da hier nur der aktuelle Status gespeichert wird. Der Parameter true sorgt dafür, dass nur solche vorigen Zustände berücksichtigt werden, die sihc vom aktuellen Zustand unterscheiden.
Wird nicht der default Persistence Service zum restore verwendet, so muss der Service explizit angegeben werden:

Code: Alles auswählen

led.sendCommand(led.previousState(true,"rrd4j").state.toString)

Re: Farbwert in Variable speichern?

Verfasst: 6. Mär 2022 19:59
von Steinspiel
Sry das ich erst jetzt antworte, obwohl mir das hier wichtig ist, aber manchmal gibt es Umstände...
peter-pan hat geschrieben: 4. Mär 2022 00:14 Ich nehme mal an, das "led" ein Item ist.
Ja, genau genommen das "MasterControls" Item einer WLED LED die mit entsprechendem Binding in OH3 eingebunden ist.
Der Übersichtlichkeit wegen versuche ich die Namen meiner Items in den Codeschnipseln hier immer recht aussagekräftig/kurz zu halten.
udo1toni hat geschrieben: 4. Mär 2022 11:52 Es reicht eine Rule :)
Ich bin ja immer wieder Erstaunt was mit Erfahrung und etwas Nachdenke so möglich ist :!:
Wenn ich es lese macht es so natürlich Sinn, nur hätte ich selbst mindestens zwei Rules von epischer Länge draus machen müssen ! ;)

Dein erstes Beispiel funktioniert, allerdings nicht ganz zuverlässig:

Ist die LED aus, schaltet die Rule bei OPEN immer die LED an und bei CLOSED auch aus. Nehme an das da der Default Wert der Variablen greift.

Ist die LED an (egal welche Farbe) kommt es zum einen vor das sie bei OPEN nicht auf weiß umschaltet bzw. wenn sie umgeschaltet hat bei CLOSED nicht mehr in zurück in den Variablenwert schaltet.

Erst hatte ich das HSB Farbmodell in Verdacht: aktualisiere ich per ".postUpdate" ein Number Item mit dem Variablenwert (mir fiel kein anderer Weg ein diesen sichtbar zu machen), so wird mir in OH3 ein leicht anderer Wert angezeigt als beim Mouseover in VSCode...
Aber da gab es auch keine Regelmäßigkeiten :-(
farb_wert.JPG
Dann hatte ich einen Timer von einer Sekunde eingebaut: Farbwert in Variable schreiben, 1 sec Warten, LED auf weiß schalten... Hat auch nichts gebracht, mal funktionierte es, mal nicht.

Dann viel mir auf das, wenn die LED z.B. blau ist, ich die Tür öffne diese dann für einen Sekundenbruchteil weiß leuchtet und dann wieder auf blau wechselt so als würde der Türkontakt blitzschnell von OPEN zu CLOSED hin und her wechseln, tut er aber nicht!

Hast Du ne Idee an was es liegen könnte?

Ich hänge hier mal meine Rule ran die ich nach Deiner Vorlage erstellt habe...

Danker erst mal für die Hilfe,

Code: Alles auswählen

var String farb_Wert = "0,0,0" 


rule "licht_EIN"

when
    Item tkschreibtisch01_OffenGeschlossen changed                                 
        
then
    if(newState == OPEN) {
        farb_Wert = WLED_MasterControls.state.toString
        WLED_MasterControls.sendCommand("0,0,99")

    } 
    
    else {
        WLED_MasterControls.sendCommand(farb_Wert)
        anzeige_wert.postUpdate(farb_Wert)
    }
                              
end

Re: Farbwert in Variable speichern?

Verfasst: 6. Mär 2022 21:20
von Steinspiel
Moin,

Ich habe das noch etwas weiter verfolgt, selbst wenn das schalten der WLED LED durch den Türkontakt in der *.rules funktioniert, "springt" der Farbwert ein paar mal hin und her und den richtigen Farbwert nimmt er auch nur einmal an, leuchtet also nur scheinbar weiß... :(

Code: Alles auswählen

2022-03-06 21:04:01.581 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'tkschreibtisch01_OffenGeschlossen' changed from CLOSED to OPEN
2022-03-06 21:04:01.587 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'WLED_MasterControls' received command 0,0,99
2022-03-06 21:04:01.589 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'WLED_MasterControls' predicted to become 0,0,99
2022-03-06 21:04:01.594 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 240,100,91 to 0,0,99
2022-03-06 21:04:01.634 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 0,0,99 to 240,100,91
2022-03-06 21:04:01.670 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 240,100,91 to 0,0,98
Wenn es nicht klappt, ändert das 'WLED_MasterControls' Item von sich aus die Farbe immer um Nuancen und das geht endlos....

Code: Alles auswählen

2022-03-06 21:08:42.715 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'tkschreibtisch01_OffenGeschlossen' changed from CLOSED to OPEN
2022-03-06 21:08:42.722 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'WLED_MasterControls' received command 0,0,99
2022-03-06 21:08:42.723 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'WLED_MasterControls' predicted to become 0,0,99
2022-03-06 21:08:42.727 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 120,100,73 to 0,0,99
2022-03-06 21:08:42.766 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 0,0,99 to 120,100,73
2022-03-06 21:08:42.816 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 120,100,73 to 0,0,98
2022-03-06 21:08:42.935 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 0,0,98 to 120,100,72
2022-03-06 21:08:53.307 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 120,100,72 to 120,100,71
2022-03-06 21:09:03.326 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 120,100,71 to 120,100,70
2022-03-06 21:09:13.418 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 120,100,70 to 120,100,69
2022-03-06 21:09:23.437 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'WLED_MasterControls' changed from 120,100,69 to 120,100,68
...
Also das Problem scheint irgendwo anders zu liegen...

Re: Farbwert in Variable speichern?

Verfasst: 7. Mär 2022 13:15
von udo1toni
Das ist natürlich etwas ungünstig... Vermutlich wird die Lampe ihren Status zurückmelden. Oder gibt es noch weitere Rules, welches die Lampe ansteuern?

Re: Farbwert in Variable speichern?

Verfasst: 7. Mär 2022 14:46
von Steinspiel
Moin,
udo1toni hat geschrieben: 7. Mär 2022 13:15 Oder gibt es noch weitere Rules, welches die Lampe ansteuern?
Du schaust schon Mittags in Deine Kristallkugel?! :D

Bin gerade fertig: ein längst vergessenes Switch ITEM war noch mit dem 'WLED_MasterControls' verlinkt und wollte bestimmt nur gelöscht werden... ;)

Jedenfalls: ich habe Deine Rule inzwischen erweitert und zwei weitere Türkontakte + eine WLAN Steckdose hinzugefügt und wenn ich jetzt eine der Türen unter meinen Schreibtisch öffne (um an die verbaute Hardware zu kommen) habe ich den Best ausgeleuchteten "Unterschreibtisch" den ich je gesehen habe! :idea: :idea: :idea:

Danke mal wieder für Deine Hilfe

Re: Farbwert in Variable speichern?

Verfasst: 7. Mär 2022 18:50
von udo1toni
Das wäre hier ungünstig - es würde nur unterstreichen, dass mal wieder gesaugt werden muss...

Re: Farbwert in Variable speichern?

Verfasst: 7. Mär 2022 19:30
von Steinspiel
Moin,
udo1toni hat geschrieben: 7. Mär 2022 18:50 dass mal wieder gesaugt werden muss...
Doch Kristallkugel! ;)

Du wirst Dich nicht erinnern, aber vor langer Zeit hast Du mir mal sehr geholfen meinen XIAOMI Sauger in OH2x ein zu binden...
Und wegen o.g. Grund habe ich in diesem Moment (!) begonnen, besagte *.rules an OH3x an zu passen...

In diesem Zusammenhang, ne Steigerung von Schreibtischunterbeleuchtung ist Sockelbeleuchtung in der Küche... :x :D

Re: Farbwert in Variable speichern?

Verfasst: 7. Mär 2022 19:47
von udo1toni
Noch mehr Dreck... weil dort Saugen nicht reicht, aber der Dampfwischer auch nicht täglich genutzt werden soll... nee, nee, mir reicht mein Sternenhimmel...
Sterne ohne.JPG