Den letzten Eintrag aus DbLog lesen

Begonnen von birdy, 11 Juni 2025, 20:04:02

Vorheriges Thema - Nächstes Thema

birdy

Ich möchte den letzten Eintrag für ein Device:reading aus der DB lesen
In der commandref gibt es dieses Beispiel -> get myDbLog current ALL - - %:temperature

get myDbLog current 1 - - device:reading liefert mir immer alle Einträge aus der DB.
Weder scheint die current Table berücksichtigt zu werden (da gibt es nur einen Eintrag) noch scheint die Resultats Menge auf 1 begrenzt zu werden.
Habe ich da etwas falsch verstanden...

Muss ich mir mit sqlCmd..... den Command zusammenstellen oder gibt es noch eine andre Lösung?

Danke und Gruss
birdy
FHEM  @Debian bullseye @Proxmox VE 8.4.1
GMKtec mit AMD Ryzen 7 5700U
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

Guybrush

#1
select value from history where device = '<device>' && reading = '<reading>' order by timestamp desc limit 1

birdy

Dann geht es also nur mittels SQL Command?
Wie dann der SQL Command aussehen soll, ist mir eigentlich klar.
Dann kann ich direkt von current table lesen, und weil es da sowieso nur 1 Eintrag gibt kann ich erst noch order und limit weglassen  ;)
FHEM  @Debian bullseye @Proxmox VE 8.4.1
GMKtec mit AMD Ryzen 7 5700U
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

betateilchen

#3
Zitat von: birdy am 11 Juni 2025, 20:04:02Ich möchte den letzten Eintrag für ein Device:reading aus der DB lesen

Dazu braucht es kein sqlCmd, dafür gibt es eine eigene get-Variante - die auch in der commandref steht:

get <name> ReadingsVal[Timestamp] <Device> <Reading> <default>

Reads the last (newest) record stored in the history table of the specified Device / Reading combination.
Only the value or the combination of value and timestamp is returned as string "<Wert> , <Timestamp>".
<default> specifies a defined return value if no value can be determined.

Alternativ geht sowas natürlich auch über DbRep.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Guybrush

in welcher Konstellation braucht man denn den letzten Wert aus der DB? da sollte doch der Wert aus dem device genügen oder nicht? das wäre doch nur dann abweichend wenn event-on-* mit mindestwerten versehen ist? dann aber solltem die schwankungen doch im regelfall egal sein, wenn man diese ohnehin nicht mitspeichern möchte?

betateilchen

#5
Spontan fallen mir dazu zwei Szenarien ein, die bei mir im Einsatz sind.

  • man kann in DbLog problemlos "fiktive" Werte loggen, die es in FHEM gar nicht gibt. Das "get ... ReadingVal" ersetzt dann das reguläre ReadingsVal(), um an den Wert aus dem fiktiven device zu kommen.
  • man kann von einer zweiten FHEM Installation aus mit Daten (einer anderen Installation) aus DbLog arbeiten, in der es die devices aus der anderen Installation nicht gibt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

birdy

Zitat von: betateilchen am 12 Juni 2025, 05:51:49Dazu braucht es kein sqlCmd, dafür gibt es eine eigene get-Variante - die auch in der commandref steht:

get <name> ReadingsVal[Timestamp] <Device> <Reading> <default>

Reads the last (newest) record stored in the history table of the specified Device / Reading combination.
Only the value or the combination of value and timestamp is returned as string "<Wert> , <Timestamp>".
<default> specifies a defined return value if no value can be determined.

Danke, so hat es geklappt. Dachte mir doch, dass es eine Möglichkeit ohne sqlCmd gibt

Zitat von: Guybrush am 12 Juni 2025, 08:56:05in welcher Konstellation braucht man denn den letzten Wert aus der DB? da sollte doch der Wert aus dem device genügen oder nicht? das wäre doch nur dann abweichend wenn event-on-* mit mindestwerten versehen ist? dann aber solltem die schwankungen doch im regelfall egal sein, wenn man diese ohnehin nicht mitspeichern möchte?

Gibt bestimmt div. Gründe dafür.............
Es geht mir darum die Tagesendwerte von bestimmten Devices festzuhalten. Darum habe ich mir dummy Device erstellt unter welchen ich immer am Ende des Tags die Endwerte logge, hauptsächlich von Shelly (z.B. den Wert von enegy). Neben dem Totalwert rechne ich auch noch die Differenz zum Vortag und logge die mit. Dazu brauche ich natürlich den letzten Wert, den Endwert des Vortages. So habe ich ein Device welches nur ein paar wenige Werte pro Tag enthält und ich somit über Jahre auf bewahren kann. Dieses Device kann ich dann auch sehr gut für Monats, und Jahres Plot verwenden, sogar über mehrere Jahre hinweg.
FHEM  @Debian bullseye @Proxmox VE 8.4.1
GMKtec mit AMD Ryzen 7 5700U
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)

rabehd

Zitat von: birdy am 12 Juni 2025, 13:15:41Neben dem Totalwert rechne ich auch noch die Differenz zum Vortag und logge die mit. Dazu brauche ich natürlich den letzten Wert, den Endwert des Vortages. So habe ich ein Device welches nur ein paar wenige Werte pro Tag enthält und ich somit über Jahre auf bewahren kann.

Sowas mache ich mit Userreadings und zeitbezogenen Schreiben in die DB.
Außerdem räume ich täglich in dedr DB auf und da kann ich auch "Endwerte" bilden. So habe ich die Werte der letzten Tage häufig und die Vorzeit wie gewünscht selten.
Auch funktionierende Lösungen kann man hinterfragen.

birdy

Ja da gibt es verschiedene Möglichkeiten
Bis jetzt habe ich das auch mit Userrreadings gemach, aber ich hatte immer mal wieder alte Werte in den Userreadings  >:( 
Mit grosser Wahrscheinlichkeit liegt es daran, dass mir der Rechner abgestürzt ist.
Da ich gerade dabei bin von FileLog auf DB Log umzustellen, möchte für meine Berechnung die Werte aus der DB verwenden.
FHEM  @Debian bullseye @Proxmox VE 8.4.1
GMKtec mit AMD Ryzen 7 5700U
CUL 433(a-culfw), CUL 868(SlowRF), Max-Cube CUN geflash, HM-CFG-USB-2 (HMALND)