NEWS
SQL-Protokollierung abfragen
-
@apollon77 Mal ne frage. Wie schaffe ich es aus der etwas komischen speicherung beim sql adapter mehrer id´s mit einer id as name für einen gewissen zeitraum auszulesen damit man es für eine table oder so verwenden kann zb.
SELECTts
astime
,val
asTemperatur Küche
FROM iobroker1.ts_number WHERE id = 56 and ts between timestamp1 and timestamp2 ORDER BY ts DESC LIMIT 1000
SELECTts
astime
,val
asLuftfeuchte Küche
FROM iobroker1.ts_number WHERE id = 57 and ts between timestamp1 and timestamp2 ORDER BY ts DESC LIMIT 1000
das ganze bitte als beispiel funktioniert wenn ich 2 getrennte abfragen mache aber würde das ganze gerne so einlesen bzw ist das ja auch nur ein test es würden ja noch mehr temperaturen usw kommen.Danke für eine info
Mfg smilie108
-
@smilie108 sagte in SQL-Protokollierung abfragen:
aus der etwas komischen speicherung beim sql adapter
Was soll daran komisch sein?
das ganze bitte als beispiel funktioniert wenn ich 2 getrennte abfragen mache aber würde das ganze gerne so einlesen bzw ist das ja auch nur ein test es würden ja noch mehr temperaturen usw kommen.
Und jetzt bitte nochmal verständlich
-
ich versteh nur bahnhof...
was ist das Ziel ??
-
@arteck sagte in SQL-Protokollierung abfragen:
was ist das Ziel ??
Moin,
meine Glaskugel sagt mir, dass das in etwa so aussehen soll, so würde ich das machen.
time Raum Temperatur Luftfeuchtigkeit 2023-10-20 10:00.00 Küche 19 °C 54 % Ist aber nicht ganz deutlich in meiner Glaskugel, kann also auch ganz anders gemeint sein, denn
val
einmal alsTemperatur Küche
dann alsLuftfeuchte Küche
time Temperatur Küche Luftfeuchte Küche 2023-10-20 10:00.00 19 °C 54 % Kommt dann noch ein Zimmer dazu, dann wird die Tabelle breiter.
time Temperatur Küche Luftfeuchte Küche Temperatur Esszimmer Luftfeuchte Esszimmer 2023-10-20 10:00.00 19 °C 54 % 20 °C 50 % Kenne mich aber auch nicht mit dem SQL-DB-Modell aus, was da wo in welcher Tabelle gespeichert ist.
VG
BerndP.S.: Nicht hauen, wenn es dummes Zeug ist, ist scheinbar heute nicht mein Tag
-
Vielleicht hilft dir das weiter:
Subquery -
@smilie108 Die Frage ist zwar ziemlich verwirrend gestellt, aber eventuell suchst Du
SELECT id as name, ts as time, val FROM iobroker1.ts_number WHERE id IN (56, 57)
Alternativ ein Inner join auf die andere Tabelle mit den Objekt-IDs.
Aber irgendwie verstehe ich nicht, warum Du Temperatur und Luftfeuchte im gleichen Ergebnis-Set haben willst.
-
Vielleicht will er ja sowas erreichen?
Meine Glaskugel ist leider auch etwas eingetrübt. -
also eigentlich ist es nicht so schwer.
hier ein beispiel mit allen wahlmöglichkeiten für numerische datenpunkteSELECT dp.name,data.val, data.ts FROM `datapoints` as dp, ts_number as data WHERE dp.id=data.id and data.ts>=1672527600000 and data.ts < 1704063540000 and dp.name in ( "javascript.0.test.test1", "javascript.0.test.test2" )
Zeile 2 werden alle Tabellen ausgewählt, aus denen du daten einsammeln willst. hier ist jede tabelle noch mit einem alias versehen, das man nicht den kompletten namen mit angeben muss
Zeile 1: hier werden alle Felder aufgezählt, die nachher als Daten zurückgegeben werden sollen
ab Zeile 3 wird, ganz wichtig der constraint, also abhängigkeit zwischen den beiden Tabellen abgebildet. Ansonsten erhälst du ein kartesisches Produkt beider Tabellen. Das heißt jeder Datenasatz aus der einen Tabelle wird mit jedem Datensatz aus der anderen Tabelle kombiniert. bei jeweils 100 Datensätzen in beiden Tabellen kommen dann schon mal 100*100 Ergebniszeilen heraus. Das macht dein Server wahrscheinlich Memory-technisch nicht mit und macht auch kein Sinn.
daher dp.id=data.id
die bedingung auf den zeitstempel muss ich glaube ich nicht erklären
bei der wahl von ein oder mehreren datenpunkten, kann man den IN operator nehmen. da kann man dann bequem alle aufzählen ohne zuviel zu wiederholender timestamp kannst du am besten so berechnen
new Date("2023-12-31#23:59:00").getTime()
theoretisch geht es auch mehrere sql-statements in einem ergebnis zurückzugeben. bspw wenn du von ts_number und von ts_bool zurückgeben willst, das würde dann über ein UNION operator gehen, dann muss man sich aber auch um die konvertierung von val kümmern.
daher ist das eigentlich nicht notwendig
https://www.w3schools.com/sql/sql_union.aspdas obige sql statement geht auch noch mit einem join, aber dir reicht glaube ich eine notation vollkommen aus.
-
@oliverio @Codierknecht Codierknecht hatte recht und auch @dp20eic das eine für die graphik in grafana denn wenn man mal 10 sensoren hat kann man 20 bis 30 abfragen nehmen je nach anzahl der werte. was etwas mühselig ist. Das andere ist im vis eine kleine Tabelle die die aktuellen temperaturen anzeigen soll.
Und naja arbeite schn sehre lange mit mysql da mache ich tabellen anders als es diese influx geschichte macht das ist zu unübersichtlich für meinen geschmackaber jeder mag es anderes und das ist gut so
Danke auf alle fälle an alle
DANKE
-
@smilie108 sagte in SQL-Protokollierung abfragen:
als es diese influx geschichte macht
Was denn jetzt? SQL oder Influx?
-
das obige sql statement geht auch noch mit einem join, aber dir reicht glaube ich eine notation vollkommen aus.
Geschmacksache. Ich persönlich finde Joins deutlich besser lesbar.
-
@codierknecht naja er schreibt die datenpunkte in sql gleich rein als in influx und mit influx werde ich einfach nicht warm sorry
Geschmacksache
Allerdings ist es recht fein wenn man bei den Objekten die Protokolierung einfach aktivieren kann die meisten werte die ich allerdings habe kommen über nod red da ich das shon hatte bevor ich iobroker kannte.
Alles neu machen alleine schon von den berechnungen ist mir zu aufwändig außerdem hängt am nod red eine 1500er von Siemens für die ganzen modbus usw geschichten ( Wechselrichter, Wärmepumpe, usw.. )
Von Nodred in iobroker übertrage ich die Daten die ich brauche für vis2.
Naja inzwischen komme ich immer mehr in den iobroker rein und es erschließen sich da noch andere möglichkeiten.
Da aber ein PC nie sicher vor ausfällen lasse ich das meiste in der SPS laufen da ich erstens die sehr gut programieren kann und zweitens dort keine daten verliere.
Die brauchen normalerweise nie einen neustart
Im gegensatz zu allen pc sachen die irgendwann wegen irgendwelcher Updates oder sonstigen Sachen einen neustart brauchen und dann hoffentlich wieder starten wenn nicht wieder irgendwas querschießt.
Bei mysql baue ich halt normalerweise die datenbancken anders aufAber danke muss ich jetzt mal austesten wie das so geht
Danke an all eure hinweiseApropos zur Hardware der sollte das alles schlucken ist ein Lenovo Thinkcenter mit 32gb ram und Intel Gold proz mit nvme und ssd Platte
Hoffe ich habe die meisten fehler ausgebessert und es ist leichter Lesbar
-
@smilie108
Mit Interpunktion und Groß-/Kleinschreibung könnte man den Text sogar sinnverstehend lesen -
@smilie108
Mit Influx werde auch ich nicht warm. SQL ist halt mein täglich Brot.
Ich war nur verwirrt, weil Du plötzlich Influx ins Soiel gebracht hast.Die Tabellen sind schon OK aufgebaut. Die sind halt normalisiert.
Ich würde das SQL eher mit JOIN aufbauen
SELECT dp.name, data.val, data.ts FROM datapoints AS dp INNER JOIN ts_number AS data ON data.id = dp.id WHERE data.ts >= 1672527600000 AND data.ts < 1704063540000 AND dp.name IN ('javascript.0.test.test1', 'javascript.0.test.test2')
Hier mal gleich mit der in meinem Team vorgegebenen Einrückung.
-
@codierknecht Mhm gibt es eigentlich da auch eine möglichkeit den einzelnen id´s andere Namen zuzuweisen.
In meinem fall ist der Name zb "zigbee.0.00158d0009ef1902.temperature" wäre einfach lesbarer wenn ich da zb Temperatur Wohnzimmer draus machen könnte.
Beim ts geht das ja noch wenn ich in Zeile 1 bei data.ts ein as time mache aber bei den einzelen id´s steig ich aus.Im moment mache ich das so
SELECTts
astime
,val
asLuftdruck Küche
FROM iobroker1.ts_number WHERE id = 58 and ts between ${__from} and ${__to} ORDER BY ts DESC LIMIT 10000
Dann bekomme ich in grafana die richtigen arrays.
Normalerweise habe ich pro ts die kompletten Werte für diesen Zeitpunkt und lese sie so aus
SELECT * FROM Azzurro1.Warmepumpe1 where time between $__timeFrom() and $__timeTo() ORDER BY ID DESC LIMIT 10000Dann bekomme ich ein array für die Variabeln und ein für jede Variabel ein array mit den Werten.
Wenn ich die Abfragen verwende die ich von euch bekommen habe bekomme ich 3 arrays mit den bezeichnungen val ts und name.Brauche aber für jeden ts die zb 2 werte dazu.
Hoffe ich habe das jetzt richtig geschrieben oder geht das dann nur über einzelabfragen.
Danke das ihr euer wissen teilt
Stehe da komplett vor einer Wand.
MFg smilie108
Danke im voraus
-
@smilie108
Es ist halt eine technische Abfrage
Wie du es darstellst ist ja wieder was anderes.Wenn man will könnte man in der Datenbank noch eine mappingtabelle
Name zu datenpunkt
Oder name zu id
Hinzufügen
Und das dann in den Ergebnissen ausgeben lassen. -
@smilie108 said in SQL-Protokollierung abfragen:
@codierknecht Mhm gibt es eigentlich da auch eine möglichkeit den einzelnen id´s andere Namen zuzuweisen.
In meinem fall ist der Name zb "zigbee.0.00158d0009ef1902.temperature" wäre einfach lesbarer wenn ich da zb Temperatur Wohnzimmer draus machen könnte.
Beim ts geht das ja noch wenn ich in Zeile 1 bei data.ts ein as time mache aber bei den einzelen id´s steig ich aus.
Danke im vorausIch nutze da einfach einen Alias. Da kannst du den Datenpunkt frei benennen und bist unabhängig von irgendwelcher Hardware. Du kannst - wenn ich’s recht weiß - im SQL-Adapter einen eigenen Namen vergeben
-
@blockmove Ja das ist schon Richtig. das geht in Grafana.
Aber wenn ich dann das Ergebniss in einer Tabelle im vis möchte zb die lezten 10 werte oder so für den eine Verlaufs Anzeige dann geht das so wieder nicht.
Eigentlich müsste das Ergebniss dan ts| Name Var1| wert var 1| Name var 2 | wert var2 usw. aussehen.Wenn ich zb.
SELECTtime
astime
,Aktueller_Energieverbrauch_in_W
asStrom
,Wärmeleistung
asWärme
, ROUND((Wärmeleistung
/Aktueller_Energieverbrauch_in_W
),2) asLeistungsfaktor
FROMWarmepumpe1
where time between $__timeFrom() and $__timeTo() ORDER BY ID DESC LIMIT 1000;
das verwende kann ich es ganz normal als Tabelle verwenden.
So geht es allerdings nicht mit den werten aus der Sql Objekt Sicherung. -
@smilie108
Vielleicht in der Art:SELECT * FROM ( SELECT ts as time, val as Luftdruck_Kueche FROM iobroker1.ts_number WHERE id = 58 AND ts BETWEEN ${__from} AND ${__to} UNION SELECT ts as time, val as Temperatur_Kueche FROM iobroker1.ts_number WHERE id = 59 AND ts BETWEEN ${__from} AND ${__to} UNION SELECT ts as time, val as Blubb FROM iobroker1.ts_number WHERE id = 42 AND ts BETWEEN ${__from} AND ${__to} ) ORDER BY ts DESC LIMIT 10000
Keine Leerzeichen und/oder Umlaute in Variablen oder Feldnamen!
-
@codierknecht Mhm da bekomme ich die Meldung
MySQL meldet: Dokumentation
#1248 - Für jede abgeleitete Tabelle muss ein eigener Alias angegeben werdenDas mit UNION hatte ich schon probiert aber egal wie ich das auch aus der Doku übernommen hatte ging es nicht.
Deswegen dachte ich ja ich frage hier mal wo ihr an dem Adapter arbeitet und sicher das ein oder andere Problem schon gelöst bekommen habt.wenn ich zb
SELECT * FROM
PVTageswerte
WHERE id=3788;code_text ```ID time PV Erzeugt Aktueller Tag Verbrauch am Ausgang Aktueller Tag Gekaufte Energie Aktueller Tag Energie Eingespeist Aktueller Tag Batterie Laden Aktueller Tag Batterie Entladen Aktueller Tag Autark 3788 2023-10-19 23:59:45 16.06 14.18 9.77 10.28 0.04 0 31.29395218002813 12.464 18
mache dann bekomme ich die werte von dem tag als Zeile mit den Überschriften der Spalten .
Und ich war eigentlich der Meinung das sowas eigentlich nicht so schwer sein kann.Wenn das nicht geht muss ich halt wieder alle werte per eigenem Skript wieder in eine verarbeitbare form in die Datenbank schreiben und kann nicht einfach den haken setzen.