Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Probleme mit db4o Datenbank

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

    [Codebeispiel] - √ - Probleme mit db4o Datenbank

    Hallo,

    in meiner KNX Umgebung habe ich einen Energieaktor, der mir alle 10 Minuten die Energiewerte seit Wochenbeginn (Montag 0:00 Uhr) liefert. Die Werte werden werden Items zugeordnet und über openHAB visualisiert. Der Energieaktor ist so eingestellt, dass dieser immer Montags 0:00 Uhr zurückgesetzt wird.

    Nun möchte ich mir die historischen Daten anschauen. Hierzu werden die Energiewerte mit Hilfe des db4o Binding mitgeschrieben und über zusätzliche Items dargestellt werden. Theoretisch würde es mir genügen, wenn die Daten immer am Sonntags 23.59 speichere werden. Aktuell speichere ich die Daten noch stündlich. Die historischen Daten werden über eine Regel alle 15 minuten aktualisiert.

    Nun habe ich das Gefühl, dass die Daten entweder nicht korrekt gespeichert bzw. ausgelesen werden, da immer alle Items den gleichen Wert anzeigen.

    1. Gibt es eine Möglichkeit die Datei store.db4o mit einem Editor oder Programm auszulesen?
    2. Wie funktioniert das mit den historischen Daten wenn in store.db4o zu jeder ganzen Stunde (0, 1, 2, ... 23) ein Wert gespeichert wird aber Minutengenau nach einem Wer gesucht wird (z.B. 13:35), wird dann der nächste Wert verwendet?

    Gruß
    Pierre

    #2
    Hi Pierre,

    Zitat von mepi0011 Beitrag anzeigen
    Gibt es eine Möglichkeit die Datei store.db4o mit einem Editor oder Programm auszulesen?
    Ich habe selbst noch keine dieser Tools verwendet, aber ich habe das hier gefunden, vielleicht hilft das irgendwie weiter: db4o: Tools For Adhoc Querying And ModificationGamlor | Gamlor

    Zitat von mepi0011 Beitrag anzeigen
    Wie funktioniert das mit den historischen Daten wenn in store.db4o zu jeder ganzen Stunde (0, 1, 2, ... 23) ein Wert gespeichert wird aber Minutengenau nach einem Wer gesucht wird (z.B. 13:35), wird dann der nächste Wert verwendet?
    Nicht der nächste, sondern der vorhergehende. Die Methode historicState() soll ja gerade den Status zu diesem Zeitpunkt ermitteln. Wenn Du zwei Stati um 1 Uhr und um 2 Uhr gespeichert hast, so ist für openHAB um 1:30 Uhr der gültige Status (also das, was Du zu dieser Zeit auch im UI gesehen hättest) der Wert von 1 Uhr.

    Viele Grüße,
    Kai

    P.S.: Ich bin gerade dabei, den rrd4j Service "queryable" zu machen, der könnte evtl. dann für Dich auch interessant sein.

    Kommentar


      #3
      Hallo,

      hab mir das ganze nochmal genauer angeschaut und festgestellt, dass wenn eines der mitgeloggten Lichter an ist und der Energieaktor 1/4 stündlich neue Werte liefert, die historischen Daten einen älteren Stand anzeigen der sich mit der Zeit dann aktualisiert.

      Was ich mir nicht erklären konnte, wenn ich mehrere Tage zurückspringe, ich den gleichen Wert erhalte wie wenn ich nur 1 oder 2 Stunden zurückspringe (die db4o Daten werden seit über 1 Woche mitgeschrieben).

      Heute Nachmittag habe ich per Dropbox und dem Dropbox-Binding die Daten von Raspberry local auf meinen Desktop PC (Kubuntu 12.04) kopiert (kompletter Ordner configrurations und etc --> db4o-Datei).

      Danach habe ich das ganze parallel auf meinem Desktop PC gestartet und siehe da dieser zeigt mir andere, vertrauenswürdige Werte an!

      Nun wollte ich das ganze heute Abend nochmal nachstellen, Regel etwas geändert, Daten synchronisiert und Raspberry neu gestartet.

      Ergebnis:
      Die Weboberfläche der Raspberry zeigt keine Historischen Daten mehr an, sondern liefert mir folgende Information.
      Code:
      2013-04-07 21:35:06 - Energie_UG_Licht_Esszimmer_Tisch_1W state updated to Uninitialized
      2013-04-07 21:35:07 - Energie_UG_Licht_Esszimmer_Tisch_D state updated to Uninitialized
      2013-04-07 21:35:08 - Energie_UG_Licht_Esszimmer_Decke_D state updated to Uninitialized
      2013-04-07 21:35:10 - Energie_UG_Licht_Windfang_D state updated to Uninitialized
      2013-04-07 21:35:10 - Tuer_Keller state updated to CLOSED
      2013-04-07 21:35:11 - Energie_UG_Licht_Windfang_H state updated to Uninitialized
      Auf dem Desktop-PC läuft es problemlos (siehe beigefügte Bild)!

      Ich verwende einen Raspbery 512 MB mit Debian (softfloated) und dem Build #357.

      Das Item-File sieht wie folgt aus:
      Code:
      * Energie */
      Number Energie_UG_Licht_Esszimmer_Tisch        "Licht Esszimmertisch [%d Wh]"            <energy>    (Energie)            { knx="13.010:1/5/0"}
      Number Energie_UG_Licht_Esszimmer_Tisch_1W    "Licht Esszimmertisch letzte Woche [%d Wh]"    <energy>    (Energie)
      Number Energie_UG_Licht_Esszimmer_Tisch_D     "Licht Esszimmertisch -2h [%d Wh]"        <energy>    (Energie)
      Number Energie_UG_Licht_Flur            "Licht Flur EG [%d Wh]"             <energy>    (Energie)            { knx="13.010:1/5/1"}
      Number Energie_UG_Licht_Esszimmer_Decke        "Licht Esszimmer Decke [%d Wh]"         <energy>    (Energie)            { knx="13.010:1/5/4"}
      Number Energie_UG_Licht_Esszimmer_Decke_D      "Licht Esszimmertisch -2h [%d Wh]"        <energy>    (Energie)
      Number Energie_UG_Licht_Windfang        "Licht Windfang Decke [%d Wh]"             <energy>    (Energie)            { knx="13.010:1/5/5"}
      Number Energie_UG_Licht_Windfang_D          "Licht Windfang -2 Tage [%d Wh]"        <energy>    (Energie)
      Number Energie_UG_Licht_Windfang_H              "Licht Windfang -2 Stunden [%d Wh]"             <energy>     (Energie)
      String Energie_Test                "Berechnetes Datum [%s]"            <energy>    (Energie)
      String Energie_Zeit                             "aktualisiert um [%s]"                          <energy>        (Energie)
      die Regel dazu:

      Code:
      rule Historische_Daten
      when
          Time cron "1 0/5 * * * ?"
      then
          var DateTime Woche = (DateTime::parse((now.minusDays(now.getDayOfWeek)).toString)).withTime(23,58,00,000)
              Energie_Test.postUpdate(Woche.toString)
          Energie_Zeit.postUpdate(now.toString)
              Energie_UG_Licht_Esszimmer_Tisch_1W.postUpdate(Energie_UG_Licht_Esszimmer_Tisch.historicState(now.minusDays(7)))
              Energie_UG_Licht_Esszimmer_Tisch_D.postUpdate(Energie_UG_Licht_Esszimmer_Tisch.historicState(now.minusDays(1)))
              Energie_UG_Licht_Esszimmer_Decke_D.postUpdate(Energie_UG_Licht_Esszimmer_Decke.historicState(now.minusHours(2)))
              Energie_UG_Licht_Windfang_D.postUpdate(Energie_UG_Licht_Windfang.historicState(now.minusDays(2)))
          Energie_UG_Licht_Windfang_H.postUpdate(Energie_UG_Licht_Windfang.historicState(now.minusHours(2)))
      end
      Liegt das an der Performance des Raspberry?

      Ideen?

      Gruß
      Pierre
      Angehängte Dateien

      Kommentar


        #4
        Prinzipiell denke ich, dass der RaspPi zu schwach sein könnte, um db4o auf Dauer zu betreiben (das Datenbankfile wird verflixt schnell größer). Ich versuche, für das 1.2 Release das Issue https://code.google.com/p/openhab/issues/detail?id=165 fertig zu bekommen, durch welches dann rrd4j die "default" Persistierung wäre - das geht auf Dauer, weil die Datenbank einfach konstant bleibt. Vielleicht willst Du in einer Woche also auch darauf umsteigen und Deine jetzigen Probleme haben sich dann erledigt...?

        Grüße,
        Kai

        Kommentar


          #5
          Hallo Kai,

          habe in der Zwischenzeit meinen Raspberry neu aufgesetzt um zu sehen ob bei der hard-float Variante da die Performance ausreicht. Leider ohne Erfolgt!

          Ich habe sogar die store.db4o gelöscht und speichere die Daten nur einmal am Tag. Folglich ist die Datei aktuell mit 16 k noch sehr klein. Selbst die "alte" Datei mit 700 KiB ist nicht wirklich groß und sollte vom Raspberry verarbeitet werden können.

          Der Server zeigt mir bei den historischen Daten, aktuell noch einen Strich an (undefiniert) daher kann ich nicht sagen ob das Speichern in die db4o-Datenbank erfolgreich war. Wird das schreiben in die Datenbank in einer der log-Dateien protokolliert?


          Ich habe gesehen das die neue openHAB Version auch historischen Daten bei rrj4d unterstützt wird. Funktioniert das mit den gleichen Befehlen oder ist sonst etwas zu beachten?

          Gruß
          Pierre

          Kommentar


            #6
            Hi Pierre,

            Zitat von mepi0011 Beitrag anzeigen
            Ich habe gesehen das die neue openHAB Version auch historischen Daten bei rrj4d unterstützt wird. Funktioniert das mit den gleichen Befehlen oder ist sonst etwas zu beachten?
            nein, es ändert sich lediglich der Name des Persistence-Service (=rrd4j). Kai hat übrigens auch den Default-Persistence-Service auf RRD4j geändert (zieht natürlich nur, wenn Du die letzte gültige openhab_default.cfg verwendest).

            Gruß,

            Thomas E.-E.
            Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

            Kommentar


              #7
              Hallo zusammen,

              leider habe ich aktuell wenig Zeit und komme erst jetzt zum testen des neuen Systems.

              Wie am 18.08.2013 berichtet, habe ich meinen Rasperry neu aufgesetzt und den letzten Snapshot vor dem Reseas 1.2 installiert (#389 oder #390) und wie empfohlen auf rrj4d umgestellt.

              Leider funktioniert das Ganze nun auch nicht mehr auf meinem PC!

              Was mache ich falsch?

              Das Item-File und die Regel hat sich zum 07.04.2013 nicht geändert (siehe weiter oben), lediglich die Datei rrd4j.persist habe ich wie folgt geändert:

              Code:
              // persistence strategies have a name and a definition and are referred to in the "Items" section
              Strategies {
                  // for rrd, we need a cron strategy
                  everyMinute : "0 * * * * ?"
                  everyHour : " 0  0  * * * ?"
                  endOfDay  : "58 59 23 * * ?"
              }
              
              Items {
                  // let's only store temperature values in rrd
              
                  Weather_Chart* : strategy = everyMinute
                  // Leistung_Chart* : strategy = everyMinute
                  Energie_UG_Licht_Esszimmer_Tisch    : strategy = everyHour, endOfDay
                  Energie_UG_Licht_Flur            : strategy = everyHour, endOfDay
                  Energie_UG_Licht_Esszimmer_Decke    : strategy = everyHour, endOfDay
                  Energie_UG_Licht_Windfang        : strategy = everyHour, endOfDay
              }
              Die entsprechenden rrd-Dateien in /etc/rrd4j wurden angelegt!

              Die Ausgabe der Konsole zeigt folgendes an:

              Code:
              22:40:01.019 INFO  runtime.busevents[:46] - Energie_UG_Licht_Esszimmer_Tisch_1W state updated to Uninitialized
              22:40:01.025 INFO  runtime.busevents[:46] - Energie_UG_Licht_Esszimmer_Tisch_D state updated to Uninitialized
              22:40:01.029 INFO  runtime.busevents[:46] - Energie_UG_Licht_Esszimmer_Decke_D state updated to Uninitialized
              22:40:01.032 INFO  runtime.busevents[:46] - Energie_UG_Licht_Windfang_D state updated to Uninitialized
              22:40:01.035 INFO  runtime.busevents[:46] - Energie_UG_Licht_Windfang_H state updated to Uninitialized
              Die openhab.log Datei sieht wie folgt aus:

              Code:
              21:45:07.275 INFO  o.o.c.internal.CoreActivator[:92]- openHAB runtime has been started (v1.2.0).
              21:45:08.085 INFO  o.o.b.k.i.c.KNXConnection[:178]- Established connection to KNX bus on 192.168.128.118:3671 in mode TUNNEL.
              21:45:08.885 WARN  o.o.m.c.i.ModelRepositoryImpl[:82]- Configuration model 'db4o.persist' can not be found
              21:45:08.887 WARN  o.o.m.c.i.ModelRepositoryImpl[:77]- Configuration model 'rrd4j.persist' is either empty or cannot be parsed correctly!
              21:45:08.962 WARN  o.o.m.c.i.ModelRepositoryImpl[:82]- Configuration model 'rrd4j.persist' can not be found
              21:45:08.963 INFO  o.o.m.c.i.f.FolderObserver[:163]- Loaded file 'rrd4j.persist'
              21:45:09.035 WARN  o.o.m.c.i.ModelRepositoryImpl[:82]- Configuration model 'presencesimulation.persist' can not be found
              21:45:09.438 INFO  o.o.m.c.i.f.FolderObserver[:163]- Loaded file 'Moerike.items'
              21:45:09.581 INFO  o.o.m.c.i.f.FolderObserver[:163]- Loaded file 'db4o.persist'
              21:45:10.292 INFO  o.o.i.s.i.DiscoveryServiceImpl[:92]- mDNS service has been started.
              21:45:11.106 INFO  o.o.i.r.i.RESTApplication[:158]- Started REST API at /rest
              21:45:19.679 INFO  o.o.m.c.i.f.FolderObserver[:163]- Loaded file 'Moerike.sitemap'
              21:45:20.825 INFO  o.o.u.w.i.s.WebAppServlet[:99]- Started Classic UI at /openhab.app
              21:45:31.381 INFO  o.o.m.c.i.f.FolderObserver[:163]- Loaded file 'Moerike.rules'
              22:41:13.474 INFO  o.o.i.r.i.RESTApplication[:174]- Stopped REST API
              22:41:13.476 INFO  o.o.i.s.i.DiscoveryServiceImpl[:77]- Unregistering service _openhab-server._tcp.local. at port 8080
              22:41:13.477 INFO  o.o.i.s.i.DiscoveryServiceImpl[:77]- Unregistering service _openhab-server-ssl._tcp.local. at port 8443
              22:41:32.208 INFO  o.o.u.w.i.s.WebAppServlet[:110]- Stopped Classic UI
              Mich iritieren die folgenden drei Zeilen im Log-File:

              Code:
              21:45:08.887 WARN  o.o.m.c.i.ModelRepositoryImpl[:77]- Configuration  model 'rrd4j.persist' is either empty or cannot be parsed correctly!
              21:45:08.962 WARN  o.o.m.c.i.ModelRepositoryImpl[:82]- Configuration model 'rrd4j.persist' can not be found
              21:45:08.963 INFO  o.o.m.c.i.f.FolderObserver[:163]- Loaded file 'rrd4j.persist'
              Woran kann es liegen, dass openHAB Probleme mit der rrd4j.persist Datei hat?


              Folgende Fehlermeldung ist auch seltsam, da ich aktuell keine presencesimulation.persist verwende oder je etwas derartiges angelegt habe!

              Code:
              21:45:09.035 WARN  o.o.m.c.i.ModelRepositoryImpl[:82]- Configuration model 'presencesimulation.persist' can not be found
              Und zum Schluß, was sagt mit folgende Ausgabe? Für was ist der mDNS Service?
              Code:
              21:45:10.292 INFO  o.o.i.s.i.DiscoveryServiceImpl[:92]- mDNS service has been started.
              Wie bekomme ich es hin, dass die Historischen Werte angezeigt werden?

              Gruß
              Pierre

              Kommentar


                #8
                Hi Pierre,

                rrd4j braucht (mit der jetzigen Konfiguration) spätestens jede Minute einen aktuellen Wert, ansonsten geht es davon aus, dass keine Werte vorhanden sind und malt entsprechend für diese Zeit kein Chart. Ändere also mal die Strategie auf everyMinute und es sollte funktionieren! Da es eine Round-Robin-Datenbank ist, macht das minütliche Persistieren keinen Unterschied bzgl. Datenbankgröße, das ist also unkritisch (und bei mir dauert es auch pro Item nur 2ms, sollte also auch keine Performance kosten).

                Viele Grüße,
                Kai

                Kommentar


                  #9
                  Hallo Kai,

                  vielen Dank für den Hinweis, nun funktioniert es auch mit der Abfrage der historischen Daten!

                  Für meinen Fall macht das speichern der Daten im Minutentakt keinen Sinn, für mich würde es Täglich reichen und das für ein bis zwei Jahre.

                  Wie lange werden die Daten in der rrj4d Datenbank gespeichert bzw. kann dies eingestellt werden?

                  Gruß
                  Pierre

                  Kommentar


                    #10
                    Wie lange werden die Daten in der rrj4d Datenbank gespeichert bzw. kann dies eingestellt werden?
                    Siehe https://code.google.com/p/openhab/wiki/rrd4jPersistence.
                    Sie werden für 10 Jahre gespeichert, nur die Granulatität der Daten sinkt ab, je älter sie werden.

                    Grüße,
                    Kai

                    Kommentar

                    Lädt...
                    X