Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Kurze Frage: Ich schreibe den Zählerstand nur bei Änderung. Ist das OK oder ist es für das Plugin besser irgendwie zyklisch zu updaten ? Oder mir enforce: yes ?
Das sollte reichen, wenn täglich ein paar Werte in die DB geschrieben werden.
Ich bin mit Onkelandy in Kontakt, der eine Wert in die DB schreibt, der nur alle paar Tage aktualisiert wird. Das macht Probleme.
Das sollte reichen, wenn täglich ein paar Werte in die DB geschrieben werden.
Das scheint zu klappen. Hab jetzt Werte für Heute, Gestern, Woche, Monat ... Danke für deine Arbeit, klappt super !
Jahr ist noch auf 0. Ich nahm an, er würde sofort anfangen das Jahr hochzurechnen. Aber mir scheint er wird damit wohl erst ab 1. Januar nächsten Jahres anfangen ?
Andere Sache: Die berechneten Werte werden nicht in die Datenbank geschrieben ? Ich hab zwar die Werte Heute und dann Gestern bis Gestern -2. Aber ich kann mir nicht z.B. eine Graphik anzeigen lassen mit den Tagesverbrauchen der letzten 7 Tage oder 30 Tage z.B. (Balkengraphik mit 1 Balken pro Tag). Oder steht ich auf dem Schlauch ?
Ich habe das Plugin für meinen PV-Wechselrichter aktiviert. Der Total-kWh-Zähler zählt da einfach nach oben. Die Werte "Tag", "Monat" und "Jahr" werden nun berechnet.
Code:
solar:
# Leistung aktuell [W]
current:
type: num
kostal: actot_w
visu_acl: ro
database: init
# Leistung gesamt [kWh]
total:
type: num
kostal: yield_tot_kwh
visu_acl: ro
database: init
auswertung:
type: foo
verbrauch_heute:
type: num
database_addon_fct: verbrauch_heute
verbrauch_monat:
type: num
database_addon_fct: verbrauch_monat
verbrauch_jahr:
type: num
database_addon_fct: verbrauch_jahr
Im "smarthome-details.log" finde ich aber diese Fehlermeldung:
Code:
2022-07-05 06:58:12 DEBUG plugins._db_addon update_item was called with item solar.total with value 77245 from caller Logic, source None and dest None
2022-07-05 06:58:12 DEBUG plugins._db_addon _fill_cache_dicts called with updated_item=solar.total and value=77245.
2022-07-05 06:58:12 DEBUG plugins._db_addon _fill_cache_dicts: verbrauch item solar.total detected. Check for update of _cache_dicts and item value.
2022-07-05 06:58:12 DEBUG plugins._db_addon _query_item called with func=max, item=solar.total, timespan=heute, start=1, end=0, group=None, ignore_value=None
2022-07-05 06:58:12 DEBUG plugins._db_addon _get_oldest_log: called for item=solar.total
2022-07-05 06:58:12 DEBUG plugins._db_addon _get_oldest_log for item solar.total = 1325372400876
2022-07-05 06:58:12 DEBUG plugins._db_addon _query_item: oldest_log=1325372400, ts_start=1656885600, ts_end=1656972000
2022-07-05 06:58:12 DEBUG plugins._db_addon _query_log: Called with func=max, item=solar.total, timespan=day, start=1, end=0, count=None, group=None, group2=None, ignore_value=None
2022-07-05 06:58:12 DEBUG plugins._db_addon _get_itemid called with item=solar.total
2022-07-05 06:58:12 DEBUG plugins._db_addon _query_log: query=SELECT UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(time/1000))) * 1000 as time1, ROUND(MAX(val_num), 1) as value FROM log WHERE item_id = :item AND val_bool = 1 AND DATE(FROM_UNIXTIME(time/1000)) BETWEEN DATE_SUB(CURDATE(), INTERVAL :start DAY) AND DATE_SUB(CURDATE(), INTERVAL :end DAY) ORDER BY time ASC, params={'item': 9, 'end': 0, 'start': 1}
2022-07-05 06:58:12 DEBUG plugins._db_addon _fetchall: Called with query=SELECT UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(time/1000))) * 1000 as time1, ROUND(MAX(val_num), 1) as value FROM log WHERE item_id = :item AND val_bool = 1 AND DATE(FROM_UNIXTIME(time/1000)) BETWEEN DATE_SUB(CURDATE(), INTERVAL :start DAY) AND DATE_SUB(CURDATE(), INTERVAL :end DAY) ORDER BY time ASC, params={'item': 9, 'end': 0, 'start': 1}
2022-07-05 06:58:12 DEBUG plugins._db_addon _query: Called with query=SELECT UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(time/1000))) * 1000 as time1, ROUND(MAX(val_num), 1) as value FROM log WHERE item_id = :item AND val_bool = 1 AND DATE(FROM_UNIXTIME(time/1000)) BETWEEN DATE_SUB(CURDATE(), INTERVAL :start DAY) AND DATE_SUB(CURDATE(), INTERVAL :end DAY) ORDER BY time ASC, params={'item': 9, 'end': 0, 'start': 1}
2022-07-05 06:58:12 ERROR lib.db Can not execute query: SELECT 1 (args OrderedDict()): (2006, "MySQL server has gone away (ConnectionResetError(104, 'Die Verbindung wurde vom Kommunikationspartner zurückgesetzt'))")
2022-07-05 06:58:12 WARNING lib.db Database [DatabaseAddOn]: Connection error (2006, "MySQL server has gone away (ConnectionResetError(104, 'Die Verbindung wurde vom Kommunikationspartner zurückgesetzt'))")
2022-07-05 06:58:17 DEBUG plugins._db_addon _query: Result of SELECT UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(time/1000))) * 1000 as time1, ROUND(MAX(val_num), 1) as value FROM log WHERE item_id = 9 AND val_bool = 1 AND DATE(FROM_UNIXTIME(time/1000)) BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE_SUB(CURDATE(), INTERVAL 0 DAY) ORDER BY time ASC: ((1656885600000, 77245.0),)
2022-07-05 06:58:17 DEBUG plugins._db_addon _query_item: log=[(1656885600000, 77245.0)]
2022-07-05 06:58:17 DEBUG plugins._db_addon _query_item: value=77245.0 at 2022-07-04 00:00:00
Ich verwende eine MariaDB als SQL-Speicher.
Was hat es mit diesem ERROR "Can not execute query" auf sich ?
Ich bin mir nicht mal sicher, dass es für die DB-Abfragen ein sqlite-äquivalent gibt.
Ich habe mich mal ein bisschen eingelesen. Es gibt auf jeden Fall sqlite-äquivalent. Problem sind die Datum und Zeit Funktionen die unter sqlite andere sein müssen.
Ich nahm an, er würde sofort anfangen das Jahr hochzurechnen. Aber mir scheint er wird damit wohl erst ab 1. Januar nächsten Jahres anfangen ?
Hier solltes so sein, dass das Plugin feststellt, dass es für den 1.1. keine Daten gibt, automatisch auf "oldest entry" geht und dieses Wert nimmt.
Das Plugin hat noch einen Debug-Modus. Wenn Du im Log-level "debug" bist, gibt es automatisch im WebIF des Plugins einen Reiter "Maintenance". Dort sind alle gecachten Werte sichtbar. Schau mal, on dort der "oldest entry" für das Item sichtbar ist.
Die berechneten Werte werden nicht in die Datenbank geschrieben ? Ich hab zwar die Werte Heute und dann Gestern bis Gestern -2. Aber ich kann mir nicht z.B. eine Graphik anzeigen lassen mit den Tagesverbrauchen der letzten 7 Tage oder 30 Tage z.B. (Balkengraphik mit 1 Balken pro Tag). Oder steht ich auf dem Schlauch ?
Du kannst die Werte in wieder in die DB schreiben. Dafür musst Du die struct entweder in der Plugin.yaml oder der Item.yaml im das Datenbank-Attribut erweitern.
Aber: Ich habe auch eine Funktion des Plugins "db_request" implementiert, bei der kann man eine Wertereihe abfragen. Damit kann man für einen Zeitraum eine bestimmte Funktion abfragen.
Auszug aus der Plugin.yaml.
# mit dieser Funktion ist es möglich, eine Liste der "func" Werte pro "group" / "group2" eines "item" von "start""timespan" bis "end""timespan" oder von "start""timespan" bis "count" ausgegeben zu lassen
# bspw: minimale Tagestemperatur vom Item "outdoor.temp" der letzten 10 Tage startend von gestern davor --> func=min, item=outdoor.temp, timespan=day, start=1, count=10, group=day
# bspw: maximal Tagestemperatur vom Item "outdoor.temp" von jetzt bis 2 Monate davor --> func=max, item=outdoor.temp, timespan=month, start=0, end=2, group=day
Hier muss ich aber nochmal ran. Im Moment klappt das zumindest bei mir nicht zuverlässig.
Was hat es mit diesem ERROR "Can not execute query" auf sich ?
Das steht doch in der Fehlermeldung direkt dahinter. Die Anfrage konnte nicht ausgeführt werden, weil der SQL Server nicht erreichbar war. Danach findet ein Reconnect statt und die Abfrage wird ausgeführt. Das Ergebnis steht in der Zeile darunter.
Im diesen Verbindungsbruch zu unterdrücken, kann man die Parameter für die SQL DB anpassen. Damit können u.a. längere Abfragezeiten zugelassen werden.
Im Moment teste ich
Das müsste ich mir mal genauer auschauen. Ich glaube, dass es da einfach zu wenig Werte gibt.
Hier nochmal zu Info: Das Plugin macht eigentlich nichts anderes, wie gezielte Abfragen der SQL Datenbank. Es werden keinen eigenen Berechnungen durchgeführt.
Schlussendlich wird über die Parameter etc einen SQL Abfrage zusammengesetzt und ausgeführt. In höheren Log-Level findest Du die eigentliche Abfrage als Log mit "_query: Called with query=SELECT ...."
D.h. wenn Du die eine funktionierende SQL Abfrage hast, können wir überlegen, wie wir die bestehenden optimieren.
Ich verwende exakt diese Werte auf einem Raspberry Pi 4 mit einer SSD am USB3 und der MariaDB auf dieser SSD. Wenn ich die beiden ersten Timeout auf 120 erhöhe, sehe ich im Log Hinweise, dass ich diese auf 60 setzen soll.
Das müsste ich mir mal genauer auschauen. Ich glaube, dass es da einfach zu wenig Werte gibt.
D.h. wenn Du die eine funktionierende SQL Abfrage hast, können wir überlegen, wie wir die bestehenden optimieren.
Beste Grüße
Ich habe zu Tests 2 Zähler mit dem Plugin verbunden. Der Solarzähler des Wechselrichters erzeugt pro Tage mehrere Updates. Da funktioniert die Berechnung.
Der Wasserzähler erhöht den Wert nur alle paar Tage um 1 Schritt:
Hier solltes so sein, dass das Plugin feststellt, dass es für den 1.1. keine Daten gibt, automatisch auf "oldest entry" geht und dieses Wert nimmt.
Das Plugin hat noch einen Debug-Modus. Wenn Du im Log-level "debug" bist, gibt es automatisch im WebIF des Plugins einen Reiter "Maintenance". Dort sind alle gecachten Werte sichtbar. Schau mal, on dort der "oldest entry" für das Item sichtbar ist.
Hab mal für das Plugin den DEBUG Modus aktiviert und SHNG neu gestarted.
Ich sehe nun den Maintenance Reiter und auch Jahreswerte sind nun plötzlich da.
Nur der Tageswert für Heute ich nun irgendwie im Eimer. Und Woche -1 ist auch auf 0.
Ich werd es mal ein paar Tage beobachten, villeicht kommen wie Werte ja noch irgendwann ?
Nur der Tageswert für Heute ich nun irgendwie im Eimer. Und Woche -1 ist auch auf 0.
Um den Rechen- bzw. Abfrageaufwand zu reduzieren, werden die Werte, die vom aktuellen Zählerstand abhängen (heute, woche, monat, jahr) erst dann berechnet, wenn es ein Update des Wertes vom Zähler gibt. Deshalb ist der Update-Cycle auch "on-change", Berechnung bei Änderung.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar