Ankündigung

Einklappen
Keine Ankündigung bisher.

Update von gleichbleibenden Messwerten in die Datenbank

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

    Update von gleichbleibenden Messwerten in die Datenbank

    Hallo zusammen,

    ich hab mal eine Frage zu den Items und der Aktualisierung der Datenbank.
    Vorab: Datensammler ist ein Arcus EDS M-Bus-KNX Gateway, welches die Daten von drei Wärmemengenzählern sammelt und auf den KNX-Bus sendet. Eine Variable davon ist die aktueller Heizleistung in dem jeweiligen Heizungs-Strang. Diese Variable sendet das Gateway zyklisch (1 mal pro Minute) auf den Bus.

    Nun habe ich ein Problem:
    Generiere ich aus diesen Daten eine Plot des Wärmemengenzählers für die Warmwasserladung, so wird nach Beendigung der Ladung des Warmwasserspeiches zwangsläufig "0 Watt" Leistung gesendet. Diesen Wert finde ich auch in der Datenabank wieder. Jedoch immer nur ein Mal, was dazu führt, dass meine Plot immer zwischen dem Maximum und dem "0 Watt-Verbrauch" hin und herpendelt.

    Ein Beispiel aus dem angehangenen Bild (rote Linie): Morgens um 5.51 ist die erste Warmwasserladung des Tages beendet (0Watt). Die nächste Ladung beginnt um 10.14 Uhr. Dann erst wird wieder ein Wert (hier: 11,5kW) in die Datenbank geschrieben.Die Wärmeleistung schwankt systembedingt dann ein wenig und die Nachladung endet dann um 10.27 Uhr wieder mit dem Eintrag "0 Watt". Nun beträgt die tatsächliche Leistung vom Ende des ersten Ladezyklus bis zum Anfang des nächsten Zyklus rund 4,5 Stunden, in denen die Leistung null ist.

    Im Plot steigt diese jedoch bis auf den Wert vom Abschalten um 5.45 Uhr bis zur nächsten Änderung um 10.14 Uhr sukszessive an, anstatt auf "0" zu bleiben.

    Wie bekomme ich die Messwerte nicht nur regelmäßig auf bis zum Raspberry (im Item wunderbar zu sehen, dass der Wert alle 60 Sekunden ein Update wiederfährt, die aber dann schon teilweise in der Wertänderung um Stunden zurückliegt), sondern auch in die Datenbank?

    So habe ich die Items konfiguriert:

    Code:
    WMZ1:
        Leistung:
            type: num
            database: yes
            enforce_updates: true
            enforce_update: true
            cache: on
            knx_dpt: 14
            knx_init: 6/0/1
            knx_listen: 6/0/1
            visu_acl: r
    EDIT: Achso, was ich vergessen habe: Bevor hier einer daruf herumreitet, dass die Anzahl an Schreibzugriffen in die Datenbank reduziert werden sollte - das ist völlig egal!!! Die liegen nicht auf dem Raspberry, sondern woanders und sind unlimitiert. Da geht nix kaputt!

    Das Problem geht aus den Bildern besser hervor. Wer kann helfen?
    Danke vorab!

    Angehangene Bilder:
    - Gruppenmonitor KNX mit regelmäßiger Sendung des Messwerts (hier 0 Watt)
    - Item mit Update-Alter
    - Datenbankauszug des Zeitfensters vom Plot
    - Ergebnis im Plot
    You do not have permission to view this gallery.
    This gallery has 4 photos.
    Zuletzt geändert von bmx; 20.10.2018, 09:45. Grund: Bitte [CODE] benutzen für yaml files

    #2
    Du willst beim Plot den Parameter exposure auf 'stair' setzen.
    An der DB musst du nichts ändern.

    Kommentar


      #3
      Zitat von smai Beitrag anzeigen
      Du willst beim Plot den Parameter exposure auf 'stair' setzen.
      Eigentlich will er das nicht... Auch wenn es wahrscheinlich dem Zielgraph sehr nahe käme.

      Wie die Werte in der DB gespeichert werden, diese Diskussion gab es schon zu sh.py Zeiten. Die Tatsache, dass gleiche Werte einfach weggelassen werden, ist meiner Meinung nach falsch. Man müsste neben Zeitpunkt und Wert auch immer noch die Anzahl von Wiederholungen und den Zeitpunkt des letzten Updates speichern. Dann könnte man auch korrekt den "Durchschnitt" oder den "Wert vor 5 Minuten" rausfinden.

      Ist nur meine Meinung...

      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        #4
        Ja, Waldemar, du hast mich verstanden!

        Ich bin jemand, der hier nicht den Entwicklern mit irgendwelchen unnützen Fragen auf den Geist gehen möchte.
        Darum habe ich eine Woche durchweg experimentiert, was ich an dieser Konfiguration falsch mache; und habe irgendwann an mir selbst gezweifelt... Ich habe die Smarthome-Anleitung rauf- und runter gelesen und ausprobiert, wieder verworfen, was anderes ausprobiert, die Dokumentation von Highchart und Highstock durchgeblättert, um eine Lösung herbeizuführen., welche den Graphen so darstellt, wie ich ihn haben möchte und schlussendlich das Datebase-Plugin versucht zu verstehen, bei dem ich mangels Python-Wissens und der Struktur von SmarthomeNG kläglich dran gescheitert bin.

        Für mich sieht es so aus: Da gibt es diese Funktion im Item mit "enforce_update(s)", bei der in der SmarthomeNG-Anleitung beschriebene Funktion immer aufgerufen wird, auch wenn sich der Wert nicht ändert. Folglich (für mich) auch im Database-Plugin. Offensichtlich bildet das nun die Ausnahme der Regel.

        Der Grund erschliesst sich mir nicht so ganz:
        Da ich sämtliche Daten vom KNX und von anderen Quellen so anfordern kann, wie ich möchte, entspringt daraus auch die Möglichkeit, "Datensparsam" in die DB zu schreiben. Obwohl mir das vollkommen egal ist; denn meine Datenbank liegt bei meinem Webhoster und somit ist mir völlig egal, wie oft und auf welche Art der seine Festplatten austauscht, weil ich da wie wild darauf rumschreibe. Wie auch vielen anderen hier, die mittlerweile dazu Fesplatten nutzen oder das Ganze mit Datenbank in ein NAS verfrachtet haben.

        Wenn ich das jetzt also richtig sehe gibt es dazu generell keine Möglichkeit, regelmäßig mit gleiche Werten in die DB zuschreiben?

        Schade ist, dass ich jetzt nach einer Woche herumprobieren und lesen nun feststellen muss, dass ich nicht zu blöd dazu bin (davon bin ich nämlich bis gerade eben von ausgegangen), sondern das System das nicht unterstützt und dass das nirgends irgendwo geschrieben steht.

        Nicht falsch verstehen: Ich möchte hier keinesfalls die Leute angreifen, die hier absolut ehrenamtlich und unter Aufwendung von massenhaft viel Zeit hier diese Dinge (weiter)entwickeln und auch "Rede und Antwort" für solche Fragesteller wie mich stehen. Dafür danke ich hier allen, die sich diese Mühe machen. Ich würde mich auch gerne weiter in das Thema einanrbeiten, jedoch fehlt mir in großen Teilen viel zu viel Hintergrundwissen, daher bleibt mit nur das Try-and-Error-Prinzip und im Nachgang dann hier die Fragestellung.

        Aber ein klein bisschen mehr an Erklärungen in der Anleitung würden solche Fragen auch schon im Keim ersticken (und wenn es nur wäre: "enforce_update(s) wirk sich nicht auf das Database-Plugin aus. Dort werden nur Daten bei Änderungen geschrieben"...

        Ich versuche es jetzt mal mit dem "stair", obwohl es ja das Problem als solches nicht löst. Ein zyklsiches Schreiben wäre für diverse Auswertungen (wie mumpf schon schrieb) wesentlich angenehmer.

        In diesem Sinne schönes Wochenende!

        Gruß Torsten

        Kommentar


          #5
          Hi Torsten et al,

          ich sollte vielleicht betonen, dass ich nicht weiß, ob sich was an dem Speicherverfahren in den letzten 4 Jahren geändert hat, ich wollte hier nur darauf hinweisen, dass "schon immer" Probleme mit bestimmten Auswertungen gab und diese in der meiner Meinung nach fehlerhaften Datenspeicherung lagen. Die obige Problembeschreibung hat mich nur an frühere Diskussionen erinnert und den Eindruck erweckt, dass sich da nichts getan hat (obwohl ja das DB-Plugin wohl neu ist...)

          @Torsten: Das enforce_updates funktioniert, allerdings so, wie es soll und nicht so, wie man sich das wünscht: Es ruft das DB-Plugin auch auf, auch wenn der Wert sich nicht ändert. Dummerweise entscheidet dann das Plugin, dass der Wert ja schon in der DB steht und somit nicht erneut rein geschrieben werden muss.

          Gruß, Waldemar
          OpenKNX www.openknx.de

          Kommentar


            #6
            Fast. Das DB Plugin schaut nur nach der letzten Änderung, nicht nach dem letzten Update.

            Kommentar


              #7
              Kann man dem das irgendwie austreiben?

              Kommentar


                #8
                DB-Werte.JPG Habe es ihm ausgetrieben...

                Hab mal nach bewährtem Try-and-Error-Verfahren die Zeilen im Database-Plugin 142 und 143 kopiert und ausgerautet, anschliessend neu eingefügt und aus dem item.prev_change und item.last_change ein item.prev_update und item.last_update gemacht.

                Nun kommen die Werte regelmäßig jede Minute.. Immer schön die Null in Zeiten, wo die Ladung des WW-Speichers aus ist...
                Zuletzt geändert von tsb2001; 20.10.2018, 11:32.

                Kommentar


                  #9
                  Hallo

                  ich denke, dass beide Varianten legitim sind. Man muss nur wissen, was aktiv ist und kann dann die Berechnungen und auch die Wertabfrage richtig machen.
                  Wenn die Wertabfrage heute aus einer 0 um 12:00 und einer 1 um 13:00 ein 0.5 zurück gibt, wenn man den Wert für 12:30 abfragt, dann ist das zweifelhaft...
                  Vor allem dann, wenn um 12:30 tatsächlich ein Wert von 0 gesendet -aber nicht gespeichert wurde.

                  Macht es nicht sinn, hier auf 'enforce_updates' auch im Database Plugin zu reagieren?
                  Wenn enforce_updates an ist, wird jeder Wert gespeichert. Sonst eben nur bei Änderung.

                  Wenn nur bei Änderung gespeichert wird, muss man aber noch konfigurieren können, was zwischen zwei Werten angenommen wird:
                  -last
                  -linear-interpolation
                  -andere interpolation


                  Macht das Sinn, oder würde das andere Anwendungsfälle nicht abdecken?

                  Gruß,
                  Hendrik

                  Kommentar


                    #10
                    Kann man dem das irgendwie austreiben?
                    Mit einem guten PR mit Sicherheit ,-)

                    Kommentar


                      #11
                      Ihr könntet testweise mal folgenden Code ausprobieren: (Funktion update_item tauschen in plugins/database/__init__.py)

                      Code:
                          def update_item(self, item, caller=None, source=None, dest=None):
                              acl = 'rw' if not self.has_iattr(item.conf, 'database_acl') else self.get_iattr_value(item.conf, 'database_acl')
                              if acl is 'rw':
                                  if getattr(item, '_enforce_updates', None):
                                      start = self._timestamp(item.prev_update())
                                      end = self._timestamp(item.last_update())
                                      self.logger.debug("update item {} has enforce_updates set, using values of prev_update/last_update".format(item.id()))
                                  else:
                                      start = self._timestamp(item.prev_change())
                                      end = self._timestamp(item.last_change())
                                      self.logger.debug("update item {}  using values of prev_change/last_change".format(item.id()))
                      
                                  last = None if len(self._buffer[item]) == 0 or self._buffer[item][-1][1] is not None else self._buffer[item][-1]
                                  if last:  # update current value with duration
                                      self._buffer[item][-1] = (last[0], end - start, last[2])
                                  else:     # append new value with none duration
                                      self._buffer[item].append((start, end - start, item.prev_value()))
                      
                                  # add current value with None duration
                                  self._buffer[item].append((end, None, item()))
                      Bei mir ergibt das dann
                      database.png
                      Damit wird bei gesetztem enforce_updates: yes dann die Zeitspanne vom letzten Update genommen statt der letzten Änderung.
                      Vielleicht gibt es auch eine elegantere Lösung in dem man eine neues Keyword spendiert wie z.B. database_enforce_updates.

                      Derzeit hat das einen kleinen Schönheitsfehler: Die Funktion def _dump(self, finalize=False, items=None): muß auch noch angepaßt werden, sonst werden die letzten Werte immer ab changed gespeichert und nicht ab update wenn enforces_updates auf yes/true ist.
                      Zuletzt geändert von bmx; 20.10.2018, 13:01.

                      Kommentar


                        #12
                        Zitat von henfri Beitrag anzeigen
                        Macht es nicht sinn, hier auf 'enforce_updates' auch im Database Plugin zu reagieren?
                        Wenn enforce_updates an ist, wird jeder Wert gespeichert. Sonst eben nur bei Änderung.
                        Ich fände es schön, wenn es eine Option gäbe, im db Plugin auch das Update zu erzwingen. z.B. mit enforce_updates: database ?


                        Zitat von henfri Beitrag anzeigen
                        Hallo

                        Wenn nur bei Änderung gespeichert wird, muss man aber noch konfigurieren können, was zwischen zwei Werten angenommen wird:
                        -last
                        -linear-interpolation
                        -andere interpolation
                        Den letzten Wert abfragen zu können, fände ich auch sehr hilfreich. Hab ich auch hier mal vorgeschlagen: https://github.com/smarthomeNG/smart...ment-415985045

                        Interpolation könnte man ähnlich einbinden wie im uzsu Plugin mit scipy, aber ob's das hier wirklich braucht?

                        Kommentar


                          #13
                          Onkelandy
                          bei den enforce_updates ideen bitte auch an mi-nutzung des db plugins denken...

                          Kommentar


                            #14
                            Ginge ja auch mit database@instance als Wert oder nicht? Müsste dann aber eine Liste akzeptieren, falls man mehrere Instanzen hat oder andere Plugins hier auch relevant wären?

                            Kommentar


                              #15
                              in deinem beispiel wäre das doch eher: enforce_updates@instance: database

                              allerdings ist das ein GLOBALES attribut und kein pluginspezifisches.. und dann wirds vom aufwand eklig

                              Kommentar

                              Lädt...
                              X