Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Plugin: DatabaseAddOn - Erweitere Testphase

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #31
    Zitat von henfri Beitrag anzeigen
    Wie stehen denn die Chancen, dass du das Add-on auch mit sqlite kompatibel machst?
    Wenn Du mich meinst....
    Ich habe dazu noch keine Meinung. Ich bin mir nicht mal sicher, dass es für die DB-Abfragen ein sqlite-äquivalent gibt.

    Kommentar


      #32
      Zitat von Foxi352 Beitrag anzeigen
      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.

      Kommentar


        #33
        Zitat von Sisamiwe Beitrag anzeigen
        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 ?

        Kommentar


          #34
          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 ?

          Kommentar


            #35
            Ich habe einen Wasserzähler (m3). Da funktioniert das Plugin leider nicht. In der Datenbank hat es folgende Einträge:

            29.6.22 01:17 Wert=1274.0
            03.7.22 01:17 Wert=1275.0
            06.7.22 01:16 Wert=1276.0

            Das Item ist wie folgt definiert:

            Code:
            Wasser:
            
                Bezug:
            
                    TotalOrig:
                        type: num
                        value: 0
                        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
            Die 3 Werte bleiben immer auf Null.

            Plugin.jpg

            Angehängt das Log mit DEBUG-Level. Errors sehe ich keine.
            Angehängte Dateien

            Kommentar


              #36
              Zitat von Sisamiwe Beitrag anzeigen
              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.

              https://www.sqlite.org/lang_datefunc.html vs. https://www.w3resource.com/mysql/dat...y-function.php

              Wenn ich Zeit habe, werde ich mich mal dran versuchen, das kann aber dauern....

              Kommentar


                #37
                Danke!

                Kommentar


                  #38
                  Zitat von Foxi352 Beitrag anzeigen
                  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.

                  Zitat von Foxi352 Beitrag anzeigen
                  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.

                  Kommentar


                    #39
                    Zitat von manhartm Beitrag anzeigen
                    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

                    Code:
                    [mysqld]
                    connect_timeout = 60
                    net_read_timeout = 60
                    wait_timeout = 28800
                    interactive_timeout = 28800
                    in der /etc/mysql/my.cnf

                    Kommentar


                      #40
                      Zitat von manhartm Beitrag anzeigen
                      Die 3 Werte bleiben immer auf Null.
                      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.

                      Beste Grüße

                      Kommentar


                        #41
                        Zitat von android Beitrag anzeigen
                        Wenn ich Zeit habe, werde ich mich mal dran versuchen, das kann aber dauern....
                        Ich habe mal meine SQL Datenbank in sqlite gewandelt (zumindest für Testzwecke). Ich versuche mich auch mal dran.

                        Kann aber auch dauern....

                        Aber schön, wenn jemand mit dabei ist.

                        Kommentar


                          #42
                          Zitat von Sisamiwe Beitrag anzeigen

                          Code:
                          [mysqld]
                          connect_timeout = 60
                          net_read_timeout = 60
                          wait_timeout = 28800
                          interactive_timeout = 28800
                          in der /etc/mysql/my.cnf
                          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.

                          Kommentar


                            #43
                            Zitat von Sisamiwe Beitrag anzeigen

                            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:

                            29.6.22 01:17 Wert=1274.0
                            03.7.22 01:17 Wert=1275.0
                            06.7.22 01:16 Wert=1276.0

                            Der Wasserzähler funktioniert nicht. Alle 3 Werte bleiben auf Null.

                            Kommentar


                              #44
                              Zitat von Sisamiwe Beitrag anzeigen
                              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 ?

                              Screen Shot 2022-07-09 at 11.51.16.png

                              Kommentar


                                #45
                                Zitat von Foxi352 Beitrag anzeigen
                                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.

                                Mittlerweile sollten sie da sein.
                                Richtig?

                                Kommentar

                                Lädt...
                                X