Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule DSL

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Rule DSL

    Hallo zusammen!

    Ich habe ein kleines Problem mit einer Rule in OH 3.

    In OH2 sah sie so aus:

    Code:
    rule "Pumpe EG und OG"
    when
        Item HO_EG_OG changed
    then
        
        if (Heizung.state==ON) 
    Pumpe_EG_OG.sendCommand(if(HO_EG_OG.state != OFF) ON else OFF)
    Erklärung dazu: Wenn der Schalter "Heizung" (ein einfaches Item) auf ON steht, dann sollen sich die Heizpumpen einschalten, wenn das Gruppenitem meldet, dass sich eines der Heizventile einschaltet.

    Ist "Heizung" auf OFF, dann passiert gar nichts, wenn sich ein Heizventil einschaltet (zB an einem kühlen Tag im Sommer). Schaltet sich das Heizventil aus, dann schaltet sich auch die Pumpe ab.

    Der Code in OH 3 sieht nun so aus:

    Code:
    
    triggers:
    - id: "1"
    configuration:
    itemName: KNXHeizungoben
    command: ON
    type: core.ItemCommandTrigger
    conditions:
    - inputs: {}
    id: "3"
    configuration:
    itemName: Heizung
    state: ON
    operator: =
    type: core.ItemStateCondition
    actions:
    - inputs: {}
    id: "2"
    configuration:
    itemName: KNXJalousienEG2undGerate_HeizpumpeEGundOG
    command: ON
    type: core.ItemCommandAction
    Wie kriege ich den "else" Befehl hinein? Ich habe versucht die alte Rule im Editor einzuarbeiten, erhalte aber dann ständig Fehlermeldungen.

    Um es ein bisschen zu steigern, habe ich eine temperaturabhängige Schaltung als Frostwächter, hier OH2:

    Code:
    rule "Pumpe Garage"
    when
        Time cron "0 0/20 * * * ?" 
    then
        if(Heizung.state==ON) {
             if(!(Grad_WE_Aussentemperatur.state instanceof Number)) {
             logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
             return;
            }
            if(!(ActualTemperature_GA_Garage.state instanceof Number)) {
                logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
                return;
            }
            Pumpe_Garage.sendCommand(if((Grad_WE_Aussentempera tur.state as Number) < -3 || (ActualTemperature_GA_Garage.state as Number) < 2) ON else OFF)
        } else {
            if(Pumpe_Garage.state != OFF) Pumpe_Garage.sendCommand(OFF)
        }
    end
    Kann das in OH3 so stimmen bzw. wie kriege ich wieder else OFF unter:

    Code:
    triggers:
    - id: "1"
    configuration:
    itemName: KNXAussentemperatur_Aussentemperatur1fC
    state: =< 1
    type: core.ItemStateChangeTrigger
    conditions:
    - inputs: {}
    id: "3"
    configuration:
    itemName: Heizung
    state: ON
    operator: =
    type: core.ItemStateCondition
    actions:
    - inputs: {}
    id: "2"
    configuration:
    itemName: KNXJalousienEG2undGerate_HeizpumpeKeller
    command: ON
    type: core.ItemCommandAction
    Vielen Dank im Voraus für die Hilfe!

    #2
    Warum willst Du die Rule überhaupt umformulieren? Der Code sollte komplett unverändert auch unter openHAB3 funktionieren. Ich kann ja verstehen, wenn Neulinge lieber anders programmieren wollen, aber Umsteiger sind doch nicht gezwungen, all ihre Rules neu zu schreiben!

    Vorzunehmende Anpassungen beschränken sich auf Joda Time (Umstellung auf JavaTime) und evtl. die implizite Variable triggeringItem, welche nicht mehr unbegrenzt zur Verfügung steht.

    Kommentar


      #3
      Weil kein Update machen wollte, sondern sauber neu installieren, um eine schöne Struktur zu haben. OH2 war etwas chaotisch bei mir.

      Und ich habe ja auch geschrieben, dass die alte Rule nicht läuft, wenn ich sie einfüge und anpasse.

      Den zweiten Absatz verstehe ich leider nicht. Mach das nur nebenbei.

      Kommentar


        #4
        Übrigens, wenn ich die alte Rule übernehme und anpasse, dann bekomme ich diese Fehlermeldung:

        Code:
        
        2021-10-17 16:53:59.339 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Heizung_Garage' failed: ___ rule ___ "Pumpe Garage"
        
        when
        
        Time cron "0 0/20 * * * ? ___ "
        
        then
        
        if(Heizung.state==ON) {
        
        if(!(KNXAussentemperatur_Aussentemperatur1fC.state instanceof Number)) {
        
        logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
        
        return;
        
        }
        
        if(!(KNXReglerGarage_TemperaturIst1fC.state instanceof Number)) {
        
        logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
        
        return;
        
        }
        
        KNXJalousienEG2undGerate_HeizpumpeGarage.sendComma nd(if((KNXAussentemperatur_Aussentemperatur1fC.sta te as Number) < -3 || (KNXReglerGarage_TemperaturIst1fC.state as Number) < 2) ON else OFF)
        
        } else {
        
        if(KNXJalousienEG2undGerate_HeizpumpeGarage.state != OFF) KNXJalousienEG2undGerate_HeizpumpeGarage.sendComma nd(OFF)
        
        }
        
        end
        
        
        
        1. The method or field rule is undefined; line 1, column 0, length 4
        
        2. The method or field when is undefined; line 2, column 20, length 4
        
        3. The method or field cron is undefined; line 3, column 34, length 4
        
        4. The method or field then is undefined; line 4, column 57, length 4
        
        5. The method or field end is undefined; line 18, column 796, length 3
        
        6. This expression is not allowed in this context, since it doesn't cause any side effects.; line 1, column 5, length 14
        
        7. This expression is not allowed in this context, since it doesn't cause any side effects.; line 3, column 29, length 4
        
        8. This expression is not allowed in this context, since it doesn't cause any side effects.; line 3, column 39, length 16

        Hier der Code in OH3:

        Code:
        triggers: []
        conditions: []
        actions:
        - inputs: {}
        id: "1"
        configuration:
        type: application/vnd.openhab.dsl.rule
        script: >
        rule "Pumpe Garage"
        
        when
        Time cron "0 0/20 * * * ?"
        then
        if(Heizung.state==ON) {
        if(!(KNXAussentemperatur_Aussentemperatur1fC.state instanceof Number)) {
        logError("pumpe_garage","Außenfühler hat keinen gültigen Wert!")
        return;
        }
        if(!(KNXReglerGarage_TemperaturIst1fC.state instanceof Number)) {
        logError("pumpe_garage","Innenfühler hat keinen gültigen Wert!")
        return;
        }
        KNXJalousienEG2undGerate_HeizpumpeGarage.sendComma nd(if((KNXAussentemperatur_Aussentemperatur1fC.sta te as Number) < -3 || (KNXReglerGarage_TemperaturIst1fC.state as Number) < 2) ON else OFF)
        } else {
        if(KNXJalousienEG2undGerate_HeizpumpeGarage.state != OFF) KNXJalousienEG2undGerate_HeizpumpeGarage.sendComma nd(OFF)
        }
        end
        type: script.ScriptAction

        Kommentar


          #5
          Du hast die Rule da aber nicht dort eingefügt, wo Du sie in openHAB eingefügt hattest (nämlich innerhalb einer Datei unterhalb /etc/openhab/rules/ mit der Endung .rules), sondern Du hast die Rule (so wie sie ist) als Codeblock in eine UI Rule eingefügt.
          Du kannst eine UI Rule mit einem Codeblock füllen, der in der DSL programmiert ist. ABER: Der Codeblock ist alles zwischen then und end, die Überschrift rule... ist nicht Teil des Codes, ebenso wenig der Teil zwischen when und then (das ist der Trigger Teil, den Du in der UI an anderer Stelle definierst) und die Schlüsselworte rule, when, then und end sind ebenfalls NICHT Bestandteil des Codes.

          Du musst auch aufpassen, den Code korrekt einzufügen (Hier sind irgendwann Leerzeichen im Code gelandet, die dort nicht hingehören)
          Zuletzt geändert von udo1toni; 17.10.2021, 23:07.

          Kommentar


            #6
            Vielen Dank, damit kann ich jetzt was anfangen!

            Kann man in der UI eigentlich einen Trigger so definieren, dass er etwa auslöst, wenn die Temperatur unter einen bestimmten Bereich fällt, oder geht das nur durch einfügen einer Rule und .../rules/?
            Zuletzt geändert von fred07; 18.10.2021, 18:24.

            Kommentar


              #7
              Du kannst triggern und mit dem Teil "but only if" den Bereich eingrenzen. Ansonsten gilt das gleiche wie bei reinen DSL Rules, das heißt, Du kannst natürlich beliebige Einschränkungen innerhalb des Code-Blocks vornehmen.

              Kommentar


                #8
                Ich hänge mich mal hier rein, da ich aktuell von OH2 auf OH3 umstelle und soweit fast alles am Laufen habe bis auf eine Rule:

                Die Rule hat mir damals schon udo1toni mit entwickelt und sie lief auf OH2 bis zum Umstieg perfekt.

                Jetzt auf OH3 bekomme ich folgende Meldung im Log:


                2022-06-20 21:19:08.693 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Multimedia-4' failed: 'left' is not a member of 'java.lang.String'; line 56, column 36, length 40 in Multimedia


                Die Rule sieht so aus:

                rule"Radiostation Bad an knx senden"
                when
                Item Echo_Bad_Title changed
                then
                var Integer nLen = 14
                if(Echo_Bad_Title.state.toString.getBytes.size < nLen) nLen = Echo_Bad_Title.state.toString.getBytes.size
                Echo_Bad_Title_KNX.sendCommand(Echo_Bad_Title.state.toString.left(nLen))
                end
                Ziel dieser Rule ist, die Info des Liedtitels vom Amazon Echo auf dem KNX Smarttaster im Bad als Infotext im 14 Bit Format (Infotext) anzuzeigen, da der Glastaster eben dieses Format verlangt.

                Wie müsste die Rule aussehen damit sie auf OH3 wieder läuft?



                Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
                Albert Einstein

                Kommentar


                  #9
                  Hi Tom,

                  ich hab dir meine Dateien mal zum Download bereit gestellt und der Link per PN geschickt.

                  Kommentar


                    #10
                    Super, vielen Dank, och werde es die Tage ausprobieren
                    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
                    Albert Einstein

                    Kommentar


                      #11
                      Du könntest es mal so probieren:
                      Code:
                      rule "Radiostation Bad an knx senden"
                      when
                          Item Echo_Bad_Title changed
                      then
                          Echo_Bad_Title_KNX.sendCommand(String::format("%-14.14s",Echo_Bad_Title.state.toString))
                      end
                      Dabei wird der Text formatiert, so dass er mindestens 14 Zeichen lang ist und höchstens 14 Zeichen lang ist. Der Text wird dabei linksbündig ausgegeben. Ist der Text kürzer, so wird der Rest mit Leerzeichen aufgefüllt.

                      Kommentar


                        #12
                        Zitat von udo1toni Beitrag anzeigen
                        Du könntest es mal so probieren:
                        Vielen Dank, super funktioniert auf Anhieb
                        Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
                        Albert Einstein

                        Kommentar


                          #13

                          Kommentar

                          Lädt...
                          X