Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule Error

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

    Rule Error

    Hallo!

    Ich habe seit neuestem einen Fehler in einer Rule, komme aber nicht dahinter, weil sie eigentlich lief. Ich habe sie nur über den Winter nicht gebraucht.

    Vielleicht weiß wer weiter, für mich gibt es keinen Sinn, dass Teile des Codes bekrittelt werden, Teile, die mir ident scheinen, aber nicht.

    2019-06-02 09:36:28.268 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Schrankraum': The name 'Sonne' cannot be resolved to an item or type; line 204, column 9, length 5
    2019-06-02 09:36:28.270 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv WZ 1': The name 'Sonne' cannot be resolved to an item or type; line 61, column 9, length 5
    2019-06-02 09:36:28.281 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv EZ': The name 'Sonne' cannot be resolved to an item or type; line 127, column 9, length 5
    2019-06-02 09:36:28.283 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Osten': The name 'Sonne' cannot be resolved to an item or type; line 273, column 9, length 5
    2019-06-02 09:36:28.289 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv OG': The name 'Sonne' cannot be resolved to an item or type; line 166, column 9, length 5
    2019-06-02 09:36:28.305 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Westen': The name 'Sonne' cannot be resolved to an item or type; line 236, column 9, length 5
    2019-06-02 09:36:28.311 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv WZ 2': The name 'Sonne' cannot be resolved to an item or type; line 93, column 9, length 5
    2019-06-02 09:36:28.441 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv EZ': 'getHourOfDay' is not a member of 'null'; line 31, column 29, length 16



    Hier die Rule:

    rule "Sonne Küche zu"
    when
    Time cron "* 0 8 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Kueche_rechts.sendCommand(DOWN)
    Jalousie_OG_Gangfenster.sendCommand(DOWN)
    }
    end
    rule "Sonne Küche auf"
    when
    Time cron "* 30 13 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Kueche_rechts.sendCommand(UP)
    Jalousie_OG_Gangfenster.sendCommand(UP)
    }
    end
    rule "Sonne aktiv/inaktiv EZ"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 7 && now.getHourOfDay < 13) { //falls Sonne aktiv und Uhrzeit zwischen 8 und 13 Uhr
    Jalousie_EG_Kueche_rechts.sendCommand(DOWN) //schließe Jalousie
    Jalousie_OG_Gangfenster.sendCommand(DOWN)
    }
    if (Sonne.state==OFF && now.getHourOfDay > 12 && now.getHourOfDay < 18) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_EG_Kueche_rechts.sendCommand(UP) //öffne Jalousie
    Jalousie_OG_Gangfenster.sendCommand(UP)
    }
    end
    rule "Sonne WZ 1 zu"
    when
    Time cron "1 30 9 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Wohnzimmer_Tuer.sendCommand(75)
    }
    end
    rule "Sonne WZ 1 auf"
    when
    Time cron "0 45 18 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Wohnzimmer_Tuer.sendCommand(UP)
    }
    end
    rule "Sonne aktiv/inaktiv WZ 1"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 9 && now.getHourOfDay < 18) { //falls Sonne aktiv und Uhrzeit zwischen 10 und 19 Uhr
    Jalousie_EG_Wohnzimmer_Tuer.sendCommand(75) //schließe Jalousie
    }
    if (Sonne.state==OFF && now.getHourOfDay > 17 && now.getHourOfDay < 19) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_EG_Wohnzimmer_Tuer.sendCommand(UP) //öffne Jalousie
    }
    end
    rule "Sonne WZ 2 zu"
    when
    Time cron "0 30 9 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Wohnzimmer.sendCommand(75)
    }
    end
    rule "Sonne WZ 2 auf"
    when
    Time cron "0 45 18 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Wohnzimmer.sendCommand(UP)
    }
    end
    rule "Sonne aktiv/inaktiv WZ 2"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 9 && now.getHourOfDay < 18) { //falls Sonne aktiv und Uhrzeit zwischen 10 und 19 Uhr
    Jalousie_EG_Wohnzimmer.sendCommand(75) //schließe Jalousie
    }
    if (Sonne.state==OFF && now.getHourOfDay > 17 && now.getHourOfDay < 19) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_EG_Wohnzimmer.sendCommand(UP) //öffne Jalousie
    }
    end
    rule "Sonne EZ zu"
    when
    Time cron "0 30 9 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Essplatz.sendCommand(75)
    Jalousie_EG_Essplatz_Tuer.sendCommand(75)
    }
    end
    rule "Sonne EZ auf"
    when
    Time cron "0 0 18 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_EG_Essplatz.sendCommand(UP)
    Jalousie_EG_Essplatz_Tuer.sendCommand(UP)
    }
    end
    rule "Sonne aktiv/inaktiv EZ"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 9 && now.getHourOfDay < 18) { //falls Sonne aktiv und Uhrzeit zwischen 10 und 19 Uhr
    Jalousie_EG_Essplatz.sendCommand(75)
    Jalousie_EG_Essplatz_Tuer.sendCommand(75)
    }
    if (Sonne.state==OFF && now.getHourOfDay > 17 && now.getHourOfDay < 19) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_EG_Essplatz.sendCommand(UP)
    Jalousie_EG_Essplatz_Tuer.sendCommand(UP)
    }
    end


    rule "Sonne OG zu"
    when
    Time cron "1 0 8 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Schlafzimmer.sendCommand(DOWN)
    Jalousie_OG_Badezimmer.sendCommand(75)
    }
    end
    rule "Sonne OG auf"
    when
    Time cron "1 0 19 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Schlafzimmer.sendCommand(UP)
    Jalousie_OG_Badezimmer.sendCommand(UP)
    }
    end

    rule "Sonne aktiv/inaktiv OG"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 8 && now.getHourOfDay < 18) { //falls Sonne aktiv und Uhrzeit zwischen 10 und 19 Uhr
    Jalousie_OG_Schlafzimmer.sendCommand(DOWN)
    Jalousie_OG_Badezimmer.sendCommand(75)
    }
    if (Sonne.state==OFF && now.getHourOfDay > 17 && now.getHourOfDay < 19) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_OG_Schlafzimmer.sendCommand(UP)
    Jalousie_OG_Badezimmer.sendCommand(UP)
    }
    end
    rule "Sonne Schrankraum zu"
    when
    Time cron "2 0 8 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Schrankraum.sendCommand(DOWN)
    }
    end
    rule "Sonne Schrankraum auf"
    when
    Time cron "2 0 19 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Schrankraum.sendCommand(UP)
    }
    end

    rule "Sonne aktiv/inaktiv Schrankraum"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 8 && now.getHourOfDay < 18) { //falls Sonne aktiv und Uhrzeit zwischen 10 und 19 Uhr
    Jalousie_OG_Schrankraum.sendCommand(DOWN)
    }
    if (Sonne.state==OFF && now.getHourOfDay > 17 && now.getHourOfDay < 19) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_OG_Schrankraum.sendCommand(UP)
    }
    end

    rule "Sonne Westen zu"
    when
    Time cron "0 0 15 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Sebastian.sendCommand(DOWN)
    Jalousie_EG_Gaestezimmer.sendCommand (DOWN)
    }
    end
    rule "Sonne Westen auf"
    when
    Time cron "0 0 19 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Sebastian.sendCommand(UP)
    Jalousie_EG_Gaestezimmer.sendCommand (UP)
    }
    end
    rule "Sonne aktiv/inaktiv Westen"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 15 && now.getHourOfDay < 18) { //falls Sonne aktiv und Uhrzeit zwischen 10 und 19 Uhr
    Jalousie_OG_Sebastian.sendCommand(DOWN)
    Jalousie_EG_Gaestezimmer.sendCommand (DOWN)
    }
    if (Sonne.state==OFF && now.getHourOfDay > 15 && now.getHourOfDay < 19) { //falls Sonne inaktiv und Uhrzeit zwischen 13 und 18 Uhr
    Jalousie_OG_Sebastian.sendCommand(UP)
    Jalousie_EG_Gaestezimmer.sendCommand (UP)
    }
    end
    rule "Sonne Osten zu"
    when
    Time cron "0 0 8 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Lorenz.sendCommand(75)
    Jalousie_EG_Buero.sendCommand(75)
    }
    end
    rule "Sonne Osten auf"
    when
    Time cron "0 30 13 * * ? *"
    then
    if (Sonne.state==ON) {
    Jalousie_OG_Lorenz.sendCommand(UP)
    Jalousie_EG_Buero.sendCommand(UP)
    }
    end

    rule "Sonne aktiv/inaktiv Osten"
    when
    Item Sonne changed //wenn das Item Sonne geändert wurde (also ON->OFF oder OFF->ON)
    then
    if (Sonne.state==ON && now.getHourOfDay > 8 && now.getHourOfDay < 13) { //falls Sonne aktiv und Uhrzeit zwischen 8 und 13 Uhr
    Jalousie_OG_Lorenz.sendCommand(75)
    Jalousie_EG_Buero.sendCommand(75)
    }
    if (Sonne.state==OFF && now.getHourOfDay > 14 && now.getHourOfDay < 18) { //falls Sonne inaktiv und Uhrzeit zwischen 14 und 18 Uhr
    Jalousie_OG_Lorenz.sendCommand(UP)
    Jalousie_EG_Buero.sendCommand(UP)
    }
    end

    #2
    Heidernei... Bitte Code nicht als Zitat markieren, sondern als Code!

    Die Fehlermeldung besagt, dass Dein Item Sonne nicht existiert.
    Hast Du vielleicht etwas an Deiner Itemkonfiguration geändert?

    Kommentar


      #3
      Nein, das Item Sonne ist da, wenn ich es schalte, dann sieht man in der events.log auch die Änderung des Schaltzustandes.

      Wenn man sich die Rule ansieht, dann kommt Sonne viel öfter vor, als sich OH drüber beschwert. Bei einem Neustart meckert es jetzt sogar "ON" an.

      Code:
        [COLOR=#000000][B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Westen': The name 'ON' cannot be resolved to an item or type; line 236, column 22, length 2[/COLOR]
       
      
      [COLOR=#000000][/COLOR]


      Kommentar


        #4
        Es ist übrigens bei jedem Neustart etwas Neues...


        Code:
          [COLOR=#000000]2019-06-02 18:00:03.347 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv EZ': The name 'ON' cannot be resolved to an item or type; line 27, column 22, length 2[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.348 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Westen': The name 'OFF' cannot be resolved to an item or type; line 239, column 18, length 3[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.366 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Schrankraum': The name 'Sonne' cannot be resolved to an item or type; line 200, column 9, length 5[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.384 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv OG': The name 'Sonne' cannot be resolved to an item or type; line 165, column 9, length 5[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.397 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv EZ': The name 'Sonne' cannot be resolved to an item or type; line 127, column 9, length 5[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.525 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv Osten': An error occurred during the script execution: null[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.525 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv WZ 2': The name 'Jalousie_EG_Wohnzimmer' cannot be resolved to an item or type; line 97, column 3, length 22[/COLOR]
          [COLOR=#000000]2019-06-02 18:00:03.526 [B][ERROR][/B] [ntime.internal.engine.RuleEngineImpl] - Rule 'Sonne aktiv/inaktiv WZ 1': An error occurred during the script execution: org.eclipse.xtext.common.types.impl.JvmVoidImplCustom cannot be cast to org.eclipse.xtext.common.types.JvmOperation[/COLOR]
         
        
        
        [COLOR=#000000][/COLOR]

        Kommentar


          #5
          Eventuell hast Du an anderer Stelle ein Problem. Da das Item existiert, hast Du vielleicht in diesem Rules File noch andere Dinge stehen?

          Aber noch was anderes: Ich hab mir Deinen Spaghetti-Code mal angeschaut. In den ersten beiden Rules hast Du für die Sekunde einen Stern stehen, was bedeutet, dass die Rules beide einmal am Tag 60 mal innerhalb einer Minute ausgeführt werden. Keine gute Idee.
          Weiterhin hast Du diverse (8) Rules, die einen identischen Trigger haben, Item Sonne changed. Das bedeutet, dass zu diesem Zeitpunkt 5 Rules ausgeführt werden und sobald eine davon fertig abgearbeitet ist, wird die nächste ausgeführt, bis alle 8 einmal gelaufen sind. Das ist extrem ineffizient (so wie der gesamte restliche Code...)

          Löse Dich bitte von der Idee, dass eine Rule für eine extrem eingegrenzte Aufgabe gedacht ist. Orientiere Dich eher an den Triggern. Konkret: Der Schaltzustand hat sich geändert, also müssen diverse Rollladenpositionen überprüft werden.

          Gruppen sind eine oftmals unterschätzte mächtige Möglichkeit, Aufgaben effizient zu erledigen. Z.B. könnte man eine Gruppe RollSüd anlegen, in der alle Rollläden der Südseite des Hauses eingetragen sind (Diese Gruppe ist unabhängig von anderen Gruppen)
          Dann reicht eine Zeile Code
          Code:
          RollSüd.members.forEach[r | r.sendCommand(UP)]
          um alle Läden gleichzeitig hoch zu fahren, oder auch runter. Man könnte sogar bestimmte Sollpositionen pro Laden festlegen (z.B. in einem Array, welches die Namen und den Sollwert enthält) und anschließend statt des fixen Befehls die individuelle Position schicken (man muss dann nur auf die Variable mit dem Itemnamen als Index verweisen, die Codezeile wird dadurch nur unwesentlich länger)

          Für einen ersten Test mag der Code so gehen (bis auf die identischen Trigger, das macht auf jeden Fall Ärger), mittelfristig sollte man sowas aber vermeiden.

          Da es hier ja um Sonnenstandssteuerung geht, eventuell wäre ein Ansatz über das Astro Binding besser. Die Rule (ja, nur eine) wird über die Sonnenstandsänderung getriggert, innerhalb der Rule wird Sonnenhöhe und -richtung auf Grenzwerte geprüft und die Position jedes Ladens angepasst. Der Schalter wird als zusätzlicher Trigger mit in die Rule geschrieben und zu Beginn wird gegebenenfalls geprüft, ob die Rule durch den Schalter getriggert wurde (triggeringItem != null)

          Statt jetzt 236 Zeilen und 24 Rules hast Du dann allerdings eher 20 Zeilen und eine Rule.

          Kommentar


            #6
            Hallo Udo!

            Danke für deinen Ansatz, ich werde mir das gerne ansehen, auch wenn das wahrscheinlich meine Kenntnisse übersteigt.

            Was deine Bezeichnung "Spaghetti-Code" betrifft, anscheinend sind wir beide Nudelliebhaber, denn der Code ist eigentlich von dir, du hast mir da seinerzeit geholfen.

            HTML-Code:
            https://knx-user-forum.de/forum/supportforen/openhab/1106796-frage-zu-rule?p=1107112#post1107112
            ;-)

            Kommentar


              #7
              Zitat von fred07 Beitrag anzeigen
              Was deine Bezeichnung "Spaghetti-Code" betrifft, anscheinend sind wir beide Nudelliebhaber, denn der Code ist eigentlich von dir, du hast mir da seinerzeit geholfen.
              Aber da ging es um einen Laden und drei sehr überschaubare Rules...

              Kommentar


                #8

                Kommentar


                  #9
                  Nachdem ich mir das nochmals durchgelesen habe, habe ich das mit dem * bei den Sekunden geändert.

                  Astro Binding habe ich mir überlegt, mich dann für die Zeitsteuerung entschieden.

                  Was den Rest betrifft, sorry, ich bin komplett ausgestiegen, da fehlt mir schlichtweg die Programmkenntnis.

                  Kommentar


                    #10
                    Für effizientes Programmieren wäre der erste wichtige Schritt, logisch zusammengehörende Items in Gruppen zusammenzufassen, z.B. alle Läden auf einer Hausseite, da diese für eine Beschattung gewöhnlich alle gemeinsam fahren sollen.

                    Regeln mit identischem Trigger unbedingt zu einer Regel zusammenfassen, sonst droht Ungemach

                    Kommentar


                      #11
                      Das Problem ist, dass mein Haus auf einem kleinen Berg liegt und rundherum Berge sind. Deshalb ist die Beschattung für keinen Raum wirklich gleich, so muss sollte das Schlafzimmer etwa von 8-19 Uhr verdunkelt sein, etc.

                      Aber wenn ich verschiedene Trigger zu einer Gruppe zusammenfasse und den Status der Gruppe ändere, sollte das aber auch gehen, oder sehe ich das falsch?

                      Kommentar


                        #12
                        Zitat von fred07 Beitrag anzeigen
                        Das Problem ist, dass mein Haus auf einem kleinen Berg liegt und rundherum Berge sind. Deshalb ist die Beschattung für keinen Raum wirklich gleich, so muss sollte das Schlafzimmer etwa von 8-19 Uhr verdunkelt sein, etc.
                        Naja, dann definierst Du halt eine Gruppe pro Raum mit entsprechend mehr Triggerpunkten. Man könnte allerdings auch mit einer Gruppe für alle Rollläden arbeiten. Zusätzlich muss man dafür sorgen, dass alle zueinander gehörenden Läden bis zu einem bestimmten Namensteil identisch sind, z.B. so:
                        Code:
                        Group:Rollershutter alleLaeden
                        Rollershutter Shutter_1_1 "Schlafzimmer 1 [%d %%]" (alleLaeden) ...
                        Rollershutter Shutter_1_2 "Schlafzimmer 2 [%d %%]" (alleLaeden) ...
                        Rollershutter Shutter_2_1 "Wohnzimmer 1 [%d %%]" (alleLaeden) ...
                        Rollershutter Shutter_2_2 "Wohnzimmer 2 [%d %%]" (alleLaeden) ...
                        Rollershutter Shutter_2_3 "Wohnzimmer 3 [%d %%]" (alleLaeden) ...
                        Rollershutter Shutter_3_1 "Küche 1 [%d %%]" (alleLaeden) ...
                        Jetzt könnte man eine Rule erstellen, die dir Gruppe durchsucht und jeweils alle Läden eines Raumes steuert:
                        Code:
                        rule "Rollladen raumweise"
                        when
                            Item Dummy changed
                        then
                            val Number myNumber = 2
                            alleLaeden.members.filter[ i |
                                i.name.split("_").get(2) = myNumber.toString && (i.state as Number) < 100 ].forEach[ j |
                                    j.sendCommand(DOWN) ]
                        end
                        myNumber muss nun "nur" auf die richtige Raumnummer gesetzt werden, das kann man leicht abhängig von der Zeit machen.

                        Kommentar

                        Lädt...
                        X