Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Database Plugin

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

  • ooUrmeloo
    antwortet
    Kleine Ergänzung: 'copy_database' mit einem anderen Zielpfad funktioniert problemlos.
    Liegt dann wohl ziemlich sicher an dem Stick oder wie er eingebunden ist.
    Kann es daran liegen, dass 'root' der Owner ist und nicht 'smarthome'?

    Code:
    2024-04-16  13:08:00 WARNING  plugins.database    Starting to copy SQLite3 database file from /usr/local/smarthome/var/db/smarthomeng.db to /usr/local/smarthome/var/backup/smarthomeng_backup.db
    2024-04-16  13:08:01 WARNING  plugins.database    Finished copying SQLite3 database file
    
    ​
    Zuletzt geändert von ooUrmeloo; 16.04.2024, 12:24.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von Onkelandy Beitrag anzeigen
    Ich nutze sqlite schon lange nicht mehr, aber hatte das auch auf nem USB Stick am Start und kann mich an keine Probleme erinnern. Hast du mal einen anderen Stick probiert?
    Warum benutzt du kein sqlite? Hat MySQL Vorteile? Ich bin da beim Default geblieben, habe mir aber ehrlich gesagt, keine Gedanken gemacht.
    Einen anderen Stick habe ich noch nicht probiert. Er funktioniert grundsätzlich auch einwandfrei. Backup läuft regelmäßig dorthin und andere Daten kann ich dort problemlos speichern. Owner ist 'root'. Rechte sollten m.E. passen. Ich habe den Stick via fstab eingebunden:
    Code:
    UUID=7648BF3948BEF6C9 /media/usbstick/ ntfs utf8,auto,users,rw,nofail,umask=000,x-systemd.device-timeout=30,noatime 0
    Könnte ntfs ein Problem machen?


    Zitat von Onkelandy Beitrag anzeigen
    Ad Umziehen von Pi3 auf Pi4.. kommt drauf an, was du alles am Start hast, aber an und für sich sollte die Backupfunktion von SHNG ausreichen oder du kopierst einfach den ganzen shng Ordner mit allen Unterordnern vom alten auf den neuen Pi. Kennst du das hier? https://github.com/smarthomeNG/raspberrypi-image bzw. evtl. auch https://github.com/smarthomeNG/ansible
    ​SHNG ist nicht das Problem, eher das ganze Drumherum ... knxd zum Laufen bringen, Zigbee2MQTT, ... aber ja, schon richtig ... kein Problem, muss nur die Zeit finden, es zu tun.


    Zitat von Onkelandy Beitrag anzeigen
    Ad Permission Error, kann gut sein, dass was mit den Berechtigungen nicht passt. Einfach mit ls -la <Verzeichnis> checken. Aaaaber, die Zeile hier
    "from /usr/local/smarthome/var/db/smarthomeng.db to /media/usbstick/smarthomeng_backup.db"
    würde mich stutzig machen. Also entweder, du hast die Location vom Datenbankfile falsch angegeben oder die Funktion im Databaseplugin sucht an der falschen Stelle.

    Was steht in deiner plugin.yaml zum database Plugin? Ist der erste Eintrag von "connect" - database: mit Verweis auf deinen USB Stick? Es muss der erste Eintrag sein.

    Rechte:
    Code:
    drwxrwxrwx  1 root root 4096 Apr 15 22:44 usbstick
    Was siehst Du als Problem bei dem Pfad? Ist eigentlich genau das, was ich eigentlich wollte.
    Code:
    database:
        plugin_name: database
        driver: sqlite3
        connect:
        -   database:/usr/local/smarthome/var/db/smarthomeng.db
        -   check_same_thread:0
        copy_database: True
        copy_database_name: /media/usbstick/smarthomeng_backup.db
    
    ​
    Die Arbeits-DB liegt unter '/usr/local/smarthome/var/db/' (per Default?) und ich möchte beim Start von SHNG eine Kopie unter '/media/usbstick' machen.
    Wie gesagt, nur als Workaround bzw. Backup, weil die Arbeits-DB auf dem Stick nicht gut funktioniert.


    Zitat von Onkelandy Beitrag anzeigen
    Änder mal in plugins/database/__init__.py die Zeile 407 ab, so dass statt self.logger.Error klein self.logger.error steht.

    Und könntest bitte mal Zeile 395 wie folgt ändern: database_name = next((s for s in self._connect if s.startswith("database:")), None)
    Im aktuellen Code funktioniert der Spaß nämlich nur, wenn in der plugin.yaml unter "connect" database:... der 1. Eintrag ist. UU. ist aber der erste Eintrag zB check_same_thread:true oder so und dann würde das Kopieren des Files definitiv auch nicht klappen.

    Probiere ich heute Abend mal aus.

    Danke Dir für die Hilfe!

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Ich nutze sqlite schon lange nicht mehr, aber hatte das auch auf nem USB Stick am Start und kann mich an keine Probleme erinnern. Hast du mal einen anderen Stick probiert?

    Ad Umziehen von Pi3 auf Pi4.. kommt drauf an, was du alles am Start hast, aber an und für sich sollte die Backupfunktion von SHNG ausreichen oder du kopierst einfach den ganzen shng Ordner mit allen Unterordnern vom alten auf den neuen Pi. Kennst du das hier? https://github.com/smarthomeNG/raspberrypi-image bzw. evtl. auch https://github.com/smarthomeNG/ansible

    Ad Permission Error, kann gut sein, dass was mit den Berechtigungen nicht passt. Einfach mit ls -la <Verzeichnis> checken. Aaaaber, die Zeile hier
    "from /usr/local/smarthome/var/db/smarthomeng.db to /media/usbstick/smarthomeng_backup.db"
    würde mich stutzig machen. Also entweder, du hast die Location vom Datenbankfile falsch angegeben oder die Funktion im Databaseplugin sucht an der falschen Stelle.

    Was steht in deiner plugin.yaml zum database Plugin? Ist der erste Eintrag von "connect" - database: mit Verweis auf deinen USB Stick? Es muss der erste Eintrag sein.

    Änder mal in plugins/database/__init__.py die Zeile 407 ab, so dass statt self.logger.Error klein self.logger.error steht.

    Und könntest bitte mal Zeile 395 wie folgt ändern: database_name = next((s for s in self._connect if s.startswith("database:")), None)
    Im aktuellen Code funktioniert der Spaß nämlich nur, wenn in der plugin.yaml unter "connect" database:... der 1. Eintrag ist. UU. ist aber der erste Eintrag zB check_same_thread:true oder so und dann würde das Kopieren des Files definitiv auch nicht klappen.
    Zuletzt geändert von Onkelandy; 16.04.2024, 06:42.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    mmh ... bekomm' die 'copy_database' nicht zum laufen:

    Code:
    2024-04-14  22:08:39 WARNING  plugins.database    Starting to copy SQLite3 database file from /usr/local/smarthome/var/db/smarthomeng.db to /media/usbstick/smarthomeng_backup.db
    2024-04-14  22:08:40 ERROR    lib.plugin          Plugin 'database' v1.6.12 from section 'database'
    Exception: 'PluginLoggingAdapter' object has no attribute 'Error'
    running SmartHomeNG v1.10.0-master (4b25822a0) / plugins v1.10.0-master (7e00e4ee)
    Traceback (most recent call last):
      File "/usr/local/smarthome/plugins/database/__init__.py", line 404, in copy_databasefile
        shutil.copy2(database_name, self._copy_database_name)
      File "/usr/lib/python3.9/shutil.py", line 436, in copy2
        copystat(src, dst, follow_symlinks=follow_symlinks)
      File "/usr/lib/python3.9/shutil.py", line 375, in copystat
        lookup("utime")(dst, ns=(st.st_atime_ns, st.st_mtime_ns),
    PermissionError: [Errno 1] Operation not permitted
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/plugin.py", line 173, in __init__
        plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._configfile)
      File "/usr/local/smarthome/lib/plugin.py", line 709, 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 143, in __init__
        self.copy_databasefile()
      File "/usr/local/smarthome/plugins/database/__init__.py", line 407, in copy_databasefile
        self.logger.Error( f"Error copying SQLite3 database file: {e}")
    AttributeError: 'PluginLoggingAdapter' object has no attribute 'Error'
    ​
    Permission Error? Hab ich für den USB Stick nicht ausreichend Schreibrechte?
    Könnte das evtl. auch das Performance Problem von weiter oben erklären? Aber dann könnte ich doch gar nicht schreiben ...

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Deshalb habe ich jetzt eine neue auf meinem USB Stick (mit fstab gemountet an meinem PI3) angelegt.
    Leider habe ich dort jetzt massiv Performance Probleme. Ich bekomme ständig folgende Einträge. Wie man sieht, auch mitten in der Nacht, wo sonst nicht viel laufen sollte.
    Hat keiner ein Idee, warum die Datenbank bei mir nicht sinnvoll auf USB Stick läuft?

    Alternative Idee:
    Ich habe gerade in der database Doku den Befehl für die plugin.yaml gefunden: 'copy_database'.
    Verstehe ich das richtig, das SHNG bei jedem Neustart eine Kopie der Datenbank ablegt, die man dann auch wieder als Backup einlesen könnte?
    D.h., wenn man die Datenbank regelmäßig (z.B. auf dem USB Stick) sichern möchte, könnte man 'copy_database' nutzen.
    Man müsste nur SHNG regelmäßig neu starten?!? Z.B. mit einem cronjob für:

    Code:
    sudo systemctl restart smarthome.service​
    Oder gibt es da einen "eleganteren" Weg?

    Danke euch!

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Danke nochmal für die Hinweise.
    Leider habe ich es nicht hinbekommen, die alte Datenbank zu retten.
    Deshalb habe ich jetzt eine neue auf meinem USB Stick (mit fstab gemountet an meinem PI3) angelegt.
    Leider habe ich dort jetzt massiv Performance Probleme. Ich bekomme ständig folgende Einträge. Wie man sieht, auch mitten in der Nacht, wo sonst nicht viel laufen sollte.

    Code:
    2024-04-04  02:13:10 NOTICE   plugins.database    Dumping buffered data from skipped dump(s).
    2024-04-04  02:13:59 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:13:59 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:00 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:00 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:17 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:20 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:20 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:20 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:23 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:38 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:38 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:39 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    2024-04-04  02:14:46 NOTICE   plugins.database    Skipping dump, since an other database operation running! Data is buffered and dumped later.
    Wenn ich dann noch per Smartvisu auf die Daten zugreife (z.B. Plots), bekomme ich wieder Websocket Fehler (vglb. https://knx-user-forum.de/forum/supp...06#post1929106) und die Seite lädt ewig ... :-(

    Bei testweise Kopieren der Datenbank wieder zurück auf die SD Karte läuft alles problemlos. Die Datenbank ist auch ganz neu (d.h. klein). Daran sollte es also auch nicht liegen. Der USB Stick läuft eigentlich auch stabil. Darauf mache ich regelmäßig eine Sicherung. Woran könnte es sonst liegen? Jemand eine Idee? Performance des PI3? USB Geschwindigkeit?
    Sonst würde ich die Datenbank wohl oder übel doch wieder auf der SD Karte lassen - mit dem Risiko, dass sie wieder mal zerschossen wird.
    Oder kann man die Datenbank im laufenden Betrieb irgendwie (auf den USB Stick?) sichern? Meines Wissens nach geht das nicht so einfach, da die Datenbank ja immer in Bearbeitung ist.

    Kann es an der PI3 Performance liegen? Ich bin gerade dabei, das ganze System auf einen PI4 zu portieren. Brauche aber noch eine Weile, da man ja alles neu aufsetzen muss. (Bin für jegliche Tipps dankbar, wie man schlank von PI3 -> PI4 umziehen kann ;-) )

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Da gibt es im Netz einiges zu finden, zum Beispiel auf Stackoverflow oder direkt in der Doku der SQLite3.

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    In der Tat ... Datenbank liegt lokal auf der SD Karte des Pi :-/ Das werde ich jetzt aber gleich mal ändern ... und sie auf den USB Stick schieben.
    Ich benutze sqlite3 mit dem database Plugin v1.6.12.

    Wenn ich es richtig sehe, gibt es nur einen Fehlereintrag bei Item_Id 121. Allerdings kann ich den Eintrag auch nicht manuell löschen. :-(
    Hatte keinen Stromausfall o.ä.​

    Zitat von bmx Beitrag anzeigen
    Ich würde umgehend versuchen die Datenbank zu prüfen und ggf. zu retten...
    Was kann ich da denn machen? "prüfen und ggf. retten?"

    Ist kein Beinbruch, wenn alles weg ist, schade wär's aber schon.

    Einen Kommentar schreiben:


  • aldaris
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    So, hänge mich aber auch mal mit einer Frage hier ran.
    Habe leider auch ein Problem. Habe seit kurzem folgende Einträge im Log, und habe keine Ahnung, warum. Habe eigentlich nichts geändert.

    Code:
    2024-03-28 22:05:11 ERROR lib.db Can not execute query: DELETE FROM log WHERE (item_id = ? ) AND (time = ? OR 1 = ? ) AND (time > ? OR 1 = ? ) AND (time < ? OR 1 = ? ) AND (changed = ? OR 1 = ? ) AND (changed > ? OR 1 = ?) AND (changed < ? OR 1 = ? ); (args [121, None, 1, None, 1, 1680040800000, 0, None, 1, None, 1, None, 1]): database disk image is malformed
    2024-03-28 22:05:11 ERROR plugins.database Database: Error for query DELETE FROM log WHERE (item_id = 121 ) AND (time = None OR 1 = 1 ) AND (time > None OR 1 = 1 ) AND (time < 1680040800000 OR 1 = 0 ) AND (changed = None OR 1 = 1 ) AND (changed > None OR 1 = 1) AND (changed < None OR 1 = 1 ); : database disk image is malformed
    2024-03-28 22:05:11 ERROR plugins.database Exception in function deleteLog: database disk image is malformed
    Hat jemand eine Idee, woran das liegen könnte bzw. wie ich es beheben könnte??
    Der eigentliche Fehler stammt aus der Datenbank bei Ausführung der Query:
    database disk image is malformed

    Ich würde sagen, die Datenbank ist kaputt, evtl. die SD Karte oder worauf die liegt? Je nachdem wie relevant die Daten sind könntest du das Datenbankfile mal umbenennen, dann wird eine neue angelegt.

    Welche Datenbank benutzt du?

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Zitat von ooUrmeloo Beitrag anzeigen
    Code:
    database disk image is malformed
    Sieht für mich nach angeschlagener Datenbank aus. Bist Du auf einem Pi mit SD-Karte unterwegs? Ich würde umgehend versuchen die Datenbank zu prüfen und ggf. zu retten...
    Pi mit Datenbank auf SD-Karte sehe ich seit jeher skeptisch...
    Ansonsten: Hast Du mal einen Absturz gehabt oder einen Stromausfall?

    Einen Kommentar schreiben:


  • aldaris
    antwortet
    So einfach war es leider nicht. Ich habe dann doch mal einen Blick in den Code geworfen, tatsächlich liefert diff die Differenz zwischen max und min.

    Code:
     'diff': 'MAX(val_num) - MIN(val_num)',
    Nicht das was ich suche. Ich habe es jetzt hingekriegt mit: Aktueller Wert minus Wert vor einer Stunde zu
    Code:
    sh.A.db('raw', 'now')-sh.A.db('raw', '1h', '1h')
    Doppeltes '1h' ist wichtig, da raw den ersten Wert aus dem Intervall nimmt, das sonst now wäre. Intuitiv hätte ich bei 'raw', '1h' ein Array von vor einer Stunde bis jetzt erwartet.

    ​​​​​​​Mal schauen ob ich das noch erweitere...

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    So, hänge mich aber auch mal mit einer Frage hier ran.
    Habe leider auch ein Problem. Habe seit kurzem folgende Einträge im Log, und habe keine Ahnung, warum. Habe eigentlich nichts geändert.

    Code:
    2024-03-28  22:05:11 ERROR    lib.db              Can not execute query: DELETE FROM log WHERE (item_id = ?                                      ) AND (time    = ?          OR 1 = ?         ) AND (time    > ?    OR 1 = ?   ) AND (time    < ?      OR 1 = ?     ) AND (changed = ?       OR 1 = ?      ) AND (changed > ? OR 1 = ?) AND (changed < ?   OR 1 = ?  );     (args [121, None, 1, None, 1, 1680040800000, 0, None, 1, None, 1, None, 1]): database disk image is malformed
    2024-03-28  22:05:11 ERROR    plugins.database    Database: Error for query DELETE FROM log WHERE (item_id = 121                                      ) AND (time    = None          OR 1 = 1         ) AND (time    > None    OR 1 = 1   ) AND (time    < 1680040800000      OR 1 = 0     ) AND (changed = None       OR 1 = 1      ) AND (changed > None OR 1 = 1) AND (changed < None   OR 1 = 1  );    : database disk image is malformed
    2024-03-28  22:05:11 ERROR    plugins.database    Exception in function deleteLog: database disk image is malformed
    Hat jemand eine Idee, woran das liegen könnte bzw. wie ich es beheben könnte??

    Einen Kommentar schreiben:


  • ooUrmeloo
    antwortet
    Zitat von aldaris Beitrag anzeigen
    Guten Tag, leider muss ich eine Frage zum Database Plugin stellen. Ich kriege es nicht hin:
    Ich habe eine Item mit Datenbank, das regelmäßig Einträge generiert. In einem zweiten Item möchte ich stündlich die Veränderung der letzten Stunde darstellen. Das zweite Item hat crontab und eval auf das erste Item. Bisher war mein Basisitem monoton steigend, eval war
    Code:
    sh.A.db('max', '1h') - sh.A.db('min', '1h')
    Klappte.

    Neue Anforderung, das Basisitem kann auch fallen, dann liefert das oben keine sinnvollen Ergebnisse mehr. Daher habe ich es mit diff probiert:
    Code:
    sh.A.db('diff', '1h')
    Das liefert aber leider auch rein positive Ergebnisse. In meinem Beispiel, wo die Datenwerte alle negativ sind und monoton fallen (-2, -3, -12, -12, -34,..) bekomme ich trotzdem positive Ergebnisse (-2 zu -34 hätte ich gerne -32). Ist das absichtlich so und/oder wie kann ich das sonst lösen?

    Danke für jeden Hinweis und frohe Festtage
    Aldaris
    Was willst Du denn ausrechnen? Das Delta zwischen jetzt und vor einer Stunde? Oder das Delta max in der letzten Stunde minus min in der letzten Stunde?
    M.E. macht das 'diff' genau, was es soll:

    ### sh.item.db(function, start, end='now')
    und
    * `diff`: return the differences between values

    Damit: Start=1h - End=now --> -2 --34 = 32

    Ich benutze 'diff' nicht, aber evtl. mal anders herum probieren:

    Code:
    sh.A.db('diff', 'now', '1h')
    oder
    Code:
    sh.A.db('raw', 'now') - sh.A.db('raw', '1h')
    Nur so eine Idee ...

    Einen Kommentar schreiben:


  • aldaris
    antwortet
    Guten Tag, leider muss ich eine Frage zum Database Plugin stellen. Ich kriege es nicht hin:
    Ich habe eine Item mit Datenbank, das regelmäßig Einträge generiert. In einem zweiten Item möchte ich stündlich die Veränderung der letzten Stunde darstellen. Das zweite Item hat crontab und eval auf das erste Item. Bisher war mein Basisitem monoton steigend, eval war
    Code:
    sh.A.db('max', '1h') - sh.A.db('min', '1h')
    Klappte.

    Neue Anforderung, das Basisitem kann auch fallen, dann liefert das oben keine sinnvollen Ergebnisse mehr. Daher habe ich es mit diff probiert:
    Code:
    sh.A.db('diff', '1h')
    Das liefert aber leider auch rein positive Ergebnisse. In meinem Beispiel, wo die Datenwerte alle negativ sind und monoton fallen (-2, -3, -12, -12, -34,..) bekomme ich trotzdem positive Ergebnisse (-2 zu -34 hätte ich gerne -32). Ist das absichtlich so und/oder wie kann ich das sonst lösen?

    Danke für jeden Hinweis und frohe Festtage
    Aldaris

    Einen Kommentar schreiben:


  • aschwith
    antwortet
    Ich nutze mariadb. Dein Hinweis mit Fehlerhandling ist völlig richtig. Fürs Erste würde mir ausreichen, wenn die Funktion "none" zurückgibt, falls es kein Delta berechnet werden kann.

    Kennst Du bei SQL die Abfrage für ein Differenzieren? Ich hatte mich mal im database plugin in der Funktion
    Code:
    def _single(self, func, start, end='now', item=None):
    an der function "differentiate" versucht, bin aber an dem SQL Aufruf "LAG" gescheitert. Dieser scheint nicht von allen DBs unterstützt zu werden. Kennst Du dich da aus?

    Einen Kommentar schreiben:

Lädt...
X