Seite 1 von 1

Szenen mit rules.. OH4

Verfasst: 26. Jul 2023 22:58
von ollyins
Hi,

ich verzweifele gerade am ersellen meiner ersten Szene via rules-file - ja ich liebe die alte textfilenummer...

item zum schalte der Szene

Code: Alles auswählen

Switch SzenePoolnacht 		"Poolnacht"  							<light> 	(gSzenen)	[ "Lighting" ]	{ autoupdate="true" } 
in der standard-sitemap:

Code: Alles auswählen

witch item=SzenePoolnacht label="Poolnacht [%s]" icon="light" mappings=[0="OFF",1="ON"]	
Dazu schon verschiedene rule-Lösungen probiert, aktuell:

Code: Alles auswählen

rule "Poolnacht"
when
    Item SzenePoolnacht received update
then
  switch ((SzenePoolnacht.state as Number).intValue) {
		case 0 : {PoolPumpe.sendCommand(0)
				  P3PoolSpots.sendCommand(0)
				  RGBP3Pools.sendCommand(0)}
		case 1 : {PoolPumpe.sendCommand(1)
				  P3PoolSpots.sendCommand(1)
				  RGBP3Pools.sendCommand(1)}
	}
end
Zur Poolpumpe gibt es noch diese rule, die so weit korrekt läuft :

Code: Alles auswählen

rule "Poolpumpe Ein/Aus/Off-Auto"
when
    Item PoolPumpe changed
then
	logInfo("Neopool-RULE", "--> PoolPumpe wechselt Status ist " + PoolPumpe)
    switch ((PoolPumpe.state as Number).intValue) {
		case 0 : {NeoPoolFilter.sendCommand(0)
				  NeoPoolMode.sendCommand(1)}
		case 1 : {NeoPoolFilter.sendCommand(1)
				  NeoPoolMode.sendCommand(0)}
    }
end
und die Poolspots sind normale switch items, die knx channel bedienen und so normal in der sitemap schaltbar sind einzelnd.

Code: Alles auswählen

Switch P3PoolSpots "Pool Spots" 					<light> 	(gP3KNX) [ "Lighting" ]	{ channel="knx:device:bridge:DA1-1_1_21:DA1P3PoolSp", autoupdate="true"}
Aber alles zusammen tut es nicht, bzw ,die rule wird nicht getriggert.. hatte es auch schon mit :

Code: Alles auswählen

rule "Poolnacht"
when
    Item SzenePoolnacht received command
...
probiert und "... changed" auch
In der finalen Version soll das ganze noch per Alexa-Sprachbefehl "Poolnacht an" bzw. " .. aus" funktionieren...
wie immer irgendetwas übersehen...

Re: Szenen mit rules.. OH4

Verfasst: 27. Jul 2023 14:53
von udo1toni
Wo soll ich anfangen? Da sind so viele für mich offensichtliche Verständnisfehler...

Erstmal Items: Ein Switch Item kennt exakt zwei Befehle, ON und OFF. Es kennt ein paar mehr Status, nämlich neben ON und OFF noch NULL und UNDEF. Nicht zu den möglichen Status gehören Zahlen, genauso wenig kann man Zahlen als Befehle (erfolgreich) an das Item senden.
Ein Number Item kennt Zahlen als Befehle, sonst nichts. Bei den möglichen Status kommen noch die Werte NULL und UNDEF hinzu.
Wie sind die zu schaltenden Items definiert? Du sendest Befehle 0 und 1, das sind keine sinnvollen Befehle für sinnvolle Items zum Schalten von Lampen. Aus den Namen (Spots und RGB) ergeben sich für mich drei Möglichkeiten, Switch, Dimmer oder Color als Item. Nicht sinnvoll wäre Number.
Dies gilt sinngemäß auch für die anderen Items in der zweiten Rule, auch hier fürchte ich Fehler schon in der Itemdefinition.

Nun Widgets in der Sitemap:
Tatsächlich ist Switch hier das Mittel der Wahl für den Aufruf einer Szene. Aber hier lauert vielleicht gleich ein weiteres Missverständnis, denn Switch Widgets sind mitnichten auf Switch Items beschränkt Es ist immens wichtig, zu erkennen, dass Widgets (in der Sitemap) und Items erst mal nichts miteinander zu tun haben. Freilich kann man Items an Widgets binden, um das Item über das Widget zu steuern.

Jetzt zu der Szene: Eine Szene wird aufgerufen. Eine Szene ist aber per Definition nicht "aktiv" (auch wenn das gerne so betrachtet wird).
Das heißt, ein Item, welches eine Szene aufruft, sollte nicht den Zustand behalten, sondern wieder verlieren.
Du hast zwei Szenen, eine zum Einschalten, eine zum Ausschalten, und Du könntest noch weitere Szenen anlegen (z.B. das eine an, das andere aus), Das Item für die Szenen wäre also am ehesten ein Number Item, keinesfalls ein Switch Item.

Eine sinnvolle Definition des Items wäre

Code: Alles auswählen

Number PoolSzene "Pool Szene" <light> (gSzenen) ["Lighting"] {autoupdate="false"}
Das passende Widget sieht dann so aus:

Code: Alles auswählen

Switch item=PoolSzene mappings=[0="AUS",1="Nacht"]
Du erhältst also zwei Knöpfe, auf dem einen steht "AUS", auf dem anderen "Nacht", und die "Überschrift" lautet "Pool Szene". Solltest Du das Item per Sprachbefehl ansteuern, so müsstest Du allerdings ziemlich sicher "Null" und "Eins" sagen, wobei das Tag "Lighting" hier vielleicht auch "An" und "Aus" ermöglichen wird, aber es gibt keine eindeutige Zuordnung. Ich habe keine Erfahrung mit Alexa, da müsste jemand anderes aushelfen. Im Zweifel könnte man aber auch ein String Item verwenden und dort die Schlüsselworte nutzen, ist aber fraglich, wie man dann taggen muss...

Nun zu den Rules:
Die erste Rule kann niemals triggern, weil das Item niemals einne korrekten Wert bekommt (siehe oben) Wenn es um eine Eingabe über die UI geht, ist aber der korrekte Trigger received command

Ich sehe unheimlich oft Rules, die auf received update triggern sollen. In etwa 1% der Fälle ist dieser Trigger die richtige Wahl. Auch hier trifft das nicht zu.
received update wird jedes Mal ausgelöst, wenn der Status des Items aktualisiert wurde.
changed wird jedes Mal getriggert, wenn sich der Status des Items geändert hat.
received command wird jedes Mal getriggert, wenn das Item einen Befehl empfangen hat.

Gegeben, dass die Items so definiert sind:

Code: Alles auswählen

Number PoolSzene   "Pool Szene"     <light> (gSzenen) ["Lighting"] {autoupdate="false"}
Number PoolPumpe   "Pumpenmodus"
Switch P3PoolSpots "Pool Spots"     <light>           ["Lighting"] {channel="..."}
Switch RGBP3Pools  "Pool RGB Spots" <light>           ["Lighting"] {channel="..."}
wäre also diese Rule passend:

Code: Alles auswählen

rule "Pool Szenen"
when
    Item PoolSzene received command
then
    logDebug("poolscene","empfangener Befehl ({})",receivedCommand)
    switch(receivedCommand.toString) { // abhängig vom empfangenen Befehl
        case "0" : {
            logDebug("poolscene","Szene 0 erkannt")
            PoolPumpe.postUpdate(0)
            P3PoolSpots.sendCommand(OFF)
            RGBP3Pools.sendCommand(OFF)
        }
        case "1" : {
            logDebug("poolscene","Szene 1 erkannt")
            PoolPumpe.postUpdate(1)
            P3PoolSpots.sendCommand(ON)
            RGBP3Pools.sendCommand(ON)
        }
        default : {
            logWarn("poolscene","Ungültiger Befehl ({})",receivedCommand)
        }
    }
end
Die log-Befehle...
Alle Logbefehle erwarten zwei Strings als Parameter. Dabei ist der erste Parameter der zu verwendende Logger, der zweite Parameter ist die zu loggende Meldung. Das heißt, der erste String ist keinesfalls "Neopool-RULE". Die Loggernamen könne zwar frei gesetzt werden, es gibt aber ein paar ungeschriebene Regeln:
  • Kleinbuchstaben des englischen Alphabets. Im Ausnahmefall CamelCaseSchreibweise, falls unbedingt nötig noch Ziffern
  • Ein Punkt trennt die Hierarchieebene
  • keine Sonderzeichen (Leerzeichen, Trennstriche, Unterstriche...)
  • kurz
Hinzu kommen Gesetzmäßigkeiten:
Alle Logger werden mittels log4j2 verwaltet. Die Logger aus den Rules erscheinen dabei unterhalb des Knotens org.openhab.core.model.script. im Hierarchiebaum von log4j2. Die Loggerkonfiguration wird dabei grundsätzlich vom übergeordneten Logger geerbt, das heißt, grundsätzlich wird auf der Stufe INFO geloggt, weil diese Stufe für org.openhab.core.model.script konfiguriert ist. Der Logger aus "meiner" Rule taucht dann als
org.openhab.core.model.script.poolscene im Baum auf und ich kann mittels

Code: Alles auswählen

log:set OFF org.openhab.core.model.script.poolscene
in der Karaf Konsole verhindern, dass überhaupt Meldungen der Rule im Log auftauchen.
Umgekehrt kann ich mit

Code: Alles auswählen

log:set DEBUG org.openhab.core.model.script.poolscene
dafür sorgen, dass die Rule sehr auskunftsfreudig wird. und quasi jeden einzelnen Schritt dokumentiert.
Mit

Code: Alles auswählen

log:set DEFAULT org.openhab.core.model.script.poolscene
wird nur im Fehlerfall die Meldung des ungültigen Befehls ausgegeben.

Zeige bitte mal die genaue Definition aller Pool-Items (insbeondere auch, mit welchen Channels sie verknüpft sind), evtl. gibt es da noch weitere grundsätzliche Fehler...

Re: Szenen mit rules.. OH4

Verfasst: 27. Jul 2023 19:34
von ollyins
Hallo Udo,

danke! So hats geklappt und die Erklärungen waren echt hilfreich! Mein item "Poolpumpe" war ja auch schon "Number" - somit habe ich glaube ich verstanden ,welcher Wert übertragen und somit abgfragt werden kann, im Gegensatz zu einem Switch... die rule wurde ja so auch dan nicht getriggert vorher... Ich werde mir das als gutes Beispiel als Vorlage notieren... danke und saludos,
oliver

Re: Szenen mit rules.. OH4

Verfasst: 13. Aug 2023 22:44
von ollyins
Hi Udo, ich habe doch noch ein Problem, nämlich diese Szene nun per Alexa aktiviert/deaktiviert zu bekommen. Es müsste wohl ein Switch sein ["Switchable"] dass es alexa mi an / aus ansteuert. Poolszene taucht so bei mir nicht als Gerät in Alexa auf... meine KNX Switche und Lampe schon... Muss ich evt. noch ein item erstellen?

Re: Szenen mit rules.. OH4

Verfasst: 14. Aug 2023 11:19
von udo1toni
Von Sprachsteuerung habe ich keine Ahnung und weigere mich auch, mir solche Spione ins Haus zu holen.

Aber löse Dich bitte unbedingt von der Vorstellung, eine Szene sei "aktiv". Eine Szene kann niemals deaktiviert werden, eine Szene wird aufgerufen. Anschließend gibt es (durch den Aufruf des Szene einene definierten Zustand meist mehrerer Items bzw. der damit verknüpften Channel.
Du rufst anschließend eine andere Szene auf, um diesen Zustand zu ändern.

Nach Definition von Alexa kann man Szenen ein- und ausschalten, was schon beweist, dass die Programmierer von Amazon eine andere Vorstellung von Szenen haben. Dann geht es nur per Schalter, denn es wird ja ein- und ausgeschaltet. Am ehesten könnte man hier von einer Gruppenschaltung sprechen, eine Szene ist etwas anderes. In Beleuchterkreisen wäre es vermutlich eine (Licht-)Stimmung (solche werden durchaus addierend verwendet).
Allerdings stößt man da sehr schnell an Grenzen. Z.B. Szene 1 enthält Lichter A und B, B ist aus, A ist an. Szene 2 enthält ebenfalls Lichter A und B, B ist an, A ist aus. Nun aktiviere ich beide Szenen.
Soll nun ein eingeschaltetes Licht Priorität haben, oder eine ausgeschaltetes Licht? Soll die zuletzt aktivierte Szene Priorität haben? Was passiert beim Deaktivieren der Lichtszene, die zuerst aktiv war? Man kann das beliebig weiterführen...

Re: Szenen mit rules.. OH4

Verfasst: 14. Aug 2023 11:48
von ollyins
Ok, danke! Muss ich mal weiter suchen... wie gesagt, mit den knx items die dann mit Attribut [ "Lighting" ] erstellt werden, klappt das out of the box!
Das sind dann switche und keine Number.. aber laut Alexa-Binding soll es auch mit Number laufen, aber

Code: Alles auswählen

Number 		PoolSzene 				"Pool Szene" 							<light> 	(gSzenen)	{alexa="Mode" [capabilityNames="Poolszene", supportedModes="0=AUS,1=NACHT"], autoupdate="true"}
tut es scheinbar nicht, d.h. er findet kein Gerät mit Namen "Poolszene"...
Ich finde Voice-Steuerug super genial und einfach... was haben wir schon zu verbergen, was die Welt nicht wissen soll... freut sich halt ein Chinese oder ami an meinem daily talk.... :-)

Aber das sieht natürlich jeder anders....