Zitat von bmx
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Neues Database Plugin
Einklappen
X
-
Moin...neues Problem/Verhalten nach meinem Update: sämtliche 'avg' plots (simples {{ plot.period('', 'Heizung.ise.Aussentemperatur', 'avg', '3d') }}) führen zu folgendem Fehler:
Code:Can not execute query: SELECT MIN(time), ROUND(AVG(val_num * (COALESCE(duration * (time >= %(time_start)s) * (time + duration <= %(time_end)s), 0) + COALESCE(duration / duration * (time + duration - %(time_start)s) * (time < %(time_start)s) * (time + duration >= %(time_start)s), 0) + COALESCE(COALESCE(duration, %(inow)s - time) / COALESCE(duration, %(inow)s - time) * (%(time_end)s - time) * (time + COALESCE(duration, %(inow)s - time) >= %(time_end)s), 0))) / AVG((COALESCE(duration * (time >= %(time_start)s) * (time + duration <= %(time_end)s), 0) + COALESCE(duration / duration * (time + duration - %(time_start)s) * (time < %(time_start)s) * (time + duration >= %(time_start)s), 0) + COALESCE(COALESCE(duration, %(inow)s - time) / COALESCE(duration, %(inow)s - time) * (%(time_end)s - time) * (time + COALESCE(duration, %(inow)s - time) >= %(time_end)s), 0))), 4) FROM log WHERE item_id = %(id)s AND time >= (SELECT COALESCE(MAX(time), 0) FROM log WHERE item_id = %(id)s AND time < %(time_start)s) AND time <= %(time_end)s AND time + COALESCE(duration, %(inow)s - time) > (SELECT COALESCE(MAX(time), 0) FROM log WHERE item_id = %(id)s AND time < %(time_start)s) GROUP BY ROUND(time / %(step)s) ORDER BY time ASC (args OrderedDict([('time_start', 1697131399796), ('time_end', 1697390599797), ('inow', 1697390599797), ('id', 446), ('step', 2592000)])): (1055, "Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'smarthome_db.log.time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") 2023-10-15 19:23:19 ERROR plugins.database mysqldb@: Database: Error for query SELECT MIN(time), ROUND(AVG(val_num * (COALESCE(duration * (time >= 1697131399796) * (time + duration <= 1697390599797), 0) + COALESCE(duration / duration * (time + duration - 1697131399796) * (time < 1697131399796) * (time + duration >= 1697131399796), 0) + COALESCE(COALESCE(duration, 1697390599797 - time) / COALESCE(duration, 1697390599797 - time) * (1697390599797 - time) * (time + COALESCE(duration, 1697390599797 - time) >= 1697390599797), 0))) / AVG((COALESCE(duration * (time >= 1697131399796) * (time + duration <= 1697390599797), 0) + COALESCE(duration / duration * (time + duration - 1697131399796) * (time < 1697131399796) * (time + duration >= 1697131399796), 0) + COALESCE(COALESCE(duration, 1697390599797 - time) / COALESCE(duration, 1697390599797 - time) * (1697390599797 - time) * (time + COALESCE(duration, 1697390599797 - time) >= 1697390599797), 0))), 4) FROM log WHERE item_id = 446 AND time >= (SELECT COALESCE(MAX(time), 0) FROM log WHERE item_id = 446 AND time < 1697131399796) AND time <= 1697390599797 AND time + COALESCE(duration, 1697390599797 - time) > (SELECT COALESCE(MAX(time), 0) FROM log WHERE item_id = 446 AND time < 1697131399796) GROUP BY ROUND(time / 2592000) ORDER BY time ASC: (1055, "Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'smarthome_db.log.time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") 2023-10-15 19:23:19 ERROR modules.websocket.sv Problem fetching series for Heizung.ise.Aussentemperatur: (1055, "Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'smarthome_db.log.time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") - Wrong sqlite/database plugin?
Jemand eine Idee zur Ursache?
edit: ich nutze mysql
Kommentar
-
Eine Idee (ohne eigene Erfahrung mit mySQL):
wenn man die Fehlermeldung im Netz recherchiert gibt es einen Hinweis auf den sql_mode "only_full_group_by", der defaultmäßig aktiviert ist. Du könntest versuchen, ihn zu deaktivieren. Dann akzeptiert mySQL auch nicht-aggregierte Spalten in den GROUP BY und ORDER BY (https://dev.mysql.com/doc/refman/5.7...-handling.html).
Gruß
Wolfram
- Likes 1
Kommentar
-
Vielen Dank. Antwort leider zu spät gelesen. War ein guter Tipp. Ich hatte mir zwischenzeitlich von ChatGPT helfen lassenKann ich nur empfehlen...für alle die es interessiert:
Der Fehler, den Sie sehen, bezieht sich auf die sql_mode Einstellung in MySQL, die only_full_group_by enthält. Diese Einstellung erzwingt einen strengeren SQL-Standard, bei dem Spalten, die nicht in einer Aggregatfunktion (GROUP BY) verwendet werden, Teil der GROUP BY Klausel sein müssen, wenn sie anderweitig referenziert werden, wie z.B. in der ORDER BY Klausel.
Um diesen Fehler zu beheben, haben Sie zwei Hauptoptionen: Ändern Sie die SQL-Abfrage, um mit only_full_group_by kompatibel zu sein:
Sie könnten die time Spalte in Ihrer GROUP BY Klausel aufnehmen, da sie in der ORDER BY Klausel referenziert wird. Seien Sie jedoch vorsichtig mit diesem Ansatz, da das Hinzufügen von zusätzlichen Spalten zu GROUP BY die von Ihrer Abfrage zurückgegebenen Ergebnisse ändern kann.
Ändern Sie diesen Teil:
GROUP BY ROUND(time / %(step)s) ORDER BY time ASC
Zu:
GROUP BY ROUND(time / %(step)s), time ORDER BY time ASC
Ändern Sie die MySQL-Einstellungen, um das only_full_group_by zu entfernen:
Wenn Sie administrativen Zugriff auf die MySQL-Instanz haben und sicher sind, dass diese Änderung andere Teile Ihres Systems nicht negativ beeinflusst, können Sie den sql_mode anpassen, um only_full_group_by zu entfernen.
Um es für die aktuelle Sitzung zu ändern:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Für eine dauerhafte Änderung müssen Sie die my.cnf (oder my.ini unter Windows) Datei im Abschnitt [mysqld] aktualisieren und ONLY_FULL_GROUP_BY aus dem sql_mode entfernen. Nach dem Ändern müssen Sie den MySQL-Dienst neu starten.
Kommentar
-
ganz simpel:
Code:ich habe folgenden Fehler: SELECT MIN(time), ROUND(AVG(val_num * (COALESCE(duration * (time >= %(time_start)s) * (time + duration <= %(time_end)s), 0) + COALESCE(duration / duration * (time + duration - %(time_start)s) * (time < %(time_start)s) * (time + duration >= %(time_start)s), 0) + COALESCE(COALESCE(duration, %(inow)s - time) / COALESCE(duration, %(inow)s - time) * (%(time_end)s - time) * (time + COALESCE(duration, %(inow)s - time) >= %(time_end)s), 0))) / AVG((COALESCE(duration * (time >= %(time_start)s) * (time + duration <= %(time_end)s), 0) + COALESCE(duration / duration * (time + duration - %(time_start)s) * (time < %(time_start)s) * (time + duration >= %(time_start)s), 0) + COALESCE(COALESCE(duration, %(inow)s - time) / COALESCE(duration, %(inow)s - time) * (%(time_end)s - time) * (time + COALESCE(duration, %(inow)s - time) >= %(time_end)s), 0))), 4) FROM log WHERE item_id = %(id)s AND time >= (SELECT COALESCE(MAX(time), 0) FROM log WHERE item_id = %(id)s AND time < %(time_start)s) AND time <= %(time_end)s AND time + COALESCE(duration, %(inow)s - time) > (SELECT COALESCE(MAX(time), 0) FROM log WHERE item_id = %(id)s AND time < %(time_start)s) GROUP BY ROUND(time / %(step)s) ORDER BY time ASC (args OrderedDict([('time_start', 1697131399796), ('time_end', 1697390599797), ('inow', 1697390599797), ('id', 446), ('step', 2592000)])): (1055, "Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'smarthome_db.log.time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")
ABER das ist ChatGPT 4 nicht 3.5
Kommentar
-
Ich kriege die Probleme mit der blockierten Datenbank nicht so recht gelöst, auch nicht nach Monaten:
Code:2023-12-04 18:41:41 WARNING plugins.database Problem dumping env.core.memory: database is locked 2023-12-04 18:41:46 WARNING plugins.database Problem dumping env.core.threads: database is locked 2023-12-04 18:41:51 WARNING plugins.database Problem dumping env.core.scheduler.worker_threads: database is locked 2023-12-04 18:41:56 WARNING plugins.database Problem dumping env.core.scheduler.idle_threads: database is locked 2023-12-04 18:42:01 WARNING plugins.database Problem dumping env.core.scheduler.active_threads: database is locked 2023-12-04 18:42:06 WARNING plugins.database Problem dumping env.system.load: database is locked 2023-12-04 18:42:11 WARNING plugins.database Problem dumping env.system.memory.used: database is locked 2023-12-04 18:42:16 WARNING plugins.database Problem dumping env.system.memory.percent: database is locked 2023-12-04 18:42:21 WARNING plugins.database Problem dumping env.system.swap: database is locked 2023-12-04 18:42:26 WARNING plugins.database Problem dumping env.system.diskusagepercent: database is locked 2023-12-04 18:42:31 WARNING plugins.database Problem dumping Zentral.Energie.Verbrauch.Wirkleistung_L1_L2_L3: database is locked 2023-12-04 18:42:36 WARNING plugins.database Problem dumping Zentral.Energie.Verbrauch.Wirkleistung_L1: database is locked 2023-12-04 18:43:45 WARNING plugins.database Problem dumping Zentral.Energie.Verbrauch.Wirkleistung_L1_L2_L3: database is locked 2023-12-04 18:43:50 WARNING plugins.database Problem dumping Zentral.Energie.Verbrauch.Wirkleistung_L1: database is locked 2023-12-04 18:44:02 ERROR lib.db Can not execute query: SELECT time, val_num as value FROM log WHERE item_id = ? AND time BETWEEN ? AND ? ORDER BY time ASC (args [56, 1672531200000, 1695340800000]): database is locked 2023-12-04 18:44:02 ERROR plugins.db_addon Error for query 'SELECT time, val_num as value FROM log WHERE item_id = 56 AND time BETWEEN 1672531200000 AND 1695340800000 ORDER BY time ASC': database is locked 2023-12-04 18:44:02 ERROR plugins.db_addon Error occurred during _query_item. Aborting... 2023-12-04 18:44:02 WARNING plugins.db_addon no valid data from database query received during _prepare_value_list. Aborting...
Wenn ich mit fuser auf die DB teste und dann mit ps mir den Prozess anzeigen lasse ist das nur SmartHomeNG. Nichts anderes. Auch das pausieren des DatabaseAddons führt nicht zur Lösung. Allerdings scheint das deaktiveren das DatabaseAddons das Problem zu lösen. Ich erhalte zwar mal eine Meldung:
Code:2023-12-05 00:46:02 NOTICE plugins.database Skipping dump, since an other database operation running! Data is buffered and dumped later. 2023-12-05 00:46:37 NOTICE plugins.database Dumping buffered data from skipped dump(s).
Nach meinem jetztigen Kenntnisstand wäre der Fehler im DataBaseAddon zu suchen, richtig?
Ich nutzte übrigens die letzte aktuelle master-Version von SmartHomeNG nebst Plugins.
Kommentar
-
Hallo zusammen,
gibt es hier SQL Experten im Forum, die bei der Erweiterung des database plugins unterstützen könnten?
Ich würde gerne das database plugin um eine neue DB Abfrage "delta" erweitern. Also als Beispiel:
Code:value = item.db('delta','52w','now')
Für den Sonderfall von monoton steigenden Werten ginge es theroetisch jetzt schon mit
Code:delta = item.db('max','52w','now') - item.db('min','52w','now')
Kommentar
-
Zitat von aschwith Beitrag anzeigenIch suche hier eine allgemeingültige Lösung.
Kommentar
-
Hi Sisamiwe, danke für den Hinweis. Das dbaddon Plugin habe ich auf dem Schirm, ist auch ein sehr schönes und mächtiges Plugin. Ich will allerdings explizit die nativen database plugin Funktionen erweitern: Gerade für den Usecase, in Logiken zum Beispiel zum Ende des Jahres ein paar statistische Werte aus der DB zu ziehen. Ich brauche keine regelmäßigen Deltaberechnungen.
Perspektivisch würde ich auch gerne die Funktion "differentiate" des plugins weiter debuggen. Diese ist so aktuell nicht nutzbar. Die Option "integrate" funktioniert sehr gut. Analog habe ich auf dem Zettel, auch das Differenzieren, z.B. um aus Energiemessungen Leistungen zu ermitteln und plotten können.
Von daher der Aufruf an smarthomeNG user mit SQL Erfahrungen....
Viele Grüße
Kommentar
-
aschwith
Ein bisschen SQL kann ich.
Schlussendlich baut das Plugin nur ein SQL Statement zusammen. Nutzt du mariadb oder sqlite?
Ich habe "offline" also ohne shng erstmal das SQL Statement entwickelt und dann ins Plugin bzw Python übertragen.
Wegen der Belastung der Datenbank könnte man im Plugin den Wert zum jeweiligen Zeitpunkt ermitteln und dann die Differenz im Plugin berechnen. So läuft das auch im dbaddon Plugin.
Da ist aber auch allerhand Fehlerhandling notwendig. (es gibt zum Zeitpunkt keinen Wert und man muss den nächsten suchen oder es gibt überhaupt keinen Wert, weil es da noch keine Werte in der DB gab,...)
Kommentar
-
Ich nutze mariadb. Dein Hinweis mit Fehlerhandling ist völlig richtig. Fürs Erste würde mir ausreichen, wenn die Funktion "none" zurückgibt, falls es kein Delta berechnet werden kann.
Kennst Du bei SQL die Abfrage für ein Differenzieren? Ich hatte mich mal im database plugin in der Funktion
Code:def _single(self, func, start, end='now', item=None):
Kommentar
-
Guten Tag, leider muss ich eine Frage zum Database Plugin stellen. Ich kriege es nicht hin:
Ich habe eine Item mit Datenbank, das regelmäßig Einträge generiert. In einem zweiten Item möchte ich stündlich die Veränderung der letzten Stunde darstellen. Das zweite Item hat crontab und eval auf das erste Item. Bisher war mein Basisitem monoton steigend, eval war
Code:sh.A.db('max', '1h') - sh.A.db('min', '1h')
Neue Anforderung, das Basisitem kann auch fallen, dann liefert das oben keine sinnvollen Ergebnisse mehr. Daher habe ich es mit diff probiert:
Code:sh.A.db('diff', '1h')
Danke für jeden Hinweis und frohe Festtage
Aldaris
Kommentar
-
Zitat von aldaris Beitrag anzeigenGuten Tag, leider muss ich eine Frage zum Database Plugin stellen. Ich kriege es nicht hin:
Ich habe eine Item mit Datenbank, das regelmäßig Einträge generiert. In einem zweiten Item möchte ich stündlich die Veränderung der letzten Stunde darstellen. Das zweite Item hat crontab und eval auf das erste Item. Bisher war mein Basisitem monoton steigend, eval war
Code:sh.A.db('max', '1h') - sh.A.db('min', '1h')
Neue Anforderung, das Basisitem kann auch fallen, dann liefert das oben keine sinnvollen Ergebnisse mehr. Daher habe ich es mit diff probiert:
Code:sh.A.db('diff', '1h')
Danke für jeden Hinweis und frohe Festtage
Aldaris
M.E. macht das 'diff' genau, was es soll:
### sh.item.db(function, start, end='now')
und
* `diff`: return the differences between values
Damit: Start=1h - End=now --> -2 --34 = 32
Ich benutze 'diff' nicht, aber evtl. mal anders herum probieren:
Code:sh.A.db('diff', 'now', '1h')
Code:sh.A.db('raw', 'now') - sh.A.db('raw', '1h')
Kommentar
Kommentar