DbLog "verschluckt" Daten

Begonnen von GaiusMarius, 01 März 2021, 10:56:00

Vorheriges Thema - Nächstes Thema

GaiusMarius

Was kann ich dagegen tun? ???
"Verschluckt" werden die Daten letztendlich spezifikationsgemäß, denn wenn ein PRIMARY KEY über `TIMESTAMP`,`DEVICE` und `READING` existiert, kommt innerhalb ein und derselben Sekunde nur der zeitlich erste aller Werte in die Datenbank. `TIMESTAMP` unterscheidet ja nur ganze Sekunden.


Ja und? Warum stellst du dich sich so an? 8)
Als Beispiel seien Homematic-Schalter genannt. Nach einen "on"-Befehl gehen sie über den State "set_on" in den State "on". In der DB steht nun aber als endgültiger State "set_on". Das "on" wird verschluckt, da es in der selben Sekunde eintrifft. >:( Dieses Verhalten stört bei der Weiterverarbeitung der Daten...


Lass doch den PRIMARY KEY weg. 8)
Das funktioniert sogar. :) Wobei ich mich frage, ob es ein "zufälliges" Funktionieren ist. Im Moment nimmt DbLog für z. B. SVGs den zeitlich letzten Wert innerhalb einer Sekunde*). Ist sichergestellt, dass dieses Verhalten so bleibt?


Nimm doch `TIMESTAMP`,`DEVICE`, `READING` und `VALUE` als PRIMARY KEY. 8)
Meine DB kann das nicht... (Mangels weitergehender MySQL-Kenntnissen weiß ich auch gar nicht, ob so etwas erlaubt wäre...)


?? :-\
"FileLog" und "Global" haben ein Attribut "mseclog" (https://fhem.de/commandref_DE.html#mseclog). Mir würde die Aufnahme der Millisekunden in den `TIMESTAMP` helfen. Allerdings scheinen sich diese Attribute nicht auf das Verhalten von DbLog durchzuschlagen.


?? :-\
Helfen würde mir auch, wenn der zeitlich letzte Wert in die DB geschrieben werden würde. Ich könnte mir sogar vorstellen, dass dies das sinnvollste Verhalten für alle Nutzer wäre.


Hier endlich der Schluss: Liege ich mit meinen Annahmen richtig? Hilf mir bitte, wenn ich wieder einen Knoten im Gehirn habe und den Wald vor lauter Bäumen nicht sehe. Aktuell behelfe ich mich damit, dass ich den PRIMARY KEY entfernt habe.



*) = Vermutung; Verhalten nicht ausgiebig getestet...

ch.eick

Zitat von: GaiusMarius am 01 März 2021, 10:56:00
Lass doch den PRIMARY KEY weg. 8)
Das funktioniert sogar. :) Wobei ich mich frage, ob es ein "zufälliges" Funktionieren ist. Im Moment nimmt DbLog für z. B. SVGs den zeitlich letzten Wert innerhalb einer Sekunde*). Ist sichergestellt, dass dieses Verhalten so bleibt?
Du solltest dann in der DB bei diesem Device eine Vielzahl von Einträgen mit dem selben TIMESTAMP bekommen. Die Spalte TIMESTAMP ist jedoch nur ein Text Feld in der Tabelle und es gibt darüber hinaus noch den Timestamp der Datenbank, der das ganze eindeutig macht.
Eine Sortierung nach TIMESTAMP wird Dir die Einträge nicht zwangsläufig in die richtige Reihenfolge bringen.
Das Datenmodel von FHEM ist da für das TIMESTAMP Feld nicht granular genug :-(

Zitat
Nimm doch `TIMESTAMP`,`DEVICE`, `READING` und `VALUE` als PRIMARY KEY. 8)
Meine DB kann das nicht... (Mangels weitergehender MySQL-Kenntnissen weiß ich auch gar nicht, ob so etwas erlaubt wäre...)
Das könntest Du tun, jedoch verschiebt sich das Problem nur um ein weites Feld.
Wenn in der selben Sekunde zwei mal der selbe VALUE kommt ist auch einer weg.

Zitat
?? :-\
"FileLog" und "Global" haben ein Attribut "mseclog" (https://fhem.de/commandref_DE.html#mseclog). Mir würde die Aufnahme der Millisekunden in den `TIMESTAMP` helfen. Allerdings scheinen sich diese Attribute nicht auf das Verhalten von DbLog durchzuschlagen.
FileLog ist nicht gleich DbLog :-)

Zitat
?? :-\
Helfen würde mir auch, wenn der zeitlich letzte Wert in die DB geschrieben werden würde. Ich könnte mir sogar vorstellen, dass dies das sinnvollste Verhalten für alle Nutzer wäre.
Ich denke nicht, das Heiko eine Änderung des Datenmodels durchführen möchte. Ich glaube er hat das Modul auch nur geerbt.

Könntest Du bei dem Homematic auf den Zwischenstatus verzichten?
Über ein userreading könnte man einen Zwischenfilter implementieren, der erst Triggert, wenn der endgültige Status gesetzt ist. Den könntest Du dann loggen und Darstellen.
Ich frage mich, ob es eh Sinn macht einen Taster Status im Raster kleiner 1 Sekunde zu loggen, womit mein Vorschlag dann denkbar  würde.

VG
Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

Otto123

Ich habe wenig Ahnung von dbLog und verwende sie nicht.
Aber warum sollte man eigentlich (gerade bei Homematic) jeden Krümel loggen? Da blubbert derart viel durch den state ....
Definiere doch einfach ein ordentliches regExp? So in der Art?
Kontakte.:o[nf]+
Damit wird nur der state on und off von KontakteX geloggt  (zumindest fast:) )

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ch.eick

Zitat von: Otto123 am 01 März 2021, 13:52:01
Aber warum sollte man eigentlich (gerade bei Homematic) jeden Krümel loggen? Da blubbert derart viel durch den state ....
Definiere doch einfach ein ordentliches regExp? So in der Art?
Kontakte.:o[nf]+
Damit wird nur der state on und off von KontakteX geloggt  (zumindest fast:) )
Sowas hatte ich gemeint, aber ich habe ja kein HM, danke Otto.

VG
  Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

GaiusMarius

Zitat von: ch.eick am 01 März 2021, 12:07:05
Eine Sortierung nach TIMESTAMP wird Dir die Einträge nicht zwangsläufig in die richtige Reihenfolge bringen.
Das Datenmodel von FHEM ist da für das TIMESTAMP Feld nicht granular genug :-(
Ja leider, deshalb auch meine Formulierung "zufällig richtig".

Zitat von: ch.eick am 01 März 2021, 12:07:05
Das könntest Du tun, jedoch verschiebt sich das Problem nur um ein weites Feld.
Wenn in der selben Sekunde zwei mal der selbe VALUE kommt ist auch einer weg.
Wobei man hier argumentieren könnte, dass dann immerhin das Ergebnis korrekt wäre.

Zitat von: ch.eick am 01 März 2021, 12:07:05
FileLog ist nicht gleich DbLog :-)
Echt? 8) Ich kenne weder die Historie noch die Gründe für die Implementierung, aber es kann die Millisekunden. Einen Grund dafür muss es ja gegeben haben. Ich will mir auch nicht anmaßen, zu behaupten, dass es irgendwie einfach wäre, so etwas in DbLog einzubauen.

Zitat von: ch.eick am 01 März 2021, 12:07:05
Ich denke nicht, das Heiko eine Änderung des Datenmodels durchführen möchte. Ich glaube er hat das Modul auch nur geerbt.
Heiko? Heiko! ::)

Zitat von: ch.eick am 01 März 2021, 12:07:05
Könntest Du bei dem Homematic auf den Zwischenstatus verzichten?
[...]
Ich frage mich, ob es eh Sinn macht einen Taster Status im Raster kleiner 1 Sekunde zu loggen, womit mein Vorschlag dann denkbar  würde.
Zitat von: Otto123 am 01 März 2021, 13:52:01
Aber warum sollte man eigentlich (gerade bei Homematic) jeden Krümel loggen?
Ich benötige die Zwischenstati nicht. Ihr habt da völlig Recht.


Es wäre halt einfach eleganter, wenn das Phänomen im Architekur-Umfeld von DbLog gelöst werden könnte.
  • Aufnahme der Millisekunden in `TIMESTAMP`
oder
  • Internes Speichern aller `TIMESTAMP`,`DEVICE` und `READING` einer Sekunde und Übergabe des zeitlich jüngsten Wertes an die DB

Ich schreibe mal einen Wunschzettel. Wichtig ist, dass ich nichts falsch verstanden habe.

Danke!