OH3, Rules Syntax / Einrücken?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

OH3, Rules Syntax / Einrücken?

Beitrag von Steinspiel »

Moin,

Ich hatte schon lange vor zu fragen wie sich das mit dem "Einrücken" in den Rules verhält bzw. wie man es richtig macht.
Bekomme ich Code von irgend wo her belasse ich ihn meist so wie er ist. Bastle ich mir selbst was zusammen mach ich es so das es für mich lesbarer ist...
Vielleicht kann mir das mal jemand anhand meiner Rules erklären. Sie funktioniert so wie sie ist, bis auf die Telegram Benachrichtigung. Deshalb mein Verdacht das es evtl. am Einrücken der Zeilen liegen könnte...

Kurz erklärt: ich verlasse morgens das Haus, der Gigaset G-Tag loggt sich aus, MQTT schaltet das entsprechende ITEM OFF. Die Rules prüft ob die Schalter "URLAUB" oder "MORGENS AUS" ON sind. Wenn nicht, werden zwei Lampen erst in einen weißen Farbton und dann AUS geschaltet. Telegram meldet dann das alles aus ist.

Code: Alles auswählen

val telegramAction = getActions("telegram","telegram:telegramBot:xxxxxx")                   // Telegram Bot definieren   
var Timer morgen_weiss = null

rule "Morgenlicht_Flur_Kueche_AUS"

when 
        Item KuecheMQTTGeneric_BLEGruenStatus changed to OFF                                                    // G-Tag gruen AUSgeloggt
                                                                                
then

        if(UHR_morgens.state == ON) {                                                                           // und es ist werktags zwischen 04:25 und 05:50 Uhr


                if(Urlaub.state == ON) {                                                                        // Urlaub eingeschaltet?  Wenn JA -> Abbruch              
                return;
        }

                if(Morgen_AUS.state == ON) {                                                                    // Morgen AUS eingeschaltet?  Wenn JA -> Abbruch              
                return;
        }

                                                                                                                        
                if(LEDSchrankgross_Eingeschaltet.state == OFF && flur_2_ein_aus.state == OFF){                                  // Abfrage : ist LED Kuechenschrank UND Flur 2 aus? Wenn ja -> Abbruch
                telegramAction.sendTelegram("OH3 - G-Tag gruen -> LED Kueche und Flur 2 waren bereits AUS-geschaltet")          // Nachricht an  ChatBot                
                return;
                }                                                                                                



                LEDSchrankgross_Color.sendCommand("0,0,100")                                                    // LED auf weiss schalten
                Flur2_Farbe.sendCommand("0,0,100")                                                              // Flur_2 weiss schalten
        
                morgen_weiss?.cancel                                                                            // evtl. laufenden Timer abbrechen
                morgen_weiss = createTimer(now.plusSeconds(5), [|                                               // morgen_weiss Timer auf 5 sec setzen
                
                LEDSchrankgross_Eingeschaltet.sendCommand(OFF)                                                  // LED AUS
                flur_2_ein_aus.sendCommand(OFF)                                                                 // Flur_2 AUS
                
                morgen_weiss = null
                    
                ])      

                telegramAction.sendTelegram("OH3 - G-Tag gruen -> LED Kueche / Flur 2 AUS-geschaltet")          // Nachricht an ChatBot                

    }
end
Danke fürs lesen, ein schönes Wochenende...
bis dann, Steinspiel

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: OH3, Rules Syntax / Einrücken?

Beitrag von int5749 »

Hallo und guten Abend,

also am einrücken liegt der Fehler nicht, ist ja keine YAML Datei, openHAB ist dies eigentlich egal.
Es ist etwas der eigene Geschmack, ich persönlich nutze TABs und rücke "Unter-Routinen" um 1 TAB ein um es für mich lesbarer zu halten.
Ob Du nun TABs oder 2 Leerzeichen nimmst, ist da Dir überlassen, ich versuche zudem alle Rules gleich zu formatieren.
Der Fehler liegt wahrscheinlich daran, das die Telegram Action ausserhalb der Rule definiert wurde, zumindest hatte ich dies einmal mit der Pushover Action und VSCode hat mit einen Fehler bei Deiner Zeile angezeigt. Zudem habe ich die Abfrage für Urlaub oder Morgen_AUS mal in eine Zeile genommen ;-) <= Udo findet bestimmt noch weiteres Optimierungspotenzial

Die Rule mal so wie ich sie formatieren würde und der o.a. Änderungen

Code: Alles auswählen

var Timer morgen_weiss = null

rule "Morgenlicht_Flur_Kueche_AUS"

when 
    Item KuecheMQTTGeneric_BLEGruenStatus changed to OFF                                        // G-Tag gruen AUSgeloggt
then
    val telegramAction = getActions("telegram","telegram:telegramBot:xxxxxx")                   // Telegram Bot definieren   
    if(UHR_morgens.state == ON) {                                                               // und es ist werktags zwischen 04:25 und 05:50 Uhr
        if(Urlaub.state == ON || Morgen_AUS.state == ON) {                                      // Urlaub eingeschaltet? oder Morgen AUS eingeschaltet? Wenn JA -> Abbruch              
            return;
        }
        if(LEDSchrankgross_Eingeschaltet.state == OFF && flur_2_ein_aus.state == OFF){          // Abfrage : ist LED Kuechenschrank UND Flur 2 aus? Wenn ja -> Abbruch
            telegramAction.sendTelegram("OH3 - G-Tag gruen -> LED Kueche und Flur 2 waren bereits AUS-geschaltet")  // Nachricht an  ChatBot                
            return;
        }                                                                                                
        LEDSchrankgross_Color.sendCommand("0,0,100")                                            // LED auf weiss schalten
        Flur2_Farbe.sendCommand("0,0,100")                                                      // Flur_2 weiss schalten
        morgen_weiss?.cancel                                                                    // evtl. laufenden Timer abbrechen
        morgen_weiss = createTimer(now.plusSeconds(5), [|                                       // morgen_weiss Timer auf 5 sec setzen
            LEDSchrankgross_Eingeschaltet.sendCommand(OFF)                                      // LED AUS
            flur_2_ein_aus.sendCommand(OFF)                                                     // Flur_2 AUS
            morgen_weiss = null
        ])      
        telegramAction.sendTelegram("OH3 - G-Tag gruen -> LED Kueche / Flur 2 AUS-geschaltet")  // Nachricht an ChatBot                
    }
end
Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: OH3, Rules Syntax / Einrücken?

Beitrag von Steinspiel »

Nabend,
int5749 hat geschrieben: 18. Mär 2022 21:09 openHAB ist dies eigentlich egal.
Wahrscheinlich ist das der Grund weshalb meine Rules mit meinen Einrückungen trotzdem funktionierten. ;)

Auf jeden Fall gut zu wissen!
Der Fehler liegt wahrscheinlich daran, das die Telegram Action ausserhalb der Rule definiert wurde, zumindest hatte ich dies einmal mit der Pushover Action und VSCode hat mit einen Fehler bei Deiner Zeile angezeigt.
Hier zeigt VSCode keinen Fehler an. Deshalb bin ich nicht drauf gestoßen. Ich lass die Action erst mal da wo Du sie hingesetzt hast...
Obwohl, in meiner Testrule, die tatsächlich eine Telegram Nachricht nach dem händischen schalten eines Switch versendet, liegt sie auch außerhalb der Rule, so wie in meinem ersten Beispiel.
Zudem habe ich die Abfrage für Urlaub oder Morgen_AUS mal in eine Zeile genommen
Danke! ;)
Auch für deine Ausführungen.

Zur Sicherheit werde ich erst mal in den anderen Rules, in welchem Telegram auch nicht funktioniert, die Action in die Rule verfrachten...
bis dann, Steinspiel

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

Re: OH3, Rules Syntax / Einrücken?

Beitrag von udo1toni »

Grundsätzlich kannst Du Rules ohne Indentations schreiben, es wird halt schnell unlesbar. Wichtig für den Hinterkopf: eine if-Anweisung (wie überhaupt alle bedingten Verweigungen oder auch Schleifen usw.) wirkt immer nur auf den unmittelbar folgenden Befehl. Will man mehr als einen Befehl verwenden, so muss man den Code zu einem Block zusammenfassen, was mit den {} passiert.

Das Tab-Zeichen ist für Indentations beliebt, schon weil nur eine Taste zu drücken ist. Die Standardbelegung für ein Tab sind vier Leerzeichen als Entsprechung. Hier im Forum wird das ab-Zeichen allerdings in 8 Leerzeichen umgewandelt, wodurch bei tiefer Schachtelung schnell ein Großteil des Codes außerhalb des Sichtbereichs landet. Deswegen habe ich mir angewöhnt Code ausschließlich mit Leerzeichen zu formatieren. Man kann auch im Editor nach Tab-Zeichen suchen, und diese durch jeweils viel Leerzeichen ersetzen lassen :)

Unnötige Leerzeichen (z.B. eine leere Zeile, die aber massig Leerzeichen enthält, oder Leerzeichen am Ende einer Zeile) sollte man auch vermeiden. Man kann sich in jedem besseren Editor bequem die unsichtbaren Zeichen anzeigen lassen, um einen solchen Fauxpas zu vermeiden.

Konkret zu Deiner Rule hätte ich natürlich :) auch noch eine Anmerkung... Du nutzt sehr schln die Abbruch-Funktion für Urlaub und Morgen_AUS, warum nicht für UHR_morgens?

Du definierst außerdem die Konstante telegramAction global zu Beginn der Datei. Auch wenn das grundsätzlich funktionieren sollte, möchte ich eher empfehlen, die Konstante lokal zu definieren.

Warum nutzt Du nicht die Color Items zum Abschalten der Lampen?

Code: Alles auswählen

var Timer morgen_weiss = null

rule "Morgenlicht Flur Küche AUS"
when
    Item KuecheMQTTGeneric_BLEGruenStatus changed to OFF                                                       // G-Tag gruen AUSgeloggt
then
    if(UHR_morgens.state != ON)                                                                                // falls nicht werktags zwischen 04:25 und 05:50 Uhr -> Abbruch
        return;
    if(Urlaub.state == ON)                                                                                     // Urlaub eingeschaltet?  Wenn JA -> Abbruch
        return;
    if(Morgen_AUS.state == ON)                                                                                 // Morgen AUS eingeschaltet?  Wenn JA -> Abbruch
        return;

    if(LEDSchrankgross_Eingeschaltet.state == OFF && flur_2_ein_aus.state == OFF){                             // Abfrage : ist LED Kuechenschrank UND Flur 2 aus? Wenn ja -> Abbruch
        val telegramAction = getActions("telegram","telegram:telegramBot:xxxxxx")                              // Telegram Bot definieren
        telegramAction.sendTelegram("OH3 - G-Tag gruen -> LED Kueche und Flur 2 waren bereits AUS-geschaltet") // Nachricht an  ChatBot
        return;
    }

    LEDSchrankgross_Color.sendCommand("0,0,100")                                                               // LED auf weiss schalten
    Flur2_Farbe.sendCommand("0,0,100")                                                                         // Flur_2 weiss schalten
    morgen_weiss?.cancel                                                                                       // evtl. laufenden Timer abbrechen
    morgen_weiss = createTimer(now.plusSeconds(5), [|                                                          // morgen_weiss Timer auf 5 sec setzen
        LEDSchrankgross_Eingeschaltet.sendCommand(OFF)                                                         // LED AUS
        flur_2_ein_aus.sendCommand(OFF)                                                                        // Flur_2 AUS
        val telegramAction = getActions("telegram","telegram:telegramBot:xxxxxx")                              // Telegram Bot definieren
        telegramAction.sendTelegram("OH3 - G-Tag gruen -> LED Kueche / Flur 2 AUS-geschaltet")                 // Nachricht an ChatBot
    ])
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: OH3, Rules Syntax / Einrücken?

Beitrag von Steinspiel »

Guten Morgen,
udo1toni hat geschrieben: 18. Mär 2022 22:29 Unnötige Leerzeichen (z.B. eine leere Zeile,
Das werde ich beherzigen, wahrscheinlich ist es für den Programmablauf auch besser (schneller?), es sieht aber auf jeden Fall auch kompakter aus!
Du nutzt sehr schln die Abbruch-Funktion für Urlaub und Morgen_AUS, warum nicht für UHR_morgens?
Mach ich ja jetzt. ;)
Auch wenn das grundsätzlich funktionieren sollte, möchte ich eher empfehlen, die Konstante lokal zu definieren.
@int5749 hatte ja schon ähnliches angemerkt... Du hast die Konstante bei mir sogar in jedem Block eingefügt. Ich werde das jetzt in meinen anderen *.rules anpassen.
Warum nutzt Du nicht die Color Items zum Abschalten der Lampen?
Du meinst

Code: Alles auswählen

    LEDSchrankgross_Color.sendCommand("0,0,0")		// LED AUS schalten
    Flur2_Farbe.sendCommand("0,0,0")			// Flur2 AUS schalten        
Aus dem Grund das man immer das gleiche ITEM zum schalten nutzt?

Danke auf jeden Fall noch einmal für das anpassen der Rule, ich beginne jetzt mit der restliche Arbeit hier... ;)
bis dann, Steinspiel

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

Re: OH3, Rules Syntax / Einrücken?

Beitrag von udo1toni »

Steinspiel hat geschrieben: 19. Mär 2022 06:47 wahrscheinlich ist es für den Programmablauf auch besser (schneller?), es sieht aber auf jeden Fall auch kompakter aus!
Schneller ist es sicher nicht (wir reden ja nicht von Millionen Leerzeichen/-zeilen, und auch dann gäbe es höchstens beim ersten Ausführen dadurch merkliche Auswirkungen), aber ja, der Code ist insgesamt kompakter, in meiner Bearbeitung kann man (so hoffe ich) auch verschiedene Blöcke erkennen, die verschiedene Phasen der Rule markieren: Zunächst werden alle Randbedingungen geprüft und evtl. abgebrochen.
Danach wird die Notwendigkeit zu handeln geprüft (das hast Du ja auch eingebaut gehabt, ist immer sinnvoll) und gegebenenfalls abgebrochen.
Ganz am Ende wird der gewünschte Code ausgeführt.
Steinspiel hat geschrieben: 19. Mär 2022 06:47 Du hast die Konstante bei mir sogar in jedem Block eingefügt.
Der Timer-Block ist unabhängiger Code. Die Rule läuft zu diesem Zeitpunkt nicht. Es ist also gut möglich, dass auch die lokale Konstante nicht mehr zur Verfügung steht (falls sie dennoch ansprechbar ist, so ist das im Grunde ein Fehler...).
Steinspiel hat geschrieben: 19. Mär 2022 06:47 Du meinst

Code: Alles auswählen

    LEDSchrankgross_Color.sendCommand("0,0,0")		// LED AUS schalten
    Flur2_Farbe.sendCommand("0,0,0")			// Flur2 AUS schalten
Aus dem Grund das man immer das gleiche ITEM zum schalten nutzt?
Ja. Du brauchst überhaupt nur ein Item pro Lampe. Selbst für den Zustand (ON/OFF) reicht das Color Item, man kann den Status nicht nur über .state abfragen (liefert den Itemtyp als Datentyp, also in diesem Fall HSBype), sondern auch mit .getStateAs(Datentyp), also z.B. .getStateAs(OnOffType).
Es gibt nicht viele Gründe, mehr als ein Item mit einem Channel zu verlinken :) und im Allgemeinen gehören weder Statusanzeigen noch Bedienelemente dazu.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: OH3, Rules Syntax / Einrücken?

Beitrag von Steinspiel »

Moin,
udo1toni hat geschrieben: 19. Mär 2022 11:11 Der Timer-Block ist unabhängiger Code. Die Rule läuft zu diesem Zeitpunkt nicht.
Ich habe es inzwischen bei all meinen "Telegram-Rules" die Konstante in jedem Block wo sie gebraucht wird, eingefügt. Telegram Probleme -> Adieu ;)
Du brauchst überhaupt nur ein Item pro Lampe. Selbst für den Zustand (ON/OFF) reicht das Color Item, man kann den Status nicht nur über .state abfragen
Ich glaube diese Color Item Geschichte hatten wir vor einiger Zeit schon einmal, ich habe es nur nicht wirklich gerafft...

Inzwischen:

Code: Alles auswählen

rule "AN_AUS_Test"
when    
        Item Test_Schalter_A changed to ON
then	        
        if(HuePlay1_Farbe.getStateAs(OnOffType) == OFF){
                HuePlay2_Farbe.sendCommand("70,60,100")
        }
end
Funktioniert in allen Richtungen ON, OFF... Super Tipp, ich bau das jetzt in die Rules ein!

Danke! Schönen Nachmittag noch...
bis dann, Steinspiel

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

Re: OH3, Rules Syntax / Einrücken?

Beitrag von udo1toni »

Prima!
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten