Ankündigung

Einklappen
Keine Ankündigung bisher.

einfache Anwesenheitssimulation

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

    einfache Anwesenheitssimulation

    Hallo zusammen,

    ich habe mich mal ein einer ganz einfachen Simulation der Anwesenheit versucht, erhalte aber einen Fehler in der Ausführung.

    Code:
    rule PresenceSimulator
    when
     Time cron "0 30 22 ? * MON" or
     Time cron "0 34 22 ? * TUE" or
     Time cron "0 02 23 ? * WED" or
     Time cron "0 17 22 ? * THU" or
     Time cron "0 58 22 ? * FRI" or
     Time cron "0 27 23 ? * SAT" or
     Time cron "0 09 22 ? * SUN"
    then
     Wochentag.postUpdate(now.getDayOfWeek)
     switch (Wochentag) {
      case (1): {pushNotification("Note", "Monday")}
      case (2): {pushNotification("Note", "Tuesday")}
      case (3): {pushNotification("Note", "Wednesday")}
      case (4): {pushNotification("Note", "Thursday")}
      case (5): {pushNotification("Note", "Friday")}
      case (6): {pushNotification("Note", "Saturday")}
      case (7): {pushNotification("Note", "Sunday")}
     }
    end
    Fehler im Log
    Code:
    2017-04-03 22:35:00.256 [ERROR] [.o.m.r.i.engine.ExecuteRuleJob] - Error during the execution of rule PresenceSimulator
    java.lang.RuntimeException: The name 'Wochentag' cannot be resolved to an item or type.
     at org.openhab.model.script.interpreter.ScriptInterpreter.internalFeatureCallDispatch(ScriptInterpreter.java:67) ~[na:na]
     at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAbstractFeatureCall(XbaseInterpreter.java:658) ~[na:na]
     at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source) ~[na:na]
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
     at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
     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._evaluateMemberFeatureCall(XbaseInterpreter.java:545) ~[na:na]
     at sun.reflect.GeneratedMethodAccessor52.invoke(Unknown Source) ~[na:na]
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
     at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
     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.GeneratedMethodAccessor65.invoke(Unknown Source) ~[na:na]
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_66]
     at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_66]
     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.model.rule.internal.engine.ExecuteRuleJob.execute(ExecuteRuleJob.java:55) ~[na:na]
     at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-all-2.1.7.jar:na]
     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-all-2.1.7.jar:na]
    Ich habe schon versucht die Variable Wochentag als Nummer zu deklarieren, aber das ging auch nicht :-(

    Gruß,
    Jörg

    #2
    Wenn Wochentag ein Item ist, musst Du switch(Wochentag.state) verwenden. Falls Wochentag aber eine Variable ist, musst Du sie definieren, also z.B. var int Wochentag = now.getDayOfWeek

    Kommentar


      #3
      Zitat von udo1toni Beitrag anzeigen
      Wenn Wochentag ein Item ist, musst Du switch(Wochentag.state) verwenden. Falls Wochentag aber eine Variable ist, musst Du sie definieren, also z.B. var int Wochentag = now.getDayOfWeek
      Hallo Udo,

      nur noch mal für Dummies wie mich ;-)

      Sollte ich var int Wochentag = now.getDayOfWeek in der *.rules oben vor allen Regeln definieren?
      Und kann dann in der Regel Wochentag.postUpdate(now.getDayOfWeek) genutzt werden??
      Die *.Rules wird aber doch zyklisch durchlaufen und somit würde die Variabel immer neu definiert?
      (Oder läuft dieser Teil nur 1x??)

      Würde dies als Variabel halten wollen, da ich dies nur hier in der Regel benutze.

      Viele Grüße,
      Jörg

      Kommentar


        #4
        Naja, das kommt darauf an, was Du erreichen willst. Wenn Du eine globale Variable haben möchtest, musst Du die zu Beginn des Rule Files definieren (aber Du kannst sie nur mit einem statischen Wert füllen, also z.B. 0 oder 4711) diese Variable behält ihren Wert, solange er nicht aktiv verändert wird oder openHAB beendet wird. Sie ist in jeder Rule dieses Rule Files nutzbar. Wenn das Rule File neu geladen wird, wird auch die Variable neu initialisiert.
        Oder Du definierst die Variable innerhalb der Rule, dann kannst Du sie beliebig initialisieren, z.B. auch mit now.getDayOfWeek.
        Oder Du nutzt ein Item, das ist systemweit verwendbar, initialisieren musst Du dann halt mit einer Rule, die täglich aufgerufen wird. Im vorliegenden Fall würde ich komplett auf die Variable verzichten, now.getDayOfWeek ist auch nicht viel länger und irgendwo muss die Variable ja initialisiert werden.

        Ach so...

        postUpdate ist ausschließlich für Items nutzbar, egal ob nun als Action oder als Methode. Variablen bekommen ihren Wert zugewiesen mit
        Code:
        Variable = Wert
        Zuletzt geändert von udo1toni; 04.04.2017, 16:44.

        Kommentar


          #5
          So, habe dies dann mal umgeändert
          Code:
          rule PresenceSimulator
          when
           Time cron "0 30 22 ? * MON" or
           Time cron "0 35 22 ? * MON" or
           Time cron "0 34 22 ? * TUE" or
           Time cron "0 02 23 ? * WED" or
           Time cron "0 17 22 ? * THU" or
           Time cron "0 58 22 ? * FRI" or
           Time cron "0 27 23 ? * SAT" or
           Time cron "0 09 22 ? * SUN"
          then
           var int Wochentag = now.getDayOfWeek
           switch (Wochentag) {
            case (1): {pushNotification("Note", "Monday")}
            case (2): {pushNotification("Note", "Tuesday")}
            case (3): {pushNotification("Note", "Wednesday")}
            case (4): {pushNotification("Note", "Thursday")}
            case (5): {pushNotification("Note", "Friday")}
            case (6): {pushNotification("Note", "Saturday")}
            case (7): {pushNotification("Note", "Sunday")}
           }
          end
          Es funktioniert zwar, aber:

          Vor der Zeile: var int Wochentag = now.getDayOfWeek
          ist ein rotes x mit dem Kommentar:
          Multiple markers at this line
          - Couldn't resolve reference to JvmIdentifiableElement 'getDayOfWeek'.
          - Couldn't resolve reference to JvmIdentifiableElement 'now'.

          Vor der Zeit: switch (Wochentag) {
          ist ein grauer Kreis mit einem X

          Gerade den grauen Kreis habe ich so noch nicht gesehen?!

          import org.joda.time.DateTime ist auch hier enthalten, ist die gleiche *.rules ;-)

          Gruß,
          Jörg

          Kommentar


            #6
            Also, Symptom ist, dass der Designer now anmeckert, ansonsten funktioniert es aber. Zuallererst ist also Entspannung angesagt

            Eventuell hast Du an irgendeiner Stelle in der Rule-Datei ein Zeichen, über das der Designer stolpert. Blöderweise kann das sehr gut auch ein unsichtbares Zeichen sein. Eine gute Variante, das herauszufinden, wäre, die Rule-Datei z.B. mit Notepad++ zu öffnen und dort einzustellen, dass alle (auch unsichtbare) Zeichen angezeigt werden.
            Gemein dabei ist, dass der Fehler wirklich irgendwo in der gesamten Datei sein kann.

            Das graue x steht für einen Fehler, der beseitigt wurde, ist also gut.


            Kommentar


              #7
              Hmmm

              ich habe mir Notepad ++ geladen und alle Zeichen anzeigen lassen, aber: Da ist nichts zu sehen, was nicht da hin gehört

              Das graue X erscheint immer wieder, wie sehe ich denn, was beseitigt wurde, damit ich dies direkt richtig machen kann?

              Kommentar


                #8
                Du hattest an dieser Stelle einen Fehler (die dem System unbekannte Variable), seit die Variable definiert ist, gibt es dort keinen Fehler mehr.

                Falls Du zu 100% sicher bist, dass die Rule-Datei keinerlei Fehler aufweist, kannst Du versuchen, den Code päckchenweise in eine neue Ruledatei zu kopieren, wenn dann plötzlich in der neuen Rule Datei wieder now angemeckert wird, löschst Du das zuletzt kopierte Codepäckchen und überspringst es. Zum Schluss untersuchst Du das Codepäckchen, welches den Fehler verursacht. Meistens ist es wirklich eine doofe Kleinigkeit, die den Designer aus dem Tritt bringt.

                Kommentar


                  #9
                  Ich habe jetzt mal nur diese Routine in eine neue Datei geschrieben (siehe Anhang)

                  Zunächst, beim öffnen, sieht alles gut aus.
                  1x gespeichert und "now" wird angemeckert

                  Code:
                  import org.openhab.core.library.types.*
                  import org.openhab.core.persistence.*
                  import org.openhab.model.script.actions.*
                  // import org.openhab.model.script.actions.Timer
                  import org.joda.time.DateTime.*
                  
                  rule PresenceSimulator
                  when
                   Time cron "0 30 20 ? * MON" or
                   Time cron "0 34 20 ? * TUE" or
                   Time cron "0 02 20 ? * WED" or
                   Time cron "0 17 20 ? * THU" or
                   Time cron "0 58 20 ? * FRI" or
                   Time cron "0 27 20 ? * SAT" or
                   Time cron "0 09 20 ? * SUN"
                  then
                   var int Wochentag = now.getDayOfWeek
                   switch (Wochentag) {
                    case (1): {(pushNotification("Info", "Monday Abwesenheitsimulation !!"))}
                    case (2): {(pushNotification("Info", "Tuesday Abwesenheitsimulation !!"))}
                    case (3): {(pushNotification("Info", "Wednesday Abwesenheitsimulation !!"))}
                    case (4): {(pushNotification("Info", "Thursday Abwesenheitsimulation !!"))}
                    case (5): {(pushNotification("Info", "Friday Abwesenheitsimulation !!"))}
                    case (6): {(pushNotification("Info", "Saturday Abwesenheitsimulation !!"))}
                    case (7): {(pushNotification("Info", "Sunday Abwesenheitsimulation !!"))}
                   }
                  end
                  Angehängte Dateien

                  Kommentar


                    #10
                    So, bin gerade noch einmal auf den 1.7.1er Snapshot zurück und siehe da => Alle OK

                    Dann wieder zurück auf 1.8.3 mit gleichen Konfig Dateien => Fehler mit now.

                    Scheint also ein Bug im Snapshop zu sein?? Oder kann ich etwas vergessen haben???
                    Habe alle AddOns aus dem neuen Snapshot genommen und nehme immer den Designer von der gleichen Version wie die Runtime.

                    Kommentar


                      #11
                      Ja, das kann schon sein. ich hab hier schon ewig nicht mehr upgedatet, weil ich den Umstieg auf OH2 vorbereite. Bei einer älteren Installation kommt da so einiges zusammen, was vorher getestet werden will, und Urlaub ≠ Freizeit, meine bessere Hälfte hat da immer einen Stapel wichtigerer Arbeit liegen...

                      Kommentar

                      Lädt...
                      X