Ankündigung

Einklappen
Keine Ankündigung bisher.

Anwesenheitssimulation Logik

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

    #16
    Zitat von JoergA Beitrag anzeigen

    Bei mir funktioniert dies bisher, Häher nutze ich dies gerne bei der Implemenitierung neuer Funktionen ;-) vor allem, weil der Eintrag in weiß (alles andere eher grau) dargestellt ist. So fällt der direkt auf.

    Werde mich dann mal dran geben, das Group Item anzulegen.
    Jetzt gibt es noch eine Meldung => Type mismatch: cannot convert from State to String
    bei
    Code:
    [SIZE=2]lamp.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]([U]lamp.[/U][/SIZE][U][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]historicState[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]([I]now[/I].minusDays([/SIZE][SIZE=2][COLOR=#7d7d7d][SIZE=2][COLOR=#7d7d7d]1[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])).state[/SIZE][/U][SIZE=2])[/SIZE]

    Kommentar


      #17
      Vermutlich gibt es (noch) keine gültigen Daten (Du persistierst ja erst seit gestern, oder?). Du könntest es spaßeshalber mal mit .minusHours(1) versuchen, da müsste es ja gültige daten geben. Wenn es immer noch nicht funktioniert: hast Du jdbc auch als default persistence gesetzt? ansonsten verwende lieber
      Code:
      lamp.sendCommand(lamp.historicState(now.minusDays(1),"jdbc").state)
      EDIT: Achso... mit
      Code:
      logInfo("myrule","historic state {}",lamp.historicState(now.minusDays(1),"jdbc").state)
      solltest Du auch im log was dazu sehen. Falls dann da NULL steht, klappt irgendwas nicht...
      Zuletzt geändert von udo1toni; 31.08.2017, 13:32.

      Kommentar


        #18
        Da ich noch andere DB's nutze, habe ich die default DB nicht verändert. JDBC ist nun der 3. Service, daher habe ich nun wie oben angegeben angepasst.
        Leider bleibt die Fehlermeldung. Ich habe 4 Lampen persistiert und mehrfach geschaltet. In der DB sind auch diverse Einträge, alle mit Item1, Item2 usw.

        Fehlermeldung aus Log
        Code:
        -> Auto Light Check <-
        -> Auto Light Check (Absence) <-
        20:26:00.006 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
        20:26:00.009 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Presence Simulator: An error occurred during the script execution: The name 'lamp' cannot be resolved to an item or type.
        Code Schnipsel
        Code:
        rule "Presence Simulator"
        when
         Time cron "0 */2 * * * ?"
        then
         println("-> Auto Light Check <-")
         logInfo("LightsAuto", "Auto Light Check")
         // If nobody is home and lights away mode is auto or if mode is on
         if (Absence.state == ON) {
          println("-> Auto Light Check (Absence) <-")
          logInfo("Auto Light Check","historic state {}", lamp.historicState(now.minusHours(1),"jdbc").state)
          gLights_auto.members.forEach [ lamp |
           lamp.sendCommand(lamp.historicState(now.minusHours(1),"jdbc").state)
           println(lamp)
           ]
         }
        end
        Aus dem Designer
        Code:
        Multiple markers at this line
        - The word 'jdbc' is not correctly spelled
        - Type mismatch: cannot convert from State to String

        Kommentar


          #19
          Ach, käse... da hab ich nicht aufgepasst. das logInfo gehört natürlich in das Lambda rein:
          Code:
          gLights_auto.members.forEach [ lamp |
             logInfo("Auto Light Check","historic state of {} : {}"lamp.name, lamp.historicState(now.minusHours(1),"jdbc").state)  
             lamp.sendCommand(lamp.historicState(now.minusHours(1),"jdbc").state)
             println(lamp)    
          ]
          EDIT: Ich hab noch den Namen des Items mit eingebaut...
          Zuletzt geändert von udo1toni; 31.08.2017, 21:12.

          Kommentar


            #20
            Zitat von udo1toni Beitrag anzeigen
            Ach, käse... da hab ich nicht aufgepasst. das logInfo gehört natürlich in das Lambda rein:
            Es ist wohl eher Käse, dass dies für mich im Moment Böhmische Dörfer sind

            für die Unterstützung!!

            Also, es geht zumindest voran, auch wenn noch nichts geschaltet wird
            -> Auto Light Check <-
            22:24:00.012 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
            -> Auto Light Check (Absence) <-
            22:24:00.020 [INFO ] [rthome.model.script.Auto Light Check] - historic state ON
            22:24:00.026 [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.HistoricIte m.getState() on null

            Da der Status ON war, habe ich mal ausgeschaltet und nach dem nächsten Zyklus war es dann korrekt in der DB. Diese scheint also zu laufen.
            Derzeit habe ich mal nur 1 Item persistiert, werde jetzt mal ein weiteres hinzu packen.

            -> Auto Light Check <-
            22:28:00.022 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
            -> Auto Light Check (Absence) <-
            22:28:00.120 [INFO ] [rthome.model.script.Auto Light Check] - historic state OFF
            22:28:00.135 [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.HistoricIte m.getState() on null
            Mal (wieder) blöd gefragt => Ein item lamp habe ich ja nicht, dieses wird ja nur zur Laufzeit genutzt, oder brauche ich das auch?


            Gruß,
            Jörg

            Nachtrag
            Auch wenn ich jetzt 3 Items in die Gruppe aufgenommen habe, bleibt ein ERROR und es werden nicht 3 Einträge erstellt?!?!
            Code:
            -> Auto Light Check <-
            22:42:00.008 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
            -> Auto Light Check (Absence) <-
            22:42:00.023 [INFO ] [rthome.model.script.Auto Light Check] - historic state ON
            22:42:00.031 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Presence Simulator: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(org.eclipse.smarthome.core.items.Item,java.lang.String) on instance: null
            Zuletzt geändert von JoergA; 31.08.2017, 21:42.

            Kommentar


              #21
              Kann sein, dass das Leerzeichen stört. Versuch mal
              Code:
              gLights_auto.members.forEach[lamp|
                  logInfo("Auto Light Check","historic state of {} : {}"lamp.name, lamp.historicState(now.minusHours(1),"jdbc").state)
                  lamp.sendCommand(lamp.historicState(now.minusHours(1),"jdbc").state)
                  println(lamp)
              ]
              lamp ist kein Item, es ist eine Variable vom Typ Item (durch Vererbung). Das .members.forEach durchläuft die Gruppe und weist der Variablen lamp bei jedem Durchgang jeweils den nächsten member zu, also jedes einzelne Item, welches zur Gruppe gLights_auto gehört. So kann der Code innerhalb der [] sich auf ein Item beziehen, wirkt aber nacheinander auf jedes einzelne Gruppenmitlied.
              Zuletzt geändert von udo1toni; 31.08.2017, 23:29.

              Kommentar


                #22
                Guten Morgen ;-)

                Ich habe jetzt noch einmal ein wenig getestet und die folgende Zeile verursacht das Problem und sorgt für den Abbruch der members.forEach-Schleife
                Code:
                [SIZE=10px]lamp.[/SIZE][I][SIZE=10px][COLOR=#AB3000][SIZE=10px][COLOR=#AB3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=10px]([U]lamp.[/U][/SIZE][U][I][SIZE=10px][COLOR=#AB3000][SIZE=10px][COLOR=#AB3000]historicState[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=10px]([I]now[/I].minusMinutes([/SIZE][SIZE=10px][COLOR=#7D7D7D][SIZE=10px][COLOR=#7D7D7D]2[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=10px]),[/SIZE][SIZE=10px][COLOR=#2A00FF][SIZE=10px][COLOR=#2A00FF]"jdbc"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=10px]).state[/SIZE][/U][SIZE=10px])[/SIZE]
                Error
                Code:
                -> Auto Light Check <-
                08:10:00.010 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
                -> Auto Light Check (Absence) <-
                08:10:00.035 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Wand : OFF
                08:10:00.080 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule Presence Simulator: Could not invoke method: org.ecli
                pse.smarthome.model.script.actions.BusEvent.sendCommand(org.eclipse.smarthome.core.items.Item,java.lang.String) on instance: null
                Wenn ich Zeile mit SendCommand auskommentiere, läuft zumindest die Schleife durch und der Wert gelesen :-)
                Code:
                -> Auto Light Check <-
                -> Auto Light Check (Absence) <-
                08:00:00.019 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
                08:00:00.039 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Wand : OFF
                08:00:00.044 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Decke : ON
                08:00:00.048 [INFO ] [rthome.model.script.Auto Light Check] - historic state Steckd_EG_Flur_Wohnz : ON
                Noch einmal der derzeitige Code :-)
                Items
                Code:
                [SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][B]Group[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]:[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]Switch[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2]:[/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]OR[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2](ON, OFF) gLights_auto[/SIZE]
                
                [SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][B]Switch[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Lampe_EG_Deko_Wand [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Schrankleuchten"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (gLights_auto, EG_Wohnen, EG_Essen, Lampen) { knx=[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"5/5/1"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] }[/SIZE]
                [SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][B]Switch[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Lampe_EG_Deko_Decke [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Deckenspots"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (gLights_auto, EG_Wohnen, EG_Essen, Lampen) { knx=[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"5/5/2+6/6/2"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] }[/SIZE]
                [SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][B]Switch[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Steckd_EG_Flur_Wohnz [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Steckdose Wohnzimmer"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] (gLights_auto, EG_Flur, Lampen) { knx=[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"5/5/3"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] }[/SIZE]
                Rule
                Code:
                [SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055][B]rule[/B][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Presence Simulator"[/COLOR][/SIZE][/COLOR][/SIZE]
                [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]  when[/COLOR][/SIZE][/COLOR][/SIZE][/B]
                [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]    Time[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]cron[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"0 */2 * * * ?"[/COLOR][/SIZE][/COLOR][/SIZE]
                [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]  then[/COLOR][/SIZE][/COLOR][/SIZE][/B]
                [SIZE=2][I]    println[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"-> Auto Light Check <-"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
                [SIZE=2][I]    logInfo[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"LightsAuto"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Auto Light Check"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
                [SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]    // If nobody is home and lights away mode is auto or if mode is on[/COLOR][/SIZE][/COLOR][/SIZE]
                [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]    if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] ([/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]Absence[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2].state == [/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]ON[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]) {[/SIZE]
                [SIZE=2][I]      println[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"-> Auto Light Check (Absence) <-"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
                [I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]      gLights_auto[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2].members.forEach[lamp|[/SIZE]
                [SIZE=2][I]        logInfo[/I]([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Auto Light Check"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"historic state {} : {}"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2],lamp.name, lamp.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]historicState[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]([I]now[/I].minusMinutes([/SIZE][SIZE=2][COLOR=#7d7d7d][SIZE=2][COLOR=#7d7d7d]2[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]),[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"[U]jdbc[/U]"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]).state)[/SIZE]
                [SIZE=2]        lamp.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]([U]lamp.[/U][/SIZE][U][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]historicState[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]([I]now[/I].minusMinutes([/SIZE][SIZE=2][COLOR=#7d7d7d][SIZE=2][COLOR=#7d7d7d]2[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]),[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"jdbc"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]).state[/SIZE][/U][SIZE=2])[/SIZE]
                [SIZE=2]]
                [/SIZE][SIZE=2]}[/SIZE]
                [B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]end[/COLOR][/SIZE][/COLOR][/SIZE][/B]
                Zuletzt geändert von JoergA; 01.09.2017, 07:22.

                Kommentar


                  #23
                  Code:
                  [SIZE=2]lamp.[/SIZE][I][SIZE=2][COLOR=#ab3000][SIZE=2][COLOR=#ab3000]sendCommand[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2]([/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]OFF[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2])[/SIZE]
                  funktioniert

                  Code:
                  -> Auto Light Check <-
                  -> Auto Light Check (Absence) <-
                  11:56:00.010 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
                  11:56:00.022 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Wand : OFF
                  11:56:00.027 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Decke : OFF
                  11:56:00.033 [INFO ] [rthome.model.script.Auto Light Check] - historic state Steckd_EG_Flur_Wohnz : OFF
                  11:56:00.080 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'Lampe_EG_Deko_Wand' received command OFF
                  11:56:00.094 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'Lampe_EG_Deko_Decke' received command OFF
                  11:56:00.106 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'Steckd_EG_Flur_Wohnz' received command OFF

                  Kommentar


                    #24
                    Das seltsame ist ja, dass er in der Logzeile sehr wohl einen gültigen State ausgibt - wie kann er dann eine Zeile später einen Fehler schmeißen? Nun gut, warum auch immer, hänge mal hinter das .state noch ein .toString, so dass die Zeile dann so aussieht:
                    Code:
                    lamp.sendCommand(lamp.historicState(now.minusMinutes(2),"jdbc").state.toString)

                    Kommentar


                      #25
                      Zitat von udo1toni Beitrag anzeigen
                      Das seltsame ist ja, dass er in der Logzeile sehr wohl einen gültigen State ausgibt - wie kann er dann eine Zeile später einen Fehler schmeißen? Nun gut, warum auch immer, hänge mal hinter das .state noch ein .toString, so dass die Zeile dann so aussieht:
                      Code:
                      lamp.sendCommand(lamp.historicState(now.minusMinutes(2),"jdbc").state.toString)

                      Code:
                      -> Auto Light Check <-
                      -> Auto Light Check (Absence) <-
                      12:58:09.951 [INFO ] [se.smarthome.model.script.LightsAuto] - Auto Light Check
                      12:58:09.979 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Wand : OFF
                      12:58:10.006 [INFO ] [rthome.model.script.Auto Light Check] - historic state Lampe_EG_Deko_Decke : OFF
                      12:58:10.038 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'Lampe_EG_Deko_Wand' received command OFF
                      12:58:10.050 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'Lampe_EG_Deko_Decke' received command OFF
                      12:58:10.079 [INFO ] [rthome.model.script.Auto Light Check] - historic state Steckd_EG_Flur_Wohnz : OFF
                      12:58:10.107 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'Steckd_EG_Flur_Wohnz' received command OFF
                      As always => Danke für die Unterstützung und vor Allem Geduld

                      Dann werde ich das mal über das Wochenende einem Feldversuch unterziehen und anschließend als Code-Schnipsel zusammenfassen.

                      Viele Grüße
                      Jörg

                      Kommentar


                        #26
                        Der erste Test gestern hat - zumindest mit den Test-Lampen - schon sehr gut funktioniert und die Werte des gestrigen Tages wurden ordentlich - zyklisch alle 5 Minuten - abgerufen.

                        Eine Frage noch zur Datenbank, da diese dann ja mit der Zeit vollläuft. Kann ich die Werte auf z.B. 30 Tage beschränken, oder muss ich in regelmäßigen Abständen manuell Daten aus der DB löschen und diese komprimieren?

                        Kommentar


                          #27
                          Zitat von udo1toni Beitrag anzeigen
                          Natürlich kann man darüber nachdenken, die Rule eher jede Minute aufzurufen, um auch kurze Schaltänderungen zu simulieren. Außerdem könnte man noch eine gewisse Zufälligkeit mit einbauen, also sowas wie
                          Code:
                          var Integer RandomInterval = ((Math::random() * 61).doubleValue).intValue
                          als Zufallsgenerator, und das dann zusätzlich zum Schaltzeitpunkt dazu rechnen, entweder per createTimer, oder indem man es im historicState verwendet. Dann ginge das Licht nicht immer zur vollen Minute an oder aus.
                          So, versuche mich parallel an dieser Kür. Wenn ich durch die Rule laufe, ist ja der Schaltpunkt schon definiert und es wird nur der historicstate abgefragt. Habe im Moment ein "Black-Hole" wie Du mit diesem Wert den Schaltpunkt beeinflussen kannst.



                          Kommentar


                            #28
                            Mit SQLite kenne ich mich ehrlich gesagt nicht aus, aber ich behaupte mal "ja" Du musst Dich um das aufräumen der Datenbank selbst kümmern.
                            Auch an dieser Stelle wäre influx natürlich wesentlich bequemer, da man dort tatsächlich eine Aufbewahrungszeit definieren kann, nach der die Datenbank die Daten selbständig löscht. Die Größe der Datenbank hängt dann nur noch davon ab, wieviele Daten im fraglichen Zeitraum gespeichert werden, in der Tendenz wird die Datenbankgröße also immer mehr oder weniger gleich bleiben, mit kleinen Schwankungen nach oben oder unten.

                            Wegen Randomisierung: Du kannst den echten Schaltzeitpunkt nach hinten schieben, indem Du einen Timer nutzt, der dann schaltet. also sowas:
                            Code:
                            rule"Presence Simulator"  
                            when
                               Time cron"0 0/2 * * * ?"  
                            then
                                println("-> Auto Light Check <-")
                                logInfo("LightsAuto", "Auto Light Check")
                                // If nobody is home and lights away mode is auto or if mode is on
                                if (Absence.state == ON) {
                                    println("-> Auto Light Check (Absence) <-")
                                    gLights_auto.members.forEach[lamp|
                                        createTimer(now.plusSeconds(((Math::random() * 119).doubleValue).intValue, [
                                            logInfo("Auto Light Check","switch state of {} to {}",lamp.name, lamp.historicState(now.minusMinutes(2),"jdbc").state)
                                            lamp.sendCommand(lamp.historicState(now.minusMinutes(2),"jdbc").state.toString)
                                        ])
                                    ]
                                }
                            end
                            Letztlich wird also die Rule für jeden Member zu einem anderen Zeitpunkt nachschauen, was vor 2 Minuten war.
                            Das sind dann natürlich in der Tendenz viele Timer.
                            Andersrum ginge auch, dann muss man halt den Status in einer Variablen pro Lampe sichern, weil der Code innerhalb des Timers ja erst zum eingestellten Zeitpunkt ausgeführt wird. Kann man mit einem Array machen, welches in Abhängigkeit der Anzahl der Member erstellt wird.

                            Kommentar


                              #29
                              Da wir 15-18 Lampen in der Gruppe haben werden, finde ich die ganzen Timer eher nachteilig und rechenintensiv?
                              Mir kam gerade noch folgende Idee, da wir die Lampen ja nicht alle gleichzeitig ein/aus schalten, habe ich eine kleine Verzögerung eingebaut, aber nur bei zu schaltenden Items.
                              Code:
                              rule "Presence Simulator"
                              when
                                Time cron "0 */5 * * * ?"
                              then
                                println("-> Auto Light Check")
                               // If nobody is home and lights away mode is auto or if mode is on
                                if (Absence.state == ON) {
                                  println("-> Auto Light Check (Absence)")
                                  gLights_auto.members.forEach[lamp|
                                  if (lamp.historicState(now.minusDays(1),"jdbc").state == lamp.state) {
                                    pushNotification("No Simulation von: " + now.minusDays(1), "historic state " + lamp.name + " : " + lamp.historicState(now.minusDays(1),"jdbc").state)
                                  } else {
                                    Thread::sleep((2000 + Math::random * 1000.0).intValue)
                                    lamp.sendCommand(lamp.historicState(now.minusDays(1),"jdbc").state.toString)
                                    pushNotification("Simulation von: " + now.minusDays(1), "historic state " + lamp.name + " : " + lamp.historicState(now.minusDays(1),"jdbc").state)
                                  }
                                ]
                              }
                              end
                              Was hält Du/ihr von dieser Variante, oder welche Nachteile könnte es geben?

                              Kommentar


                                #30
                                Ja, es ist ohnehin gut, nur dann zu schalten, wenn das auch notwendig ist.

                                Kommentar

                                Lädt...
                                X