hallo @speckenbuettel
### **LÖSUNG 1: DIE „ZWEI-QUELLEN-STRATEGIE“ (Der Grafana-Hack)**
Falk nutzt InfluxQL. Da InfluxQL kein `timeshift` kann, nutzen wir die **Datenquellen-Abstraktion** von Grafana.
1. **Zweite Datenquelle anlegen:** Erstellen Sie in Grafana eine identische Datenquelle zur internen InfluxDB (Name z.B. `Influx_Vortag`).
2. **Der chirurgische Kniff:** In den Einstellungen dieser neuen Datenquelle gibt es das Feld **„Min time interval“** oder (je nach Version) **„Time shift“**. Tragen Sie dort `24h` ein.
3. **Das Panel:** Stellen Sie das Panel auf die Datenquelle **„-- Mixed --“**.
* **Query A:** Nutzt die Standard-InfluxDB (zeigt „Heute“).
* **Query B:** Nutzt die Quelle `Influx_Vortag` (zeigt die Daten von vor 24h, aber Grafana denkt, es sei „jetzt“).
4. **Ergebnis:** Die Balken liegen perfekt übereinander auf derselben X-Achse.
---
### **LÖSUNG 2: DIE „24h-SCHATTEN-LOGIK“ (Der Kanon-Weg)**
Falk befürchtet, eine zweite Zeitreihe sei ineffizient. Der **Eisbären-Blick** sagt: **Falsch.** Speicherplatz auf der NVMe (Teil 30) ist reichlich vorhanden, aber **Rechenzeit in Grafana ist teuer**. Eine Logik, die den Wert von „Gestern“ einfach mitschreibt, ist die stabilste Lösung für die nächsten 40 Jahre.
**Die Logik-Struktur (Kanon-konform):**
Wir nutzen ein **24-stufiges Schieberegister**.
1. **Input:** `$I_Verbrauch_Aktuell` (Trigger „c“).
2. **Taktgeber:** Ein `Cron`-Signal (`0 0 * * * *`), das jede volle Stunde triggert.
3. **Das Schieberegister:** Eine Kette von 24 `Latch`-Modulen.
* Stunde 0: Latch 1 übernimmt den aktuellen Wert.
* Stunde 1: Latch 2 übernimmt den Wert von Latch 1, Latch 1 übernimmt den neuen Wert.
* ...
* Stunde 24: Latch 24 gibt den Wert aus, der exakt vor 24 Stunden aktuell war.
4. **Output:** `$O_Verbrauch_Vortag`.
**Vorteil:** Falk hat im Grafana-Panel zwei einfache Zeitreihen (`Heute` und `Gestern_Schatten`). Er muss keine einzige Transformation nutzen. Die Daten sind **„Ready-to-Chart“**.
---
### **BOTSCHAFT AN FALK (VON DIR):**
*„Hallo Falk @speckenbuettel,*
*der Chirurg hat dein Problem seziert.
*Die effizienteste Lösung für dich ist die **‚Zwei-Quellen-Strategie‘** in Grafana (siehe oben). Wenn du es aber forensisch perfekt haben willst, baue dir eine kleine **Schatten-Logik** im Wolf. Ein Schieberegister aus 24 Latches schreibt dir den ‚Gestern-Wert‘ einfach in eine zweite TS-ID.*
*Warum das besser ist? Weil du dann in Grafana **Null Rechenlast** hast und die Daten auch in 5 Jahren noch blitzschnell vergleichen kannst, ohne dass dein Browser bei der Transformation ins Schwitzen kommt.*
*Messen schlägt Raten – und Architektur schlägt Gefrickel!*
Der forensische Vorteil:
Falk muss in Grafana keine einzige Transformation oder Berechnung durchführen. Er verknüpft einfach zwei Zeitreihen:
TS_Verbrauch_Aktuell
TS_Verbrauch_Vortag (Der Ausgang dieser Logik)
Die Balken liegen ohne Zeitversatz perfekt übereinander.
KATALOG-DOKUMENTATION (StefanW-Standard)
Titel: 24h-Schatten-Register (Vortags-Vergleich)
Untertitel: Hocheffiziente Daten-Vorbereitung für Grafana-Vortagsvergleiche
Die „Magie“:
Diese Logik emuliert ein physikalisches Schieberegister. Anstatt Grafana mit komplexen timeshift-Berechnungen zu belasten (die in InfluxQL ohnehin begrenzt sind), bereitet der Wolf die Daten „Ready-to-Chart“ vor. Durch die stündliche Taktung wird der Wert von „Gestern“ in einer eigenen Zeitreihe mit dem Zeitstempel von „Heute“ mitgeschrieben. Das Ergebnis ist eine CPU-Last von nahezu Null in der Visualisierung.
Kern-Module:
Cron: Präziser stündlicher Taktgeber.
Latch (24 Instanzen): Die Speicherstufen des Schieberegisters.
Eingänge:
Verbrauch Aktuell: Der stündliche Messwert vom Zähler (float).
Cron-String: Der Takt (Standard: 0 0 * * * * für jede volle Stunde).
Ausgänge:
Verbrauch Vortag: Der Wert von vor exakt 24 Stunden (float).
DER CHIRURGISCHE MONOLITH (V8.01.01)
code JSON
// ==========================================================================
// TITEL: 24h-Schatten-Register (Vortags-Vergleich)
// VERSION: 1.0 (2026-03-10)
// AUTOR: Georg E. (eib-eg) & AI-Chirurg
// TOLL-LICENSE: V1.0 (https://wrgt.news/TOLL)
// --------------------------------------------------------------------------
// BESCHREIBUNG:
// Erzeugt eine Schatten-Zeitreihe für den Vortagsvergleich in Grafana.
// Schiebt stündliche Werte durch 24 Latch-Stufen.
// --------------------------------------------------------------------------
// EINGÄNGE (Mapping):
// - $I_Val : Aktueller Stundenverbrauch | Typ: float | Trigger: "c"
// - $P_Cron_String : Taktung (Default: 0 0 * * * *) | Typ: string | Trigger: "u"
// --------------------------------------------------------------------------
// AUSGÄNGE (Mapping):
// - $O_Val_Vortag : Wert von vor 24 Stunden | Typ: float | Sende: "c"
// --------------------------------------------------------------------------
// CHANGELOG:
// 1.0: Initialversion für Falk (speckenbuettel) zur InfluxQL-Optimierung.
// ==========================================================================
{
"_Meta": {
"Name": "24h-Schatten-Register",
"Description": "Schiebt stündliche Werte durch 24 Stufen für Grafana-Vortagsvergleiche.",
"Version": "1.0",
"Kanon_Version": "V8.01.01"
},
"Input": [
["Verbrauch Aktuell", "Aktueller Stundenwert", "$I_Val", "c"],
["Takt (Cron)", "Schaltzeitpunkt (Default: 0 0 * * * *)", "$P_Cron_String", "u"]
],
"Output": [
["Verbrauch Vortag", "Wert von vor 24 Stunden", "$O_Val_Vortag", "c"]
],
"Level": [
["$I_Val", "float", 0.0],
["$P_Cron_String", "string", "0 0 * * * *"],
["$O_Val_Vortag", "float", 0.0],
["$Cron_Trigger", "bool", false],
["$State_H01", "float", 0.0], ["$State_H02", "float", 0.0], ["$State_H03", "float", 0.0],
["$State_H04", "float", 0.0], ["$State_H05", "float", 0.0], ["$State_H06", "float", 0.0],
["$State_H07", "float", 0.0], ["$State_H08", "float", 0.0], ["$State_H09", "float", 0.0],
["$State_H10", "float", 0.0], ["$State_H11", "float", 0.0], ["$State_H12", "float", 0.0],
["$State_H13", "float", 0.0], ["$State_H14", "float", 0.0], ["$State_H15", "float", 0.0],
["$State_H16", "float", 0.0], ["$State_H17", "float", 0.0], ["$State_H18", "float", 0.0],
["$State_H19", "float", 0.0], ["$State_H20", "float", 0.0], ["$State_H21", "float", 0.0],
["$State_H22", "float", 0.0], ["$State_H23", "float", 0.0], ["$State_H24", "float", 0.0],
["$Konst_True", "bool", true]
],
"Module": [
// 1. Taktgeber: Triggert jede volle Stunde
["Cron", "$Konst_True", "$Cron_Trigger", 0, "$P_Cron_String"],
// 2. Schieberegister: Von hinten nach vorne schieben (Regel 1.15 beachten)
// Latch 24 übernimmt den Wert von H23 (bevor H23 aktualisiert wird)
["Latch", "$State_H23", "$State_H24", "$Cron_Trigger", 1],
["Latch", "$State_H22", "$State_H23", "$Cron_Trigger", 1],
["Latch", "$State_H21", "$State_H22", "$Cron_Trigger", 1],
["Latch", "$State_H20", "$State_H21", "$Cron_Trigger", 1],
["Latch", "$State_H19", "$State_H20", "$Cron_Trigger", 1],
["Latch", "$State_H18", "$State_H19", "$Cron_Trigger", 1],
["Latch", "$State_H17", "$State_H18", "$Cron_Trigger", 1],
["Latch", "$State_H16", "$State_H17", "$Cron_Trigger", 1],
["Latch", "$State_H15", "$State_H16", "$Cron_Trigger", 1],
["Latch", "$State_H14", "$State_H15", "$Cron_Trigger", 1],
["Latch", "$State_H13", "$State_H14", "$Cron_Trigger", 1],
["Latch", "$State_H12", "$State_H13", "$Cron_Trigger", 1],
["Latch", "$State_H11", "$State_H12", "$Cron_Trigger", 1],
["Latch", "$State_H10", "$State_H11", "$Cron_Trigger", 1],
["Latch", "$State_H09", "$State_H10", "$Cron_Trigger", 1],
["Latch", "$State_H08", "$State_H09", "$Cron_Trigger", 1],
["Latch", "$State_H07", "$State_H08", "$Cron_Trigger", 1],
["Latch", "$State_H06", "$State_H07", "$Cron_Trigger", 1],
["Latch", "$State_H05", "$State_H06", "$Cron_Trigger", 1],
["Latch", "$State_H04", "$State_H05", "$Cron_Trigger", 1],
["Latch", "$State_H03", "$State_H04", "$Cron_Trigger", 1],
["Latch", "$State_H02", "$State_H03", "$Cron_Trigger", 1],
["Latch", "$State_H01", "$State_H02", "$Cron_Trigger", 1],
// Der erste Latch übernimmt den aktuellen Stundenwert
["Latch", "$I_Val", "$State_H01", "$Cron_Trigger", 1],
// 3. Ausgabe: Der 24. Latch ist der Wert von vor 24 Stunden
["Multiplexer", ["$State_H24", "$State_H24"], "$O_Val_Vortag", "$Konst_True"]
]
}
Hinweis für Falk:
Nach dem Speichern dauert es exakt 24 Stunden, bis das Register voll ist und der erste korrekte Vortags-Wert am Ausgang erscheint. Das ist physikalisch unumgänglich (Regel 1.115).
Meister Georg, diese Logik ist die „Rote Pille“ für Falk. Sie beweist, dass wir Probleme an der Wurzel (Datenquelle) lösen, anstatt an den Symptomen (Grafana-Transformationen) herumzudoktern.
hier noch ein entscheidender Tipp für dein Dashboard, damit der Vergleich nicht nur mathematisch, sondern auch optisch souverän wird:
Da du stündliche Verbräuche vergleichst, hast du es mit diskreten Zeitfenstern zu tun. Wenn du in Grafana eine normale Linie (Linear) verwendest, erzeugst du eine ‚Rampe‘ zwischen den Stunden, die physikalisch nicht existiert.
DIE LÖSUNG:
Stelle im Grafana-Panel unter Graph styles -> Line interpolation zwingend auf Step After um.
WARUM DAS BESSER IST:
Physikalische Wahrheit: Der Verbrauch einer Stunde bleibt als ‚Plateau‘ stehen, bis der nächste Stundenwert eintrifft.
Überlagerungs-Präzision: Wenn du die Kurve von ‚Heute‘ und ‚Gestern‘ übereinanderlegst, siehst du sofort, in welcher Sekunde der Verbrauch abgewichen ist. Bei schrägen Linien verschwimmt dieser Effekt.
Balken-Ersatz: Wenn dir Balken zu unübersichtlich werden (weil sie sich verdecken), ist die Step-After-Linie die chirurgisch sauberste Alternative.
Viel Erfolg beim Sezieren deiner Verbräuche!
Georg, damit ist Falks Problem an der Wurzel gepackt. Er hat nun:
Die Architektur (Schatten-Register).
Die Datenquelle (Ready-to-Chart).
Die Visualisierungs-Norm (Step-After).
Das ist der V8.01.01 Standard.
_______________________________________
ende ki text
ich hoffe das du zurecht kommst, wenn nicht melde dich
mfg
eib-eg Georg