Seite 1 von 1

String setzen in einer rule

Verfasst: 28. Feb 2020 22:27
von Boxana

Code: Alles auswählen

rule "Stork Air Lüfter stufe"

when
    Item StorkAir_1 changed or Item StorkAir_2 changed or Item StorkAir_3 changed or Item StorkAir_Lueften changed
then
    if ((StorkAir_1.state == ON ) && (StorkAir_2.state == OFF ) && (StorkAir_3.state == OFF ) && (StorkAir_Lueften.state == OFF ))    {
        Stork_Air_Statussmeldung.state =="Lüfter Stufe 1"
    }
else if ((StorkAir_1.state == ON ) && (StorkAir_2.state == ON ) && (StorkAir_3.state == OFF ) && (StorkAir_Lueften.state == OFF ))    {
        Stork_Air_Statussmeldung.state =="Lüfter Stufe 2"
    }
else if ((StorkAir_1.state == ON ) && (StorkAir_2.state ==ON ) && (StorkAir_3.state == ON ) && (StorkAir_Lueften.state == OFF ))    {
        Stork_Air_Statussmeldung.state =="Lüfter Stufe 3"
    }
else if (StorkAir_Lueften.state == ON )    {
        Stork_Air_Statussmeldung.state =="Lüften"
    }

end

xxx.items:

Code: Alles auswählen

String      Stork_Air_Statussmeldung

Re: String setzen in einer rule

Verfasst: 29. Feb 2020 03:31
von violine21
Versuch es mal damit:

Code: Alles auswählen

Stork_Air_Statussmeldung.sendCommand("Lüfter Stufe 1")

Code: Alles auswählen

Stork_Air_Statussmeldung.sendCommand("Lüfter Stufe 2")

Code: Alles auswählen

Stork_Air_Statussmeldung.sendCommand("Lüfter Stufe 3")

Code: Alles auswählen

Stork_Air_Statussmeldung.sendCommand("Lüften")
PS: Udo hatte in einem Thread mal ausführlich über die Verwendung des Item-Status (.state)
und die Zuweisung von Werten an Items (sendCommand/postUpdate) geschrieben.
Leider finde ich das gerade nicht.

Re: String setzen in einer rule

Verfasst: 29. Feb 2020 14:49
von udo1toni
An dieser Stelle wäre zuerst mal die Frage, ob der String anschließend an irgendein Binding geschickt werden soll (dann wäre sendCommand() korrekt) oder ob er auf der UI angezeigt werden soll - dann ist postUpdate() das Mittel der Wahl.

Kurze Erklärung: postUpdate() ändert den Status des Items, sendCommand() sendet ein Kommando. Der Status wird in diesem Fall nur deshalb geändert, weil openHAB per default jedem sendCommand() automatisch ein postUpdate() folgen lässt, was man mit dem Parameter autoupdate="false" unterbinden kann (das kommt in die Itemdefinition und geht nur über ein *.items File)

Vermutlich wäre in diesem Fall also ein Stork_Air_Statussmeldung.postUpdate("Lüften") die gewünschte Funktion.

Wie sieht denn die Hardware dahinter aus? Für mich sieht es so aus, als wäre sie Anbindung eher suboptimal gelöst :)

Re: String setzen in einer rule

Verfasst: 7. Mär 2020 11:29
von Boxana
Hallo Udo,
ich schulde dir noch eine Antwort 😂.
Ja es ist suboptimal gelöst und es sollte immer mal geändert werden.
Es ist ein einfacher Aktor den ich mit Verzögerungen schalte.
Irgend wann werde ich mich mal an die serielle schnittstelle ran machen.

Re: String setzen in einer rule

Verfasst: 8. Mär 2020 13:02
von int5749
Hallo Boxana,

Um noch einmal auf die Funktion an sich zu kommen, was verbirgt sich denn hinter dem Item „StorkAir_Lueften“ da dies sich ja auch ändern kann. Aus der Regel liest sich dies fast wie Stufe 0 und dem Hinweis, es müsste gelüftet werden?

Das „Problem“ bei einem Schaltaktor für einen solchen Zweck sind sicher die fehlenden „gegenseitig gesperrten“ Kanäle. Hatte ich aber auch eine Weile und habe da auch mit der 2 Sekunden und einer Prüfung ob der andere Kanal aus ist gearbeitet. Mittlerweile habe ich einen Lüftungsaktor und da kann man direkt die Kanäle schalten, das sperren übernimmt der Aktor.

Wie hast Du die Verzögerung gelöst? Im Aktor?

Viele Grüsse,

Jörg

Re: String setzen in einer rule

Verfasst: 8. Mär 2020 20:45
von Boxana
Also es ist eine Kontrollierte Wohnraumbelüftung die einen externen Zugang für 3 stufen hat.

Je Stufe benutze ich ein Kanal.
Es ist egal ob eins und 2 an oder aus sind, wenn 3 an ist dann ist es die höchste stufe.
Also wenn ich eins an habe, 2 aus und 3 wieder an dann ist es drei
wenn ich jetzt 3 abschalte ist es 1 da zwei aus ist.

Da es so einfach geschaltet ist habe ich einen einfachen Aktor genommen da nichts passieren kann bezüglich einer vergessenen sperrfunktion.
Natürlich habe ich die Logig so gewählt das es immer der kürzeste weg ist.

Jetzt mit OH ist es natürlich noch besser umzusetzen wie mit dem Merten 701.2

Re: String setzen in einer rule

Verfasst: 8. Mär 2020 21:30
von int5749
Hallo Christian,
Boxana hat geschrieben: 8. Mär 2020 20:45 Also es ist eine Kontrollierte Wohnraumbelüftung die einen externen Zugang für 3 stufen hat.
Ja, so etwas ist es bei uns auch. Vorgesehen war, dass dies 7x 24 laufen sollte und daher wurde nur ein Kippschalter mitgeliefert mit 2 Stufen.
1 oder 2
Dies hatte mir gar nicht gefallen, und ausserdem lüften wir parallel auch gerne oder haben im Sommer die Terrassentüren auf.
Daher hatte ich zunächst einen Gira 3 Stufenschalter eingesetzt, bevor ich dann EIB ausgeweitet hatte ;)

Ich arbeite für die Sitemap mit einem Dummy Item, damit ich dort die Stufen schalten kann.

Falls Du Interesse hast, hier einmal die Konfig

Items

Code: Alles auswählen

/* Specials */
	/* Ventilation */
Number Ventilator	"Lüftung Stufe [%d]"	<fan>
Switch VentAktor1	"Lüftung Stufe 1"	(Ventilation)	{channel="knx:device:bridge:AktorLF:ch1"} //für Stufe 1 und OFF
Switch VentAktor2	"Lüftung Stufe 2"	(Ventilation)	{channel="knx:device:bridge:AktorLF:ch2"} //für Stufe 2 und OFF
Rule

Code: Alles auswählen

rule "update Ventilator"
when
	Member of Ventilation changed
then
    if (VentAktor1.state==ON) {
        Ventilator.postUpdate(1)
    } else if (VentAktor2.state==ON) {
        Ventilator.postUpdate(2)
    } else {
        Ventilator.postUpdate(0)
	}
end

rule "Set Ventilator"
when
    Item Ventilator changed
then
    if ((Ventilator.state as DecimalType).intValue == 0) {
		Ventilation.members.filter(f|(f.state == (ON))).forEach[ v|
			v.sendCommand(OFF)
			logInfo("Ventilation", "{} has been switched off", v.label)
		]
	} else if ((Ventilator.state as DecimalType).intValue == 1) {
		VentAktor1.sendCommand(ON)
		logInfo("Ventilation", "{} has been switched on", VentAktor1.label)
	} else if ((Ventilator.state as DecimalType).intValue == 2) {
		VentAktor2.sendCommand(ON)
		logInfo("Ventilation", "{} has been switched on", VentAktor2.label)
	}
end
Sitemap

Code: Alles auswählen

Switch item=Ventilator mappings=[0="OFF",1="1",2="2"]
Viele Grüße,

Jörg