InfluxDBLogger: Verständnisfragen zum DB-Aufbau (measurement, tags und fields)

Begonnen von Omega, 16 Dezember 2020, 15:51:17

Vorheriges Thema - Nächstes Thema

Omega

Was ich bisher verstanden habe: im "define" gebe ich Zieladresse meines InfluxDB-Servers, eine Datenbank (die ich vorher anlegen muss) und mit der "defspec"-Angabe welches Device (oder mehrere) über InfluxDBLogger verwaltet werden sollen.

Nicht richtig verstanden habe ich das Prinzip mit measurement, tags und fields in Verbindung mit den Devices.

Mein Ziel: sinnvoller Aufbau einer DB-Struktur. Felder, die sich immer zeitgleich ändern, möchte ich zusammenfassen, ansonsten sollen diese Felder separat gespeichert werden aber immer unter dem Oberbegriff "Device" bzw. measurement.
Konkretes Beispiel:
Eine Datenbank solaranlage.
   Darunter (zur Gruppierung) aus FHEM-Sicht die Devices (S10E, E3DC_Control, sm.Heizungskeller, sm.Vorratskeller).
      Nächste Ebene sind die Devices mit unterschiedlichen Differenzierungen
      S10E
      |__Netz   ---> enthält dann als fields die sekündlich geänderten Readings gridwatt und homewatt
      |__PV        ---> enthält (wenn die Sonne scheint) die sekündlich geänderten Readings wie Gesamtleistung, Daten zu String1, String2, ...
      |__BATT     ---> alle Readings, die zur Batterie gehören und gleichzeitig geändert werden (sekündlich).
      |__AV        ---> alle Readings mit minütlichen Durchschnittswerten (avsunwatt,avbattwatt,avhomewatt,avgridwatt,avbattsoc)
      |__X1        ---> ab hier alle Readings, die unregelmäßig bzw. ohne konkreten Zusammenhang zu anderen Readings (jeweils einzeln)
      |__X2
      |__X3
      
      
      E3DC_Control ... ähnliche Anforderungen

Die Aufteilung habe ich mir so überlegt, um Daten zusammenzufassen wo sinnvoll aber andere separat aufführen, da eine Speicherung der Daten nur sinnvoll ist, wenn diese auch wirklich anfallen (die Sonne scheint, die Batterie wird verwendet, ...). Nachts dauerhaft Nullwerte zu speichern für die PV-Leistung finde ich kontraproduktiv.
      
Ist das so in FHEM überhaupt umsetzbar? Mir ist absolut nicht klar, wie ich das mit den Attributen (measurement, tags und fields) lösen könnte. Erst recht dann nicht, wenn mehrere Devices zu definieren sind.

Bisher verwendet habe ich die Attribute:
   fields $READINGNAME=$READINGVALUE
   measurement $DEVICE
   tags -
Das deckt meine Vorstellungen aber nicht ab.

LG
Holger
NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave

timmib

Hallo Holger,

vorneweg:
Bei Influx2 kannst Du mit den Tags und Fields im UI rumspielen. Denn dort kann man das https://docs.influxdata.com/influxdb/v2.0/reference/syntax/line-protocol/ einfach eingeben und gucken wie es in der DB landet.
Bei Influx1 geht es auch über die cmd-line und über curl.

In Deinem Fall landest Du wohl bei:

measurement $DEVICE
also eine "Tabelle" pro Device wie ich Dich verstanden habe.

tags -
Also erstmal keine Tags, anders als der default.

fields $READINGNAME=$READINGVALUE
Also pro Reading ein Feld wo die Werte drin landen.

Wieviele InfluxDBLogger Devices Du dafür brauchst hängt von deinen Includes und Excludes ab. Grundsätzlich reichen würde eines, da das measurement und fields ja dynamisch sind.

Ich hoffe das hilft erstmal als Startpunkt.

Viele Grüße

Tim

Omega

Das trifft es leider nicht, das ist das wie ich es bisher verwendet habe. Es landen dann alle Readings unterhalb des Device.
Logge ich z.B. 1 min, habe ich 59 Zeilen, in denen die AV-Werte  (avsunwatt,avbattwatt,avhomewatt,avgridwatt,avbattsoc) nichts enthalten.
Wenn das in der DB gespeichert wird, ist das ein "Haufen" Nichts. Daher mein Wunsch, das zu separieren wie beschrieben.
NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave

haxtibal

Hallo Holger,

ZitatDaher mein Wunsch, das zu separieren wie beschrieben.

Klingt als hättest Du eine Art hierarchisches DB Schema im Sinn. So etwas lässt sich mit InfluxDB meines Wissens nicht direkt abbilden (weil InfluxDB keine relationale DB ist), aber tags bzw. tag sets kommen dem nahe. Das was Du oben beschreibst, könnte man exemplarisch in folgende InfluxDB Tabellen übersetzen:

Series (= measurement, tag set): SE10, ["Netz"]
time       | tag key "subgroup" | field key "gridwatt" | field key "homewatt" |
1609194611 | Netz               |       100            |        50            |
1609194612 | Netz               |       101            |        51            |

Series (= measurement, tag set): SE10, ["AV"]
time       | tag key "subgroup" | field key "Gesamtleistung" | field key "Daten_String1" | field key "Daten_String1" |
1609194620 | AV                 |         500                |            111            |           222             |
1609194680 | AV                 |         600                |            333            |           444             |


Dazu muss man die Tags in Abhängigkeit von $device und $reading konstruieren. Das ginge z.B. so:

define influx1 InfluxDBLogger http://localhost:8086 fhem S10E,E3DC_Control,sm.Heizungskeller,sm.Vorratskeller
attr influx1 measurement $device
attr influx1 tags { InfluxDbUtils_tagset($device, $reading) }


Dann in einer 99_InfluxDbUtils.pm die Funktion InfluxDbUtils_tagset definieren und dort die mehr oder weniger komplizierte Zuordnung machen, z.B.

sub InfluxDbUtils_tagset($$) {
    my ($device, $reading) = @_;

    if ($device eq "SE10") {
        if ($reading eq "gridwatt" or $reading eq "homewatt") {
            return "subgroup=Netz";
        } elsif ($reading eq "avsunwatt" or $reading eq "avbattwatt" or $reading eq "avhomewatt" or $reading eq "avgridwatt" or $reading eq "avbattsoc") {
            return "subgroup=AV";
        }
    }  # elsif usw., oder lookup in einem Hash, oder ...

    return undef;
}


Allerdings ist es glaube ich (ohne exakte Begründung nennen zu können) unüblich, mehrere fields in einer Messung zu haben. Du könntest anstatt dessen einen zusätzlichen Tag einführen:

Series (= measurement, tag set): SE10, ["Netz", "gridwatt"]
time       | tag key "subgroup" | tag key "reading" | field key value |
1609194611 | Netz               |    "gridwatt"     |       100       |
1609194612 | Netz               |    "gridwatt"     |       101       |

Series (= measurement, tag set): SE10, ["Netz", "homewatt"]
1609194611 | Netz               |    "homewatt"     |        50       |
1609194612 | Netz               |    "homewatt"     |        51       |



Oder du könntest Bereits auf measurement Ebene aufteilen, also z.B. in eine Messung "Netz", eine andere Messung "PV", noch eine Messung "AV" usw. Dazu musst man aber entweder mehrere InfluxDBLogger Devices konfigurieren, oder das Modul minimal patchen wie hier https://forum.fhem.de/index.php/topic,117111.0.html beschrieben.

Viele Grüße
Tobias