UND-Verknüpfung anstelle OR-Verknüpfung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Answers: 0
Wohnort: bei Mannheim

UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von Joe »

Hi zusammen,

kann mir bitte jemand sagen, wie ich eine UND-Verknüpfung in der Nachfolgenden Regel hin bekomme?
"&&" kann ich nur in der "IF" Bedingung hinbekommen die ich nur unter "THEN" kenne. Ich benötige die "IF" jedoch unter "WHEN".

Code: Alles auswählen

rule	"Beleuchtungssteuerung AN"
when	
	Item Testschalter1 changed from OFF to ON or
	Item Testschalter2 changed from OFF to ON or
	Item Testschalter3 changed from OFF to ON 
then	
    Testschalter4.sendCommand(ON)
end
Testschalter4 darf nur auf ON gehen, wenn alle anderen 3 Schalter auf ON stehen.
Mit dem "OR" funzt es ja auch, wenn nur einer der 3 auf ON steht.

limdul79
Beiträge: 28
Registriert: 30. Okt 2018 12:41
Answers: 0

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von limdul79 »

Bei Auslösebedinungen in eine Rule kannst du nur OR verwenden - da das alles ja diskrete Ereignisse sind.

Das und musst du dann in die Regel verpacken:

Code: Alles auswählen

rule	"Beleuchtungssteuerung AN"
when	
	Item Testschalter1 changed from OFF to ON or
	Item Testschalter2 changed from OFF to ON or
	Item Testschalter3 changed from OFF to ON 
then	
    if (Testschalter1.state == ON && Testschalter2.state == ON && Testschalter3.state == ON) { 
        Testschalter4.sendCommand(ON)
    }
end

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Answers: 0
Wohnort: bei Mannheim

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von Joe »

lol das schaut logisch aus da hätte ich auch drauf kommen können 🤪 danke

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Answers: 0
Wohnort: bei Mannheim

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von Joe »

Hi limdul79,
hat super funktioniert, sag mal ist es auch möglich nicht nur ITEMs sondern auch Channel und Cron Funktionen in die "IF" Bedingung mit einzubinden?
Somit könnte ich mich eine komplette Rule sparen?

Code: Alles auswählen

rule "Sonoff Dose 01 an" 
  when 
    Time cron "0 30 07 ? * SAT-SUN *" or
    Channel 'astro:sun:local:nauticDawn#event' triggered START or
    Channel 'astro:sun:local:set#event' triggered START 
  then
    SonoffDose01.sendCommand(ON)
    sendMail(xxxxxx)
end

killercorny
Beiträge: 17
Registriert: 6. Jan 2018 01:19
Answers: 0

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von killercorny »

Wie wäre es denn die Schalter in einer Switch Gruppe mit AND Verknüpfung zu gruppieren?
Dann braucht man nur auf die Gruppe zu prüfen in der Regel.

Gesendet vom Redmi Note 5


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

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von udo1toni »

Die Frage ist immer, was Du erreichen möchtest. Wenn es um astro-Events in Verbindung mit Zeit geht, ist es meist so, dass man z.B. ein Licht bei Sonnenuntergnag einschalten möchte, allerdings frühestens zum Zeitpunkt a und spätestens zum Zeitpunkt b, vielleicht noch versetzt um c Minuten. Alle drei Werte kann man im Astro Bindung hinterlegen, so dass man das mit einem Trigger abfeiern kann.
Ansonsten kann man natürlich auch Zeiten abfragen, z.B.

Code: Alles auswählen

if(now.isBefore(<Zeitpunkt in Millisekunden>))
oder

Code: Alles auswählen

if(now.getMinuteOfDay > <startstunde>*60+Startminute)
Für Sonnenaufgang/-untergang muss man natürlich die Zeitpunkte nutzen, nicht die Events, was das Ganze schnell unübersichtlich macht. Im englischen Forum gibt es einen Thread dazu, der ein Item verwendet, um Zeiträume anzuzeigen, also z.B. Morgens, Mittags, Abends, Bettzeit,Nacht. Eine Rule steuert dann den Status dieses Items, während man in den anderen Rules nur noch den Status des Items abfragen muss, um entsprechend zu reagieren. Ein Link zu diesem Thema sollte sich in diesem Forum finden lassen, ich bin jetzt aber zu faul zum suchen...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
sihui
Beiträge: 1827
Registriert: 11. Apr 2018 19:03
Answers: 21

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von sihui »

udo1toni hat geschrieben: 29. Dez 2018 19:54 Ein Link zu diesem Thema sollte sich in diesem Forum finden lassen
https://community.openhab.org/t/design- ... -day/15407
openHAB3 mit Zwave, Alexa, ESPEasy, MQTT, Logitech Harmony, Philips HUE und ZigBee Hardware auf Proxmox VE.

Benutzeravatar
Joe
Beiträge: 200
Registriert: 10. Okt 2018 12:22
Answers: 0
Wohnort: bei Mannheim

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von Joe »

habe mir das nochmals genauer überlegt und getestet.
Es macht nur Sinn, wenn die Regel innerhalb eines Zeitfensters reagieren darf.
Das ganze müsste wie folgt funktionieren:
Schritt 1) prüfe ob es zwischen 16:30 und 17:30 ist, wenn ja gehe zu Schritt 2 ansonsten mache nichts

Code: Alles auswählen

if (now.getHourOfDay() >= 16:30 && now.getHourOfDay() <= 17:30)
	[| 
		Testschalter1.sendCommand(ON) 
	] 
Mit Cron würde es gehen allerdings kommt das im Log mega dumm, wenn jede Sekunde zwischen 16 und 17 Uhr ein Eintrag steht.

Code: Alles auswählen

 Time Cron "* * 16-17 ? * * *"
Schritt 2) wenn alle 3 Testschalter (1-3) auf ON sind schalte Testschalter4 auf ON (diese Funktion ist bereits vorhanden)

Code: Alles auswählen

rule	"Beleuchtungssteuerung AN"
when	
	Item Testschalter1 changed from OFF to ON or
	Item Testschalter2 changed from OFF to ON or
	Item Testschalter3 changed from OFF to ON 
then	
    if (Testschalter1.state == ON && Testschalter2.state == ON && Testschalter3.state == ON) { 
        Testschalter4.sendCommand(ON)
    }
end
Leider bekomme ich es nicht hin, den ersten Teil sinnvoll in die Regel einzubauen.

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

Re: UND-Verknüpfung anstelle OR-Verknüpfung

Beitrag von udo1toni »

Du denkst vom falschen Ende :)

Der Trigger ist keine Bedingung, die erfüllt sein muss, der Trigger startet die Rule.

Code: Alles auswählen

 Time Cron "* * 16-17 ? * * *"
wird die Rule täglich von 16 bis 17 Uhr zu jeder Sekunde starten. Du möchtest, dass der Code nur zwischen 16:30 und 17:30 ausgeführt wird. Die Rule wird von was auch immer getriggert (einer der Schalter hat seinen Zustand geändert):

Code: Alles auswählen

rule "Bedingungen"
when
    Item Testschalter1 changed to ON or
    Item Testschalter2 changed to ON or
    Item Testschalter3 changed to ON or
then
    if(now.minusMinutes(30).getHourOfDay == 16) { //jetzt minus 30 Minuten -> aus 16:30 wird 16:00, aus 17:30 wird 17:00
        if(Testschalter1.state == ON && Testschalter2.state == ON && Testschalter3.state == ON) {
            // Code wird ausgeführt
        }
    }
end

Du kannst wahlweise auch sehr kompliziert testen:

Code: Alles auswählen

if((now.getHourOfDay == 16 && now.getMinuteOfHour > 29) || (now.getHourOfDay == 17 && now.getMinuteOfHour < 31))
oder, wieder etwas einfacher:

Code: Alles auswählen

if(now.getMinuteOfDay > 16*60+29 && now.getMinuteOfDay < 17*60 + 31)
Es kommt immer darauf an, wie die Grenzwerte beschaffen sind, welche Variante man verwenden sollte.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten