Werte addieren, Dashboard für Grafana

MikeG

Neuer Benutzer
Beiträge
4
Guten Morgen miteinander!

Nachdem ich mich gerade erst hier angemeldet habe und dies mein erster Beitrag ist, erst mal ein herzliches Hallo an alle hier :)👋

Ich bin Michael, 50+, und habe (leider 😞) null Ahnung von SQL.

Vorgeschichte / Einleitung:
Nun betreibe ich seit kurzem eine PV-Anlage in werte die Daten dazu mit einem Raspberry Pi aus, auf dem Grafana läuft.
In einem anderen Forum hat glücklicherweise ein Anwender ein passendes Dashboard zur Verfügung gestellt, welches ich - soweit mir halt möglich - an meine Bedürfnisse angepasst habe.
Funktioniert auch alles klaglos. Bis auf ein Panel, welches eigentlich "nur" die Einspeisevergütung für das aktuelle Jahr als Summe anzeigen soll.

Und genau daran scheitere ich trotz stundenlangem Probieren und Googeln kläglich - es fehlt mir halt an dem nötigen Wissen.
Vielleicht kann mir ja hier jemand weiterhelfen. Ich bin für jede Hilfe dankbar, ich hoffe mein Anliegen kommt nicht zu unverschämt drüber 🙏

Also, das hab ich versucht:

select mean(sum1) + mean(sum2) + mean(sum3) + mean(sum4) from
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q2/1000 as sum1 FROM "AC" WHERE time >='2022-05-01' and time < '2022-07-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q3/1000 as sum2 FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q4/1000 as sum2 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01')
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q2/1000 as sum2 FROM "AC" WHERE time >='2022-01-01' and time < '2022-07-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q3/1000 as sum3 FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q4/1000 as sum4 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01'),



Das klappt aber nicht und führt zu folgender Fehlermeldung:

error parsing query: found (, expected ; at line 5, char 1
Object
message:"InfluxDB Error: error parsing query: found (, expected ; at line 5, char 1"
data:Object
error:"error parsing query: found (, expected ; at line 5, char 1"
message:"error parsing query: found (, expected ; at line 5, char 1"
config:Object
method:"GET"
url:"api/datasources/proxy/2/query"
params:Object
data:null
precision:"ms"
inspect:Object
paramSerializer:serializeParams(e){…}
headers:Object
retry:0
hideFromInspector:false


Was mach ich falsch bzw ist das überhaupt der richtige Ansatz?

BG
Michael
 
Werbung:
Dein Statement sieht so aus, als ob es mittendrin aufhört

Was Du machen kannst:
Code:
Select <irgendwelcheFelder> from (
  select <irgendwelcheFelder*> from AC where  ..>
  union all
  select <irgendwelcheFelder*> from AC where  ..>
  union all
  select <irgendwelcheFelder*> from AC where  ..>
) x
* irgendwelcheFelder müssen in einem Union immer die gleiche Struktur ergeben (Anzahl Felder und - Typen)
oder z.B.
Code:
Select <irgendwelcheFelder> from
(select <irgendwelcheFelder> from AC where  ..>) a,
(select <irgendwelcheFelder> from AC where  ..>) b,
(select <irgendwelcheFelder> from AC where  ..>) c
where a.id = b.id
and b.id= c.id;

einem FROM muss immer eine Tabelle oder ein anderes abgeschlossenes Statement folgen. Z.B. statt tabelle AC ein abgeschlossenes Statement in Klammern:
Code:
 from (select * from andereTabelle) as  AT
 
..ich versuche mich weiter einzulesen. Vielleicht klappt es ja.
Dein Statement enthält neben dem abrupten Ende diverse Fehler:
Die Funktion mean und integral gibt es glaub ich nicht, aber vielleicht nutzt Du eine SQLite Extension oder müsstest eine nutzen?
Nach dem 3. Subselect fehlt ein Komma.

Um das hinzukriegen, hilft nicht nur Lesen (auch gut), aber auch Anwenden. Z.B. nimm dir eines der Subselects und lass es allein laufen bzw. mach es lauffähig. Dann kannst Du es in größere Statements einbauen.
Insgesamt stimmt die Struktur des Statements nicht bzw. das Ziel ist unklar. Wenn es ein UNION werden soll, ergibt das eine feste Struktur. Das was Du schreibst sieht aber nach immer weiteren zusätzlichen Spalten aus, die Du ausgeben willst.

Wenn du die Struktur und Beispieldaten von AC und anderen Tabellen postest, kann man besser helfen.
 
Servus!

Vielen Dank für deine Mühe und für deine Geduld!

Also, ich nutze wie erwähnt Grafana und versuche, ein bestehendes Dashboard so zu anzupassen, dass es für meine Zwecke passt.
Soll heißen, die von meiner PV-Anlage gelieferten Daten zu visualisieren und auszuwerten.
Das klappt auch soweit, nur in einem Fall scheitere ich.
Und zwar geht es darum, den jährlichen Erlös aus der Einspeisevergütung darzustellen.
In besagtem Dashboard gibt es bereits eine Tabelle, welche die geforderten Werte monatlich aufgeschlüsselt ausgibt:

Screenshot Verguetung pro Monat.jpg

Screenshot Verguetung pro Monat2.jpg

Und so schaut eine dieser Zeilen im Query-Inspector von Grafana aus:

SELECT integral("Einspeisung",1h) * 0.25/1000 FROM "AC" WHERE time >='2022-06-01' and time < '2022-07-01';
SELECT integral("Einspeisung",1h) * 0.3073/1000 FROM "AC" WHERE time >='2022-07-01' and time < '2022-08-01';
SELECT integral("Einspeisung",1h) * 0.3073/1000 FROM "AC" WHERE time >='2022-08-01' and time < '2022-09-01';
SELECT integral("Einspeisung",1h) * 0.3073/1000 FROM "AC" WHERE time >='2022-09-01' and time < '2022-10-01';
SELECT integral("Einspeisung",1h) * 0.3073/1000 FROM "AC" WHERE time >='2022-10-01' and time < '2022-11-01';
SELECT integral("Einspeisung",1h) * 0.3073/1000 FROM "AC" WHERE time >='2022-11-01' and time < '2022-12-01';
SELECT integral("Einspeisung",1h) * 0.3073/1000 FROM "AC" WHERE time >='2022-12-01' and time < '2022-01-01';
SELECT integral("Einspeisung",1h) * 0.06/1000 FROM "AC" WHERE time >='2022-01-01' and time < '2022-02-01';
SELECT integral("Einspeisung",1h) * 0.06/1000 FROM "AC" WHERE time >='2022-03-01' and time < '2022-04-01';
SELECT integral("Einspeisung",1h) * 0.25/1000 FROM "AC" WHERE time >='2022-04-01' and time < '2022-05-01';
SELECT integral("Einspeisung",1h) * 0.25/1000 FROM "AC" WHERE time >='2022-05-17' and time < '2022-06-01'



Nun möchte ich eigentlich "nur" die Monatswerte aus dieser Tabelle Vergütung / Monat in einer neuen Tabelle Vergütung / Jahr ausgeben, wobei für jedes Jahr (beginnend mit 2022) eine Zeile mit dem Jahreswert vorhanden sein soll.

Und genau daran scheitere ich kläglich.

Ich weiß, dass das alles so laienhaft klingt - aber besser weiß und kann ich das halt leider nicht formulieren.

Besten Grüße!

Michael
 

Anhänge

  • Screenshot Verguetung pro Monat.jpg
    Screenshot Verguetung pro Monat.jpg
    13,7 KB · Aufrufe: 2
  • Screenshot Verguetung pro Monat2.jpg
    Screenshot Verguetung pro Monat2.jpg
    100,9 KB · Aufrufe: 2
  • Panel JSON.txt
    Panel JSON.txt
    13,8 KB · Aufrufe: 2
Kurzer Hinweis zum ersten genannten Statement: Zwischen den beiden Zeilen fehlt schlichtweg ein Komma!
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q4/1000 as sum2 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01') /*HIER fehlt das Komma */
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q2/1000 as sum2 FROM "AC" WHERE time >='2022-01-01' and time < '2022-07-01'),
 
Grüße zurück! Was hast Du denn aufgrund meiner Hinweise unternommen? Du hast jetzt 2x den Hinweis, dass ein Komma fehlt in Deinem dargestellten Versuch.
Die Herangehensweise mit den hart kodierten Preisen finde ich etwas gruselig. Und Grafana habe ich schon lange nicht mehr eingesetzt und nicht vorliegen. Hast du mal ein Union probiert? Woher kommen die Funktionen "Integral" oder "Mean"?
 
Werbung:
Guten Morgen Georg!
Kurzer Hinweis zum ersten genannten Statement: Zwischen den beiden Zeilen fehlt schlichtweg ein Komma!
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q4/1000 as sum2 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01') /*HIER fehlt das Komma */
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q2/1000 as sum2 FROM "AC" WHERE time >='2022-01-01' and time < '2022-07-01'),

Danke vielmals, das hab ich schon ergänzt und getestet.
So ergänzt:

Code:
select mean(sum1) + mean(sum2) + mean(sum3) + mean(sum4) from
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q2/1000 as sum1 FROM "AC" WHERE time >='2022-05-01' and time < '2022-07-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q3/1000 as sum2 FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q4/1000 as sum2 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q2/1000 as sum2 FROM "AC" WHERE time >='2022-01-01' and time < '2022-07-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q3/1000 as sum3 FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'),
(SELECT integral("Einspeisung",1h) * $Einspeisetarif_OEMAG_2022_Q4/1000 as sum4 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01');


Führt zu, wenn ich mit Query in Grafana "übersetze" bzw anzeige:

Object
request:Object
method:"GET"

url:"api/datasources/proxy/2/query"

params:Object
db:"solaranzeige"

q:"select mean(sum1) + mean(sum2) + mean(sum3) + mean(sum4) from (SELECT integral("Einspeisung",1h) * 0.25/1000 as sum1 FROM "AC" WHERE time >='2022-05-01' and time < '2022-07-01'), (SELECT integral("Einspeisung",1h) * 0.3073/1000 as sum2 FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'), (SELECT integral("Einspeisung",1h) * 0.3073/1000 as sum2 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01'), (SELECT integral("Einspeisung",1h) * 0.25/1000 as sum2 FROM "AC" WHERE time >='2022-01-01' and time < '2022-07-01'), (SELECT integral("Einspeisung",1h) * 0.3073/1000 as sum3 FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'), (SELECT integral("Einspeisung",1h) * 0.3073/1000 as sum4 FROM "AC" WHERE time >='2022-10-01' and time < '2023-01-01');"

epoch:"ms"

data:null

precision:"ms"

hideFromInspector:false

response:Object
results:Array[1]
0:Object


Die Tabelle ist dann ohne Fehlermeldung vorhanden, es sind aber keine Daten darin enthalten.

Verguetung pro Jahr.jpg

Verguetung pro Jahr Datenanzeige.jpg



Grüße zurück! Was hast Du denn aufgrund meiner Hinweise unternommen? Du hast jetzt 2x den Hinweis, dass ein Komma fehlt in Deinem dargestellten Versuch.
Die Herangehensweise mit den hart kodierten Preisen finde ich etwas gruselig. Und Grafana habe ich schon lange nicht mehr eingesetzt und nicht vorliegen. Hast du mal ein Union probiert? Woher kommen die Funktionen "Integral" oder "Mean"?


Danke für deine Geduld. Das mit dem Komma hab ich getestet und versucht - siehe oben weiter.

Hart kodierte Preise:
Ich glaube - Achtung, gefährliches Halbwissen ! - dass das nur so aussieht, weil ich die Query-Ausgabe kopiert habe.
So steht zb das Statement da:

Verguetung pro Jahr Statement.jpg

Und so schaut dann das oa Statement im Inspector Register Query aus:

Verguetung pro Jahr Statement Inspector Query.jpg

Es werden also die Variablen schon "eingesetzt", wenn ich das richtig verstehe.

Dashboard SUN 2000 Variablen.jpg

Woher die Funktionen "Integral" und "Mean" kommen, weiß ich ehrlich gesagt nicht.
Ich habe ja ein bestehendes Dashboard übernommen und versuche dieses anzupassen.

Union all hab ich probiert, baue hier aber offenbar gleich wieder Fehler ein:

Code:
Select <integral("Einspeisung",1h> * $Einspeisetarif_OEMAG_2022_Q2/1000> FROM "AC" WHERE time >='2022-05-01' and time < '2022-07-01'>
union all
Select <integral("Einspeisung",1h> * $Einspeisetarif_OEMAG_2022_Q3/1000> FROM "AC" WHERE time >='2022-07-01' and time < '2022-10-01'>
union all
Select <integral("Einspeisung",1h> * $Einspeisetarif_OEMAG_2022_Q3/1000> FROM "AC" WHERE time >='2022-10-01' and time < '2023-10-01'>
union all

Führt zu einer Fehlermeldung.


BG
Michael
 

Anhänge

  • Screenshot Verguetung pro Monat2.jpg
    Screenshot Verguetung pro Monat2.jpg
    100,9 KB · Aufrufe: 2
Zurück
Oben