Ankündigung

Einklappen
Keine Ankündigung bisher.

Variable haben immer wieder "null" als Wert

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

    Variable haben immer wieder "null" als Wert

    Hi,
    ich versuche gerade, mein erstes größeres Rulekonstrukt zu implementieren, scheitere aber schon im Ansatz.

    Ich möchte Rollos abhängig vom Sonnenunter bzw Sonnenaufgang runter bzw rauffahren. Dazu gibt es 3 Rules. Start des Zeitfensters (also frühester Zeitpunkt), Ende des Zeitfensters (da passiert es in jedem Fall) und die Sonnenaufgangs/Sonnenuntergangs Rule.
    Es gibt 3 Variablen
    var Number Var_Status_Buero_Sun
    var Number Var_Status_Buero_First
    var Number Var_Status_Buero_Last

    Diese werden auch fein initialisiert, wie das in den Samplen auch erklärt ist.

    Zwei der Rules (Start und Sonnenstand) setzen ...First und ...Sun auf 1 (vorher waren sie 0...nicht NULL), die LAST Rule setzt die variable ...Last auf 2.

    Anschließend werden alle 3 Variablen addiert und per postupdate eine Rule getriggert, die dann das rauf und runterfahren übernimmt.

    Soweit so gut...und es funktioniert sogar...aber nicht immer.

    In den Logs finde ich (seit der letzten Änderung) Fehlermeldungen und die Rules funktionieren nicht. Mit Logging der Variableninhalte habe ich herausbekommen, dass die
    ...First ...Last und ...Sun Variablen zwar von der Initialisierungsroutine (läuft um Mitternacht und um 12:00) zwar auf 0 gesetzt werden, wenn die oben beschriebenen Rules aufgerufen werden, dann ist aber nur die eine veränderte Variable auf dem gewünschten Wert (1 oder 2), die anderen beiden aber auf NULL...nicht immer aber häufig.

    Hab ich was gravierendes vergessen? Sind solche Probleme bekannt?
    Ich kann auch den gesamten Code hier einhängen, auch wenn der derzeit entwas konfus und mit Logmeldungen übersäht ist.

    Außerdem ist mir noch was aufgefallen: Ich hatte die Variablen ursprünglich in der Definition mit "= 0" versehen. Aber wenn ich das richtig beobachtet habe, dann wird diese Zuweisung bei jedem speichern der Datei wieder ausgeführt. Ist das so?

    Die verwendeten Variablen sind -nur- in diesem .rules File definiert (und derzeit auch nur da verwendet).

    Hier noch ein Beispiel der Fehlermeldung.

    Code:
    2015-04-16 20:42:03.383 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'Sonnenstand erreicht'
    java.lang.NullPointerException: null
            at org.openhab.model.script.lib.NumberExtensions.operator_plus(NumberExtensions.java:30) ~[na:na]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0]
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:729) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._featureCallOperation(XbaseInterpreter.java:713) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor350.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.openhab.model.script.interpreter.ScriptInterpreter.internalFeatureCallDispatch(ScriptInterpreter.java:69) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAbstractFeatureCall(XbaseInterpreter.java:658) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor348.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:751) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._featureCallOperation(XbaseInterpreter.java:712) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor350.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.openhab.model.script.interpreter.ScriptInterpreter.internalFeatureCallDispatch(ScriptInterpreter.java:69) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAbstractFeatureCall(XbaseInterpreter.java:658) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor348.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(XbaseInterpreter.java:843) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor363.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor352.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
            at sun.reflect.GeneratedMethodAccessor352.invoke(Unknown Source) ~[na:na]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0]
            at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0]
            at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
            at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:204) ~[na:na]
            at org.openhab.model.script.internal.engine.ScriptImpl.execute(ScriptImpl.java:59) ~[na:na]
            at org.openhab.core.scriptengine.ScriptExecutionThread.run(ScriptExecutionThread.java:44) ~[na:na]
    Gruß
    Peter

    #2
    Hallo

    Ich glaube dein Problem ist schwer Lösbar ohne weitere Infos: Könntest du mal deine Rule(s) mit den relevanten Variablen und includes posten? Vielleicht ist es nur eine Kleinigkeit (wie z.B. variable.state=..., statt variable=...)

    Kann es sein, dass deine Variablen den falschen Typen haben? Number statt DateTime ?

    Interessant wäre auch deine OH version und deine Java version.

    Wenn du deine .rules Files (auf deinem OH Server) speicherst, dann läd OH sie neu ein und führt ggf. auch die rules erneut aus, das ist normal. Somit werden die Variablen auch beim initialisieren neu auf 0 gesetzt. Umgehen kannst du das, indem du die variablen "on startup" initialisierst. (schlagt mich nicht wenn ich irre)

    Kommentar


      #3
      Ich hatte auch mal das Problem bei 5 Variablen, die eigentlichen Konstanten waren.
      Die sind auch immer auf null gesprungen aus Gründen, die ich nie nachvollziehen konnte.

      Der Workaround, den ich damals angewandt habe war, dass ich diese Variablen lokal in den Rules definiert und dort mit Werten belegt habe.
      Klar, das ist ein Workaround, der nur bei Konstanten funktioniert. Es scheint, dass bei globalen Variablen fundamentale Bugs existieren, die mehr oder weniger zufällig auftauchen.

      Allgemein hat OPENHAB einige fundamentale Fehler, die sich um das Thema Initialisierung und Startup ranken, die in gewissen Fällen nur durch wildes Trial and Error fixen beheben oder auch nicht beheben lassen.
      Es scheint, dass es bei OPENHAB Niemanden mehr gibt, der die Innereien tief genug versteht, um das noch zu fixen. Es gibt lange Diskussion im englischen Forum beispielweise über die Reihenfolge der Dienste und Rules, die kein Ergebnis liefert.

      Man kann nur hoffen, dass bei OPENHAB 2.0 das besser wird.

      Kommentar


        #4
        Hi klayer,

        ich gestehe, diese Vermutung hat sich mir in letzter Zeit auch aufgedrängt. Speziell seit mein Problem nach einem Reboot verschwunden zu seien scheint (ok, erst knappe 24 Std lang, aber immerhin). Wenn dem wirklich so ist, muß ich mir echt überlegen, ob es, trotz aller Vorteile, die das System hat, wirklich eine gute Idee ist, die Haustechnik darauf aufzubauen. Vielleicht muß ich auch nochmal über den Zaun gucken, was es sonst noch so gibt.

        Danke für die Information.

        Hi Tulamidan,

        ich habe die Variablen als Number definiert...das ist aber in diesem Fall auch so gewollt..der Inhalt soll 0, 1 oder 2 sein. Da ist Number doch wohl die bessere Wahl als DateTime, oder? Und es sind Variablen, keine Items...somit gibt es da keinen .state. Ich will aber nicht ausschließen, dass ich da noch was nicht richtig verstanden habe...

        Trotzdem vielen Dank für deine Anregungen. Ich habe wieder viel dazugelernt, bin allerdings auch etwas frustriert...siehe oben.

        Gruß
        Peter

        Kommentar


          #5

          Ist dein Java JDK von Oracle? Wenn nicht versuche es mal damit.

          Für globale Variablen lege ich gelegentlich ein Item an, darin speichere ich einen Wert und kann diesen auch in anderen Rules (files) verwenden. Vielleicht hilft dir das.

          Mit deinen Variablen berechnest du keine Uhrzeit, sondern realisierst nur eine Art "case", richtig? Also wenn der addierte Wert 1 oder 4 etc. ist wird eine andere Aktion getriggert? Dann hast du Recht, ein DateTime wäre hier nicht richtig.



          Kommentar


            #6
            Hi Tulamidan,

            sorry für die Frage, aber ich bin aktuell noch nicht wirklich vertraut mit Java. Was meinst du mit "Java JDK von Oracle"? Das auf dem Rechner, auf dem Openhab läuft, oder?

            Der Raspberry sagt dazu:
            java version "1.8.0"
            Java(TM) SE Runtime Environment (build 1.8.0-b132)
            Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)

            Aber nicht, ob es von Oracle ist. Wie bekomme ich das raus?

            Mit Items experimentiere ich gerade rum. Ist es richtig, das sich der ".state" nur per sendCommand ändern läßt? (sorry, bin ein wenig "old school" und hab mich mit OOP noch nicht wirklich intensiv beschäftigt) Oder gibt es auch andere Wege, z.B. einen Switch zwischen ON und OFF wechseln zu lassen?

            Und ja. Es wird nur ein Status hinterlegt. Idee war, wenn er 2 oder größer ist, dann wird die Aktion getriggert.

            Gruß

            Kommentar


              #7
              Also es gibt ein Open JDK, das ist eine opne Source Java Implementierung. Damit hat es in der Vergangenheit schon öfter Probleme gegeben. Aber dein Java ist das "klassiche" von Oracle (ehemals Sun) und sollte eigentlich in Ordnung sein.

              Ich habe z.B. ein Item: Number Sun_Azimut

              In einer Rule arbeite ich mit diesem Item z.B. wenn ich den Wert veränden möchte: Sun_Azimut.postUpdate(Wert)

              und wenn ich den Wert auslesen und damit etwas machen möchte: Sun_Azimut.state
              Zuletzt geändert von Tulamidan; 24.04.2015, 22:09. Grund: [Edit] oups da hat der Toni gut aufgepasst.

              Kommentar


                #8
                Zitat von Tulamidan Beitrag anzeigen
                Sun_Azimut..state
                Da ist ein . zuviel

                Kommentar


                  #9
                  Hallo zusammen,

                  ich hab das jetzt mal auf ITEM-only Betrieb umgestellt. Ist an manchen Stellen etwas umständlicher, funktioniert aber ganz gut. Danke für die Hilfe.

                  Gruß
                  Peter

                  Kommentar

                  Lädt...
                  X