Ankündigung

Einklappen

Hinweis

Die Forenregeln wurden überarbeitet (Stand 7.11.22). Sie sind ab sofort verbindlich. Wir bitten um Beachtung.
Mehr anzeigen
Weniger anzeigen

Neues Database Plugin

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

    Das Database Plugin hat schon seine Tücken.. aber ich könnte mir durchaus vorstellen, dass ihr es erweitern könntet. Auf Basis der bisher bestehenden öffentlichen Funktionen wie zB readOldestLog könnte man ja evtl. eine Funktion "runSQL" o.ä. machen. Und dort dann _execute und _prepare entsprechend einsetzen, um "beliebige" Datenbankbefehle abzusetzen..?

    Dann mal den Github Code hier verlinken und wir machen happy testing, ehe es zum PR wird..?

    Kommentar


      0 "Null" vermeiden


      Der Stromzähler gibt seine Werte brav an die Datenbank weiter. Allerdings mußte ich den RasPi neu starten und dabei hat das Item " bezug_gesamt_kwh" eine Null in die Datenbank geschrieben. Ich denke das hängt damit zusammen, dass beim Neustart noch keine Daten vorhanden sind und das eval trotzdem rechnet - kann das sein? Ist aber eigentlich egal. Ist es möglich zu verhindern, dass eine Null in die DB geschrieben wird. Außer die Null händisch über das WebIF zu löschen (historische Werte)?

      Code:
      strom:
          werte:
              bezug_gesamt: 
                  type: num
                  sml_obis: 1-0:1.8.0*255 
              bezug_gesamt_kwh:
                  type: num
                  eval: sh.strom.werte.bezug_gesamt() / 1000
                  eval_trigger:
                      - strom.werte.bezug_gesamt
                  database: init
                  
              leistung:
                  type: num
                  sml_obis: 1-0:16.7.0*255
                  database: init

      Bei "Leistung" wurde keine Null eingetragen --> spricht auch für die "Eval-Theorie"

      Danke

      Kommentar


        Zitat von Maexle Beitrag anzeigen
        eval: sh.strom.werte.bezug_gesamt() / 1000
        Probier es mal mit:

        Code:
        eval: value / 1000 if value else None
        'value' bekommt beim Triggern den Wert des Triggeritems. Hier wird die Berechnung nur ausgeführt, wann value auch vorhanden ist, sonst wird dem Item "None" zugewiesen, es passiert also nichts.

        Kommentar


          Sisamiwe

          Danke für den Hinweis --> funktioniert leider nicht:

          Hier die letzten beiden Einträge im WebIF
          49 21.12.2021 13:05:03 None 4076.7149000000004 21.12.2021 13:05:28
          49 21.12.2021 13:04:50 13.6 0.0001 21.12.2021 13:05:28

          gibt es darüber hinaus eine Möglichkeit die Nachkommastellen zu kürzen? --> 4076.7149000000004 so genau muss das nicht sein

          Kommentar


            Zitat von Maexle Beitrag anzeigen
            Danke für den Hinweis --> funktioniert leider nicht:
            Probier bitte nochmal.

            Code:
            eval: value / 1000 if value > 0 else None

            Kommentar


              evtl. hat es doch funktioniert --> ich werde nochmals neu starten --> allerdings muss ich warten bis die Daten in die DB geschrieben wird (Roter Mülleimer)


              es funktioniert tatsächlich nicht - auch wenn sich der Fehler verändert hat:
              49 21.12.2021 13:30:24 11.9 4.076776300000001 21.12.2021 13:31:14
              nun wird 4.076776300000001 --> sprich der Wert : 1000 : 1000

              werde nun den Befehl:

              eval: value / 1000 if value > 0 else None

              versuchen


              edit: momentan sieht es gut aus --> ich werde die Sache beobachten
              Schon mal ein Dankeschön


              edit Nr.2:

              auch dieser Befehl hat leider nicht funktioniert --> es wird keine Null eingetragen aber ein Wert 4,XXXXX
              Zuletzt geändert von Maexle; 21.12.2021, 19:41.

              Kommentar


                Zitat von Maexle Beitrag anzeigen
                bezug_gesamt_kwh:
                type: num
                eval: sh.strom.werte.bezug_gesamt() / 1000
                ist das "Hilfsitem" 'bezug_gesamt_kwh' überhaupt notwendig? lässt sich die Berechnung evtl. direkt im 'bezug_gesamt' durchführen?

                Kommentar


                  Zitat von Maexle Beitrag anzeigen
                  ist das "Hilfsitem" 'bezug_gesamt_kwh' überhaupt notwendig? lässt sich die Berechnung evtl. direkt im 'bezug_gesamt' durchführen?
                  Ja, das geht auch.

                  Code:
                  strom:
                      werte:
                          bezug_gesamt_kwh:
                              type: num
                              eval: value / 1000
                              sml_obis: 1-0:1.8.0*255
                              database: init
                              
                          leistung:
                              type: num
                              sml_obis: 1-0:16.7.0*255
                              database: init
                  Wenn Dein Item einen Wert zugewiesen bekommt, wird der erstmal als 'value' "zwischengespeichert" und geht dann in eval. Das Ergebnis des eval wird dann dem Item zugewiesen.
                  Aber Achtung: Das gilt auch für das AdminIF: Weißt Du dort einem Item eine neuen Wert zu, wird das auch als 'value' zwischengespeichert und geht dann ins eval.

                  Kommentar


                    Zitat von Sisamiwe Beitrag anzeigen

                    1.
                    eval: value / 1000

                    2.
                    Aber Achtung: AdminIF
                    Danke

                    zu 1. ich habe das noch erweitert…
                    Code:
                    eval: round(value / 1000, 2)
                    jetzt nur 2 Kommastellen

                    zu 2.
                    du meinst wenn im „Item Baum“ händisch ein Wert eingetragen wird?


                    O.T. in einem anderen Item nutze ich

                    Code:
                    eval: avg
                    lässt sich dies auch runden?
                    Code:
                    round(avg), 2


                    edit:
                    Gesamt: 119 Datensätze, ältester Wert: 21.12.2021 22:25:15

                    gibt es die Möglichkeit das Werte nur stündlich oder X mal pro Tag ausgelesen werden?


                    laut Doku:

                    changed

                    Auslesen auf angegebene Änderungszeit eingeschränken (optional)
                    • Datentyp: int



                    Code:
                    bezug_gesamt:
                       type: num
                       sml_obis: 1-0:1.8.0*255 # Summe Zählerstände Tarife T1 + T2 (in Wh)
                       sml_prop: valueReal
                       eval: round(value / 1000, 2)
                       database: init
                          changed: 00:01, 06:00, 12:00, 18:00  # Werte nur zu diesen Zeiten speichern
                    funktioniert das "changed" so?

                    Danke
                    Zuletzt geändert von Maexle; 22.12.2021, 11:11.

                    Kommentar


                      Hi, ich hab mal ne Frage:

                      wärst du damit einverstanden, wenn man das Plugin so erweitert, dass man sehen kann, was - wann - wieso geändert wurde?

                      Also momentan speicherst du ja nur was und wann - aber nicht wieso bzw wodurch.

                      Damit könnte man nämlich so einen tolle erweiterte History bzw. so ein Logbuch wie bei HomeAssistent realisieren, was ich wirklich ein tolles Feature finde.

                      Klar in unserem Fall würde da nicht der Benutzer stehen, sondern eben das Plugin das den Event getriggert hat. Aber das wäre trotzdem schon sehr nützlich.

                      Logbuch.png

                      Gruß

                      Kommentar


                        Wen sprichst Du im speziellen an? Das database Plugin ist quasi uralt. Das database Plugin ist eine (feature gleiche) Neuimplementierung des sqlite Plugins, welche dann von diversen Autoren weiterentwickelt wurde.

                        Es ist nach meinem Verständnis ein ursprüngliches Featureset, welcher heutzutage über eine Timeseries Datenbank wie Prometheus oder InfluxDB abgebildet würde. Diese Time Series werden dann der smartVISU zur Verfügung gestellt.

                        Hinzugekommen sind später Features, die das endlose Wachstum der Datenbank verhindern können.

                        Der Erweiterung des Featureset steht aus meiner Sicht nichts entgegen, solange es die ursprüngliche Funktionalität nicht beeinträchtigt, also keinen Breaking Change darstellt.

                        So wie ich Deinen Wunsch interpretiere, hat die Nutzung der Datenbank dann aber nichts mit Timeseries zu tun, sondern ist eher die Ablge eies Logs in der Datenbank. So eine History erzeuge ich bei mit in einer eigenen Log Datei über das itemchange Logging.

                        Nachtrag: Du könntest auch das Item Logging nutzen und nur einen Python Loghamdler schreiben, der in eine Datebank schreibt. Wie zum Beispiel hier beschrieben: https://stackoverflow.com/questions/...ng-to-database
                        Zuletzt geändert von Msinn; 09.02.2022, 21:37. Grund: Nachtrag
                        Viele Grüße
                        Martin

                        There is no cloud. It's only someone else's computer.

                        Kommentar


                          Hallo,

                          Ich würde meine Datenbank gerne verkleinern.
                          Ich habe dafür bei den Meisten Items
                          Code:
                          database_maxage
                          gesetzt und im webinterface cleanup gestartet.
                          Nun fehlt aber noch die Verkleinerung der datenbank:

                          Bei dieser Reorganisation wird die Datenbank nicht kleiner. Es wird aber in der Datenbank freier Platz geschaffen um neue Daten aufzunehmen. Wenn die Datenbank auf der HDD verkleinert werden soll, muss auf die Mittel des verwendeten Datenbank Systems (SQLite bzw. MySQL) zurück gegriffen werden.
                          Driver ist sqlite3.
                          Ist
                          Code:
                          sqlite3 smarthome.db 'VACUUM;'
                          richtig, um den Speicherplatz freizugeben?

                          Gruß,
                          Hendrik

                          Kommentar


                            Am Wochenende habe ich gerade sowas gemacht und folgenden Code genutzt:

                            Code:
                            import sqlite3
                            conn = sqlite3.connect('smarthomeng.db')
                            conn.execute("VACUUM INTO 'smarthomeng.new.db'")
                            conn.close()
                            Dabei erstellt SQLite eine neue Datenbank ohne die Luftlöcher der alten zu entfernen. Wenn man das INTO ... weglässt, dann passiert das in-place

                            Kommentar


                              Hallo, gibt eine einfache Möglichkeit zu so einer Abfrage in einer Logik den passenden timestamp zu bekommen:

                              Code:
                               sh.messen.zaehler1.erzeugungInKwH.db('max', '5i', '5i')
                              ?

                              Dazu hätte ich dann noch eine Verständnisfrage. Habe versucht selbst was im Code rauszufinden und die Funktion db() soll ja ein Database-Object zurückgeben. Aber bei obiger Abfrage bekomme ich ja ein float zurück. Passiert das durch die Parameter 'max', '5i', '5i' ? Oder wo ist mein Verständnisproblem? Oder kann mir jemand die Funktion im Database-Plugin nennen, die die Abfrage db('max', '5i', '5i') umsetzt?

                              Danke

                              Kommentar


                                Zitat von bmx Beitrag anzeigen
                                Am Wochenende habe ich gerade sowas gemacht und folgenden Code genutzt:
                                So ein Zufall!

                                Code:
                                import sqlite3
                                conn = sqlite3.connect('smarthomeng.db')
                                conn.execute("VACUUM INTO 'smarthomeng.new.db'")
                                conn.close()
                                Verstehe, danke.
                                Wie lange hat das bei Dir gedauert?
                                Bei mir läuft es auf einem Pentium-Irgendwas seit heute Mittag. Die DB hat 17GB.
                                Edit: Obwohl ich database_maxage für fast alle Items auf 365 gesetzt habe und im Web-Interface ein "Cleanup" gemacht habe ist die DB nach dem VACUUM noch 15GB. Hast du eine Idee, woran das liegen kann?
                                Hat er vielleicht das Cleanup nicht abgeschlossen? Ist das im Log irgendwie zu sehen?

                                Zu dem Thema noch zwei Fragen:
                                1) wäre es nicht sinnvoll im WebInterface das "Datenbank-Cleanup" auch ein
                                Code:
                                conn.execute("VACUUM'")
                                auslöst, wenn der Treiber sqlite ist?
                                2) wäre es nicht sinnvoll auto_vacuum zu konfigurieren, wenn die DB erstellt wird (oder nach einem VACUUM, weil es nur dann für eine existierende DB geht)? (https://www.sqlite.org/pragma.html#pragma_auto_vacuum)

                                Gruß,
                                Hendrik
                                Zuletzt geändert von henfri; 13.04.2022, 18:19.

                                Kommentar

                                Lädt...
                                X