Ankündigung

Einklappen
Keine Ankündigung bisher.

Dauer innerhalb eines Zeitraumes in items zählen

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

    Dauer innerhalb eines Zeitraumes in items zählen

    Ich wusste gar nicht so recht, wie ich den Titel formulieren soll. Aber kurz zur Frage:

    Ich habe ein Item, was den Status True oder False annehmen kann. Ableitung von diesem Item möchte ich ermitteln, wie lange es in einem bestimmten Zeitfenster auf True stand. Das Zeitfenster kann ein fester Zeitraum sein, also beispielsweise 8-16 Uhr oder auch ein gleitendes Fenster (die letzten 6 Stunden).

    Ich kriege das über items irgendwie nicht gelöst. Hat jemand sowas schon mal gemacht?

    #2
    Prinzipiell schreit das nach database Plugin.

    Alternativ könntest du mit einer Logik die last_change_age des Items in ein anderes Item schreiben und vor dem Schreiben den vorigen Wert hinzu addieren. Das wäre aber irgendwie kompliziert und das ginge auch nur mit fixen Zeitslots.

    Also -> database Plugin!

    Kommentar


      #3
      Zitat von Onkelandy Beitrag anzeigen
      Das wäre aber irgendwie kompliziert und das ginge auch nur mit fixen Zeitslots.
      Ja das war das Problem, glaube ich.

      Zitat von Onkelandy Beitrag anzeigen
      Also -> database Plugin!
      Um den richtigen Weg zu finden.... Nutze ich da einfach die Item-Funktion "sqlite: yes" und lese das dann irgendwie aus?

      Kommentar


        #4
        Du solltest das database Plugin nutzen und nicht das alte sqlite. Wenn du Vollgas geben willst, orientierst du dich daran:
        https://www.smarthomeng.de/database-...-mysql-mariadb

        Aber du kannst als driver statt mysql auch sqlite angeben! Und dann wär das recht easy und schnell. Hier findest du Infos zur Konfiguration: https://www.smarthomeng.de/user/plug.../database.html

        Die Abfrage würde dann mit der db() Funktion ablaufen. Entweder über eine Logik oder ein Eval. Würde dann zB so aussehen, wenn du wissen willst, wie lange ein Item in den letzten 24 Stunden eingeschaltet war:

        Code:
        item:
           checkdb:
                cycle: 30
               enforce_updates: True
            sa:
                knx_dpt: 1
                visu_acl: rw
                type: bool
                database@nas: yes
                cache: yes
           laufzeit_24h:
                type: num
                visu_acl: ro
                crontab: init
                eval: (sh...sa.db('on', '24h') or 0) * 1440
                eval_trigger:
                  - ..sa
                  - ..checkdb

        Kommentar


          #5
          Ich hab mal probiert das plugin zu installieren. Geht aber irgendwie nicht. Die Rechte brauche ich ja nicht, da ich ja nur sqlite nutze, richtig?

          hier der Log:

          Code:
          2019-06-03  20:10:04 ERROR    lib.plugin        Plugin 'database' from section 'database' exception: invalid literal for int() with base 10: "OrderedDict([('database'"
          Traceback (most recent call last):
            File "/usr/local/smarthome/lib/plugin.py", line 129, in __init__
              plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._gtrans)
            File "/usr/local/smarthome/lib/plugin.py", line 567, in __init__
              exec("self.plugin.__init__(smarthome{0}{1})".format("," if len(arglist) else "", argstring))
            File "<string>", line 1, in <module>
            File "/usr/local/smarthome/plugins/database/__init__.py", line 92, in __init__
              self._db = lib.db.Database(("" if prefix == "" else prefix.capitalize() + "_") + "Database", driver, Utils.string_to_list(connect))
            File "/usr/local/smarthome/lib/utils.py", line 465, in string_to_list
              er=int(er)
          ValueError: invalid literal for int() with base 10: "OrderedDict([('database'"
          Muss ich da vorher noch was installieren? Ich nutze noch SmartHomeNG 1.51.

          Kommentar


            #6
            So sieht meine plugin.yaml aus:

            Code:
            database:
                class_name: Database
                class_path: plugins.database
                driver: sqlite3
                connect:
                    - database: /usr/local/smarthome/eigene.db
                    - check_same_thread: 0
                # prefix: log
                # precision: 2

            Kommentar


              #7
              In den connect Strings dürfen keine Leerzeichen hinter den Doppelpunkten stehen!
              Viele Grüße
              Martin

              Stay away from negative people. They have a problem for every solution.

              Kommentar


                #8
                Wobei man das Problem im Plugincode durch einen Zweizeiler abfangen könnte.. Ich hab das jetzt beim ical und stateengine Plugin so gemacht, da das Problem ja immer wieder auftaucht...

                Code:
                if isinstance(connect, dict):
                                connect=list("{!s}:{!s}".format(k,v) for (k,v) in connect.items())[0]

                Kommentar


                  #9
                  Zitat von Msinn Beitrag anzeigen
                  In den connect Strings dürfen keine Leerzeichen hinter den Doppelpunkten stehen!
                  Danke für den Hinweis.

                  Zitat von Onkelandy Beitrag anzeigen
                  das Problem ja immer wieder auftaucht...
                  Da vom Grundsatz her bei allem, was man so in SmarthomeNG einträgt immer ein Leerzeichen nach dem Doppelpunkt hat, ist die Lösung natürlich logisch und sollte auch dem Standard entsprechen.

                  Kommentar


                    #10
                    So langsam wirds. Ich habe das jetzt mal getestet. Die Datenbank läuft die Daten scheinen auch eingespeichert zu werden. Allerdings kriege ich keien Ergebnisse. Woran liegt denn hier der Fehler?

                    Das hier ist ne Logik. Ergebnisse sind immer 0.

                    Code:
                    regendauer_24h = (sh.Zentral.Wetter.Wetterstation.Regen.db('on', '24h') or 0) * 1440
                    regendauer_12h = (sh.Zentral.Wetter.Wetterstation.Regen.db('on', '12h') or 0) * 720
                    regendauer_6h = (sh.Zentral.Wetter.Wetterstation.Regen.db('on', '6h') or 0) * 360
                    regendauer_3h = (sh.Zentral.Wetter.Wetterstation.Regen.db('on', '3h') or 0) * 180
                    
                    logger.info('Regendauer: 24h:{}, 12h:{}, 6h:{}, 3h:{}'.format(regendauer_24h, regendauer_12h, regendauer_6h, regendauer_3h))
                    Mir ist auch nicht ganz klar, wieso in der db-Funktion das "or 0" drin steht? Zurückgegeben werden doch nur Werte von 0.0 bis 1.0 ....

                    Kommentar


                      #11
                      Zitat von Cannon Beitrag anzeigen
                      Da vom Grundsatz her bei allem, was man so in SmarthomeNG einträgt immer ein Leerzeichen nach dem Doppelpunkt hat, ist die Lösung natürlich logisch und sollte auch dem Standard entsprechen.
                      Der Wunsch ist verständlich, trifft jedoch auf zwei grundsätzliche Probleme:
                      1. Die Optionen unter connect müssen dem Syntax des jeweiligen Datenbank Systems entsprechen (und nicht dem Syntax den SmartHomeNG verwendet)
                      2. Ein Doppelpunkt gefolgt von einem Leerzeichen hat in YAML eine spezielle Funktion. Das hat zur Folgen, dass ein String, der ein Leerzeichen nach einem Doppelpunkt enthält, bereits beim einlesen interpretiert wird und in SmartHomeNG zur Weiterverarbeitung nicht als String ankommt, sondern als dict Datenstruktur.
                      Wie in der Dokumentation beschrieben, sollte man bei Verwendung von Sonderzeichen (und ': ' ist hier das Sonderzeichen) in Strings, diese Strings in Anführungszeichen setzen. Im Beispiel des Dokuments ist das nicht geschehen, da dort kein Leerzeichen auf den Doppelpunkt folgt und somit kein 'Sonderzeichen' vorliegt.

                      Ich habe mir aber mal notiert die Parameter Prüfung strenger zu machen und in einem solchen Fall einen verständliche Fehlermeldung zu loggen. Der Parameter connect ist korrekt als list(str) definiert. Bisher wird jedoch anscheinend nur geprüft, ob connect eine Liste ist. Es wird nicht geprüft ob die Liste nur aus Strings besteht.
                      Viele Grüße
                      Martin

                      Stay away from negative people. They have a problem for every solution.

                      Kommentar


                        #12
                        Das Ergebnis kann auch "None" sein, ich glaub va. wenn das Plugin für ne Zeit nicht gelaufen ist.
                        Kontrolliere doch mal die Datenbankeinträge über das Webinterface (Admin Interface-Plugins)

                        Kommentar


                          #13
                          Zitat von Msinn Beitrag anzeigen
                          Ein Doppelpunkt gefolgt von einem Leerzeichen hat in YAML eine spezielle Funktion. Das hat zur Folgen, dass ein String, der ein Leerzeichen nach einem Doppelpunkt enthält, bereits beim einlesen interpretiert wird und in SmartHomeNG zur Weiterverarbeitung nicht als String ankommt, sondern als dict Datenstruktur.
                          Ich verstehe. Damit ist dann auch klar, wieso die Auflistung von "Parametern" bei einigen plugins einfach mit Leerzeichen aneinandergereiht werden, wie z.b. hier "alexa_actions: AdjustBrightness SetBrightness".

                          Zitat von Onkelandy Beitrag anzeigen
                          Kontrolliere doch mal die Datenbankeinträge über das Webinterface (Admin Interface-Plugins)
                          Habe ich gemacht. Da stimmt alles. allerdings ergibt das Ergebnis im Logger immer 0 aus, obwohl Regen an war:

                          Code:
                          logics.Bewaesserung Regendauer: 24h:0, 12h:0, 6h:0, 3h:0
                          Frage ich die db evtl. falsch ab?

                          Kommentar


                            #14
                            Die db Abfrage müsste schon passen. Probier mal
                            sh.Zentral.Wetter.Wetterstation.Regen.db('on', '3i') Dann findest du heraus, ob das Ergebnis 0 oder none ist. Am besten mal das Regenitem an und aus schalten, dann wieder an. Und nur wie in meiner Zeile die letzten 3 Minuten abfragen. Im WebIF auch konkret checken, was in den letzten 3 Minuten passiert ist.

                            Kommentar


                              #15
                              Msinn Ich fänds irgendwie schöner, wenn die Plugins zuerst versuchen, aus dem Dict den erwarteten Typ zu machen, nicht? Aber das ist ne Diskussion an anderer Stelle.

                              Kommentar

                              Lädt...
                              X