Ankündigung

Einklappen
Keine Ankündigung bisher.

Anwesenheitssimulation Logik

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

    #31
    Ich habe mal einige Item hinzugefügt, welche jedoch nicht automatisch erscheinen. Scheinbar wird die *.persist nur beim Start des System eingelesen?
    Nach einem Neustart war dann alles vorhanden und es hagelte Hinweismeldung, das die neuen Items nicht in der DB sind und es sind entsprechende Einträge erfolgt.
    Jetzt bricht die Rule jedoch beim Durchlauf ab, da es für einige Items ja noch keine Werte gibt.

    Kann dies abgefangen werden?? Wenn Wert NULL, dann next??

    Fehler im Log
    Code:
    -> Presence Simulation
    19:30:00.035 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: unable to find table for query, no data in database for item 'Lampe_OG_Schl
    afz_Decke'. Current number of tables in the database: 11
    19:30:00.036 [WARN ] [jdbc.internal.JdbcPersistenceService] - JDBC::query: try to generate the table for item 'Lampe_OG_Schlafz_Decke'
    19:30:00.708 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Presence Simulator: cannot invoke method public abstract org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.persistence.HistoricItem.getState() on null
    Mein Versuch
    Code:
       } else if (lamp.historicState(now.minusDays(1),"jdbc").state == NULL) {
        logInfo("Error in Presence Simulation","No Value for: {}",lamp.name)
        pushNotification("Error in Presence Simulation: ", "No Value for: " + lamp.name)
    zeigt leider keine Wirkung :-(

    Kommentar


      #32
      Das Problem dabei wird eher sein, wenn es für ein Item überhaupt keinen Datenbankeintrag gibt. Ansonsten sollte die Abfrage schon so funktionieren. Allerdings solltest Du die Abfrage auf NULL als erstes ausführen. Für in der Datenbank nicht existente Items wird es trotzdem ein [WARN] geben, bis sie einmal persistiert wurden, es gibt meines Wissens keine Möglichkeit, festzustellen, ob ein Item in einem Persistence Service bereits persistiert wurde.

      Am Rande: Es gibt noch eine elegante Methode, die Liste der Items einzuschränken:
      Code:
      gLights_auto.members.filter(f|f.state!=f.historicState(now.minusMinutes(2)).state).forEach(m|m.sendCommand(m.historicState(now.minusMinutes(2)).state))
      Die Liste der Member wird gefiltert auf solche, deren aktueller Status nicht mit dem vor 2 Minuten übereinstimmt. Alle Member, auf die dies zutrifft, werden dann auf den Zustand geschaltet.

      Kommentar


        #33
        Zitat von udo1toni Beitrag anzeigen
        Für in der Datenbank nicht existente Items wird es trotzdem ein [WARN] geben, bis sie einmal persistiert wurden, es gibt meines Wissens keine Möglichkeit, festzustellen, ob ein Item in einem Persistence Service bereits persistiert wurde.
        Das ist schade, weil dann jedes Mal die Rule abbricht :-/ und somit kann muss eine Änderung zunächst 7 Tage laufen, bevor sie genutzt werden kann.

        Kommentar


          #34
          Nein, die Rule ist abgebrochen mit einem Error, Warn sollte nicht zu einem Abbruch führen. Der Error kam vom sendCommand(null), das fängst Du ja ab...

          Kommentar


            #35
            Zitat von udo1toni Beitrag anzeigen
            Nein, die Rule ist abgebrochen mit einem Error, Warn sollte nicht zu einem Abbruch führen. Der Error kam vom sendCommand(null), das fängst Du ja ab...
            Hmm, das abfangen hat leider nicht funktioniert, auch nicht an erster Stelle in der if-Abfrage :-(
            Ich habe jetzt einfach jedem Eintrag in der DB einen Anfangswert eingetragen, welcher x Tage in der Vergangenheit liegt.
            Damit hat es funktioniert.

            Dimmer mag er hier auch nicht, da der Wert 0-100 ja kein String ist


            Deine Lösung mit der gefilterten Liste funktioniert leider auch nicht :-(
            Leicht angepasster Code:
            Code:
            gLights_auto.members.filter(f|f.state!=f.historicState(now.minusDays(1)).state.toString).forEach(m|m.sendCommand(m.historicState(now.minusDays(1)).state.toString))
            Fehler
            Code:
            -> Presence Simulation
            19:50:06.095 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Presence Simulator: cannot invoke method public abstr
            act org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.persistence.HistoricItem.getState() on null
            Da in Deiner Routine ja schon das Send-Command enthalten ist, würde ja die gesamt if-Schleife entfallen, korrekt??

            Mit der ursprünglichen Routine lief es.

            Kommentar


              #36
              Achso, Käse, ich hab hinter dem 1. state noch ein toString vergessen. Entweder man vergleicht states oder man vergleicht Strings... also für den Filter
              Code:
              (f|f.state.toString!=f.historicState(now.minusDays(1)).state.toString)
              Das sollte auch mit Dimmern funktionieren.

              Kommentar


                #37
                Zitat von udo1toni Beitrag anzeigen
                Achso, Käse, ich hab hinter dem 1. state noch ein toString vergessen. Entweder man vergleicht states oder man vergleicht Strings... also für den Filter
                Code:
                (f|f.state.toString!=f.historicState(now.minusDays(1)).state.toString)
                Das sollte auch mit Dimmern funktionieren.
                Den einen Punkt habe ich dann auch übersehen

                So langsam wird es dann smart

                Ich habe noch die Datenbank ergänzt. da jdbc bei mir nicht default ist und Logging, bzw eine Prowl Notification, damit die Abwesenheit genossen werden kann
                Code:
                rule "Presence Simulator"
                when
                  Time cron "0 */1 * * * ?"
                then
                  // If nobody is home and lights away mode is auto or if mode is on
                  if (Absence.state == ON) {
                    println("-> Presence Simulation")
                    gLights_auto.members.filter(f|f.state.toString!=f.historicState(now.minusDays(7),"jdbc").state.toString).forEach[m|
                      Thread::sleep((2000 + Math::random * 1000.0).intValue)
                      m.sendCommand(m.historicState(now.minusDays(7),"jdbc").state.toString)
                      logInfo("Presence Simulation","Restore {} to historic state: {}",m.name, m.historicState(now.minusDays(7),"jdbc").state)
                      pushNotification("Presence Simulation: ", "Restore " + m.name + " to historic state: " + m.historicState(now.minusDays(7),"jdbc").state)
                    ]
                 }
                end

                Kommentar


                  #38
                  Hallo zusammen,

                  ich bin dabei, mich mit openhab auseinander zu setzen, und möchte gerne diese Anwesenheit Simulation verwenden.

                  gibt es eine Sitemap auch?

                  meine Items Datei sieht so aus:
                  Code:
                  Group:Switch:OR(ON, OFF) gLights_auto
                  Switch Licht_EG_Windfang        "Licht Windfang"        (gLights_auto)      [ "Lighting" ]  {bticino="if=webserver;who=1;what=0;where=28"}
                  Switch Licht_OG_Flur            "Licht Flur"            (gLights_auto)          [ "Lighting" ]  {bticino="if=webserver;who=1;what=0;where=29"}
                  die Rule Datei ist die im letzen Post von JoergA.

                  Ich bekomme den Fehler:
                  Code:
                  [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Presence Simulator': The name 'Absence' cannot be resolved to an item or type; line 6, column 7, length 7
                  in einen anderen Thread habe ich das gelesen von JoergA.
                  Den verwendeten Absence.state setze ich, sobald die Rollladen herunter fahren, was über einen Helligkeitswert gesteuert ist und wenn das Haus im Ghost-Mode ist. Ghost Mode bedeutet => Keiner zu Hause und dazu nutze ich z.B. das Fritzbox Binding und prüfe auf unsere iPhones. Wenn dann jemand von und nach Hause kommt, wird der Ghost-Mode deaktiviert und eine laufende Simulation wird automatisch beendet
                  Könntet ihr mir dabei helfen wie ich das umsetze,ich habe aber keine Fritzbox.

                  mfg
                  Pascal

                  Kommentar


                    #39
                    Na, eignetlich steht es im Klartext da...
                    Der Name Absence kann nicht als Item oder Typ aufgelöst werden. Absence wird in der Rule als Item verwendet (Absence.state == ON)
                    Es sieht also so aus, dass Du kein Item Absence definiert hast.

                    Wenn Du keine automatische Funktion für die Abwesenheitserkennung hast, kannst Du (vielleicht auch übergangsweise, bis Du es automatisiert hast) auf der Sitemap einen Schalter dafür anlegen. Du musst lediglich ein Swicht Item mit dem Namen Absence anlegen:
                    Code:
                    Switch Absence "Abwesenheit"

                    Kommentar


                      #40
                      Hallo udo1toni,

                      danke für deine Antwort.

                      Kannst du mir noch sagen wie die Sitemap genau aussehen soll, bzw. kann ich anstatt dem Fritzbox Binding das Network Binding hernehmen?
                      Wenn Ja wie wäre der Code dementsprechend anzupassen?

                      Bei Switch Absence "Abwesenheit" kommt nun dieser Fehler:
                      Code:
                      2020-10-26 16:05:26.469 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Absence' for widget org.eclipse.smarthome.model.sitemap.sitemap.Switch
                      
                      2020-10-26 16:05:26.471 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item for widget org.eclipse.smarthome.model.sitemap.sitemap.Switch
                      
                      2020-10-26 16:05:26.475 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Absence' for widget org.eclipse.smarthome.model.sitemap.sitemap.Switch
                      
                      2020-10-26 16:05:26.477 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Absence' for widget org.eclipse.smarthome.model.sitemap.sitemap.Switch
                      
                      2020-10-26 16:05:26.481 [ERROR] [ui.internal.items.ItemUIRegistryImpl] - Cannot retrieve item 'Absence' for widget org.eclipse.smarthome.model.sitemap.sitemap.Switch
                      Hier noch meine Sitemap:
                      Code:
                      sitemap PresenceSimulator label="Presence Simulator"
                      {
                        Frame {
                      
                      
                          Switch item=Absence label="Anwesenheit"
                          //Switch        item=gLights_auto   label="Regel"                                       mappings=[ON="aktiv", OFF="aus"] icon="alarm"
                          //Switch        item=Absence    label="Regel"                                           mappings=[ON="aktiv", OFF="aus"] icon="alarm"
                          //Switch Absence "Abwesenheit"
                              }
                        
                      }
                      Nun bin ich schon einen Schritt weiter -> der Fehler von oben kommt nicht mehr aber nun dieser:
                      Code:
                      2020-10-27 18:03:00.057 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Presence Simulator': cannot invoke method public abstract org.eclipse.smarthome.core.types.State org.eclipse.smarthome.core.persistence.HistoricItem.getState() on null


                      Danke im Voraus.

                      mfg
                      Pascal
                      Zuletzt geändert von cali92; 27.10.2020, 18:04.

                      Kommentar


                        #41
                        Hast Du denn die Items persistiert? Die Rule nutzt jdbc als Persistence Service, das heißt im Beispiel ist es eine SQL-Datenbank (welche auch immer...)

                        Kommentar


                          #42
                          Hallo udo1toni,

                          Nein meine Items sind nicht persistiert.
                          Da muss ich mir noch eine Doku dazu suchen wie das geht, oder hast du für das oben genannte Beispiel eine Anleitung?

                          Ich habe Parallel im https://openhabforum.de/viewtopic.php?f=15&t=4201 einen Thread eröffnet, weil ich eine einfache Rule nicht zum laufen bringe


                          Danke für deinen Input.

                          mfg
                          Pascal



                          Kommentar


                            #43
                            Grundsätzlich ist das ja weiter oben im Thread erläutert. Ich muss allerdings darauf hinweisen, dass der Code von 2017 stammt. In der Zwischenzeit hat sich das Rad etwas weiter gedreht und der Code sollte vermutlich noch etwas überarbeitet werden.

                            Kommentar

                            Lädt...
                            X