Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Database Plugin

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

  • henfri
    antwortet
    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

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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

    Einen Kommentar schreiben:


  • TCr82
    antwortet
    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ß

    Einen Kommentar schreiben:


  • Maexle
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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.

    Einen Kommentar schreiben:


  • Maexle
    antwortet
    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?

    Einen Kommentar schreiben:


  • Maexle
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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

    Einen Kommentar schreiben:


  • Maexle
    antwortet
    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

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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.

    Einen Kommentar schreiben:


  • Maexle
    antwortet
    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

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    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..?

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    Ich hätte schon des Öfteren natives SQL aus Logiken heraus brauchen können (z.B. im Zusammenhang mit dem hier, dem hier, dem hier und dem hier) und kann mich dunkel daran erinnern, dass es immer daran scheiterte, dass man kein echtes SQL-Statement über das dB-Plugin an die Datenbank übergeben kann.

    Eine eigene dB-Anbindung wollte ich auch nicht extra schreiben, und für eigenständige Erweiterungen des dB-Plugins (so sie denn überhaupt abgenickt werden - gerade beim dB-Plugin werden für jede vorgeschlagene einfache Lösung immer ganz schnell ganz viele komplizierte Probleme gefunden) fehlt mir einfach die Zeit und der Nerv.

    Zumindest habe ich nach diversen Tüfteleien für mich keinen gangbaren Weg gefunden und es dann immer aufgegeben ...

    /tom

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    So,
    ich habe mal etwas geforscht und die sql-Abfrage dafür ermittelt.

    Code:
    SELECT CONCAT(YEAR(FROM_UNIXTIME(time/1000)), '/', WEEK(FROM_UNIXTIME(time/1000))) AS ForDate,
        MAX(val_num), MIN(val_num)
    FROM  log_1
    WHERE item_id = 117 AND YEAR(FROM_UNIXTIME(time/1000)) = 2020
    GROUP BY CONCAT(YEAR(FROM_UNIXTIME(time/1000)), '/', WEEK(FROM_UNIXTIME(time/1000)))
    ORDER BY ForDate DESC;
    Dabei ist die Tabelle "log_1" und das Item trägt die ID = 117.
    Die Abfrage ermittelt den Min und Max Wert der Tabellenspalte "val_num" aus der Tabelle "log_1" (Bei mir eine Arbeitskopie der Tabelle, in der alle Werte geloggt werden), wenn die item_id 117 ist, das Jahr des Eintrags 2020 und gruppiert nach Jahr/Woche des Eintrags.

    Ähnliches geht für Tage, Monate, Jahre etc.

    Die Datenbank (zumindest mysql) gibt es also her.

    Wäre es denkbar, das Plugin entsprechend zu erweitern?

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Zitat von Maexle Beitrag anzeigen
    Du möchtest "Min-Temp-der-letzen-Woche"
    Genau!

    Einen Kommentar schreiben:

Lädt...
X