Ankündigung

Einklappen
Keine Ankündigung bisher.

Rule fehler

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

    Rule fehler

    Hallo zusammen

    Mein Timer rule macht mir eine fehlermeldung im log file und ich habe keine ahnung an was es liegen könnte!
    rule "Laden Überschuss Einschalten"
    when
    Item Stufe_2 changed to ON or
    Item Leistungsdaten_Einspeiseleistung changed
    then
    if (Leistungsdaten_Einspeiseleistung.state >=2700 && Stufe_2.state == ON && Ledesteckdose.state == OFF && Stufe_3.state == OFF) {
    if(myTimer3 === null)
    myTimer3 = createTimer(now.plusSeconds(20), [ |
    if (Leistungsdaten_Einspeiseleistung.state >=2700 && Stufe_2.state == ON && Ledesteckdose.state == OFF && Stufe_3.state == OFF)

    sendTelegram ("bot1", "Ladung mit Überschuss begonnen")
    sendCommand (Ledesteckdose, ON)
    myTimer3 = null
    ])}
    else {

    myTimer3.cancel
    myTimer3 = null
    }

    end
    Die dazugehörige fehlermeldung aus dem log

    2020-07-05 19:38:33.415 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Laden Überschuss Einschalten': cannot invoke method public abstract boolean org.eclipse.smarthome.model.script.actions.Timer.c ancel() on null
    Ideen?

    Danke schonmal

    #2
    Ohne es geprüft zu haben würde ich auf diese Zeilen tippen:
    Code:
    myTimer3.cancel
    myTimer3 = null
    myTimer3 ist m.E. an der Stelle nicht definiert/initialisiert.

    Evtl. "this" verwenden?

    Kommentar


      #3
      Hey

      bin jetzt selber drauf gekommen..... machmal tut es gut mal was anders zwischendurch zu machen..

      Meine Lösung sieht so aus

      rule "Laden Überschuss Einschalten"
      when
      Item Stufe_2 changed to ON or
      Item Leistungsdaten_Einspeiseleistung changed
      then
      if (Leistungsdaten_Einspeiseleistung.state >=2700 && Stufe_2.state == ON && Ledesteckdose.state == OFF && Stufe_3.state == OFF) {
      if(myTimer3 === null)
      myTimer3 = createTimer(now.plusSeconds(20), [ |
      if (Leistungsdaten_Einspeiseleistung.state >=2700 && Stufe_2.state == ON && Ledesteckdose.state == OFF && Stufe_3.state == OFF)

      sendTelegram ("bot1", "Ladung mit Überschuss begonnen")
      sendCommand (Ledesteckdose, ON)
      myTimer3 = null
      ])}
      else
      {
      if (myTimer3 !== null)
      myTimer3.cancel

      myTimer3 = null
      }

      end

      Kommentar


        #4
        Bitte Code mit den Code Tags versehen, nicht mit den Quote Tags.
        In der Forensoftware werden sonst verschiedene Zeichen ersetzt.
        Damit die Einrückung von Code erhalten bleibt, muss man beim Einfügen des Codes (momentan) auf Quellcodeansicht umschalten (das Blatt mit <> drauf).

        Dein Rule hat einen Fehler, der sich allerdings nie auswirkt. Im Timer Code prüfst Du auf die Erfüllung der Bedingungen, falls die Bedingungen nicht erfüllt sind, wird nur kein Telegram gesendet, wohl aber die Ladesteckdose eingeschaltet. Dass sich das nie auswirkt, liegt daran, dass die Bedingung immer erfüllt ist (sonst löscht die Rule ja den Timer...)
        Dein Code kann also etwas kürzer die gleiche Aufgabe erfüllen:
        Code:
        rule "Laden Überschuss Einschalten"
        when
            Item Stufe_2 changed to ON or
            Item Leistungsdaten_Einspeiseleistung changed
        then
            if(Leistungsdaten_Einspeiseleistung.state >= 2700 && Stufe_2.state == ON && Ledesteckdose.state == OFF && Stufe_3.state == OFF) {
                if(myTimer3 === null)
                    myTimer3 = createTimer(now.plusSeconds(20), [ |
                        sendTelegram ("bot1", "Ladung mit Überschuss begonnen")
                        Ledesteckdose.sendCommand(ON)
                        myTimer3 = null
                    ])
            } else {
                myTimer3?.cancel
                myTimer3 = null
            }
        end
        Die Schreibweise myTimer3?.cancel entspricht dem Ausdruck if(myTimer3 !== null) myTimer3.cancel, die Methode Item.sendCommand(Wert) ist sicherer als die Action sendCommand(Item, Wert).

        Zuletzt geändert von udo1toni; 05.07.2020, 23:29.

        Kommentar


          #5
          Danke toni

          allerdings verstehe ich disesn satz nicht:

          Im Timer Code prüfst Du auf die Erfüllung der Bedingungen, falls die Bedingungen nicht erfüllt sind, wird nur kein Telegram gesendet, wohl aber die Ladesteckdose eingeschaltet. Dass sich das nie auswirkt, liegt daran, dass die Bedingung immer erfüllt ist (sonst löscht die Rule ja den Timer...)

          Kommentar


            #6
            Na ja, Du hast in Deinem Code innerhalb des Timers nochmals das gleiche if() Statement wie außerhalb des Timers. Da Du aber, falls außerhalb des Timers dieses Statement nicht erfüllt ist (im else-Teil) den Timer abbrichst, kann die Bedingung innerhalb des Timer niemals nicht erfüllt sein. Somit kann das if() innerhalb des Timers ebensogut entfallen

            Kommentar


              #7
              Ok jetzt habe ich es kappiert

              Kommentar


                #8
                Hallo, ich hänge meine Rule einfach mal hinten dran. Diese funktioniert leider nicht wie ich es möchte. Jede 15 Minuten soll geprüft werden, ob die Bedingungen des Zeitraum (08:00 bis 20:00) zutrefffen und die Außentemperatur größer 23 Grad ist. Wenn alles zutrifft wird die Beschattung ausgeführt.
                Mit auskommentierten Zeitraum funktikoniert die Rule. Verschiedene Varianten habe ich getestet, doch leider kein Erfolg. Ich bedanke mich für die Unterstützung!

                Code:
                [COLOR=#c586c0]rule[/COLOR][COLOR=#ce9178]"Beschattung Temperatur"[/COLOR]
                [COLOR=#c586c0]when[/COLOR][COLOR=#569cd6]Time[/COLOR][COLOR=#4ec9b0]cron[/COLOR][COLOR=#ce9178]"0 0/15 0/1 ? * * *"[/COLOR]
                [COLOR=#c586c0]then[/COLOR]
                [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4]([/COLOR][COLOR=#4ec9b0]now[/COLOR][COLOR=#d4d4d4].getHourOfDay > [/COLOR][COLOR=#b5cea8]8[/COLOR][COLOR=#d4d4d4] && [/COLOR][COLOR=#4ec9b0]now[/COLOR][COLOR=#d4d4d4].getHourOfDay < [/COLOR][COLOR=#b5cea8]20[/COLOR][COLOR=#d4d4d4]) {[/COLOR]
                [COLOR=#c586c0]if[/COLOR][COLOR=#d4d4d4]([/COLOR][COLOR=#4ec9b0]gRSSI[/COLOR][COLOR=#d4d4d4].state >[/COLOR][COLOR=#b5cea8]23[/COLOR][COLOR=#d4d4d4]) { [/COLOR][COLOR=#4ec9b0]Zentral_Beschattung_Temperatur[/COLOR][COLOR=#d4d4d4].sendCommand([/COLOR][COLOR=#b5cea8]ON[/COLOR][COLOR=#d4d4d4])[/COLOR]
                [COLOR=#d4d4d4]   }[/COLOR]
                [COLOR=#d4d4d4]   }[/COLOR]
                [COLOR=#c586c0]else[/COLOR][COLOR=#d4d4d4] { [/COLOR][COLOR=#4ec9b0]Zentral_Beschattung_Temperatur[/COLOR][COLOR=#d4d4d4].sendCommand([/COLOR][COLOR=#b5cea8]OFF[/COLOR][COLOR=#d4d4d4])[/COLOR]
                [COLOR=#d4d4d4]}[/COLOR]
                [COLOR=#c586c0]end[/COLOR]

                Kommentar


                  #9
                  Nerz warum eröffnest Du nicht einen eigenen Thread für Deine Problem? Das ist doch komplett unabhängig...

                  rssi für die Temperatur wäre zumindest ein exotischer bezeichnet.

                  Kommentar


                    #10
                    Danke für den Ratschlag
                    Hier gehts doch um einen Fehler in der Rule. Nach dem Gruppennamen zu beurteilen, würde ich doch mal behaupten dass es passt.
                    Bei einem neuen Thread wäre wahrscheinlich eine ähnliche Frage gekommen

                    Mein Problem hat sich mittlerweile von alleine geklärt. An der Rule hat es nicht gelegen, sondern um ne Einstellung in der ETS. Danke!

                    Kommentar


                      #11
                      Nerz Das ist das Problem an allzu allgemeinen Thread Titeln. Der Thread ist nicht allgemein für alle Rule Fehler gedacht... In diesem Fall ging es eigentlich nur um das Problem mit dem nicht initialisierten Timer, der nicht gecancelt werden kann.

                      In Deinem Fall ist es doch ein bisschen ein anderes Problem

                      By the way: Wenn Du Dein Posting anschaust, wirst Du sehen, dass der Text zwar toll bunt, aber dafür nur schlecht lesbar ist und auch die Abstände zwischen den einzelnen Worten teilweise nicht passen. Insofern passt der Thread doch, weil ich das oben schon mal erläutert habe, wie man das vermeiden kann (Text im Quellcodemodus einfügen).

                      Ansonsten möchte ich noch fragen, warum Du über Time cron arbeitest und nicht die Funktionen von Time cron nutzt? Du prüfst extra auf Zeitraum 9:00:00 (!) bis 19:59:59, dabei ist das gar nicht notwendig, wenn Du den Time cron Ausdruck anpasst:
                      Code:
                      Time cron "0 0/15 8-19 * * ?"
                      triggert täglich zur vollen Viertelstunde zwischen 8:00:00 Uhr und 19:45:00 Uhr.

                      Kommentar

                      Lädt...
                      X