Ankündigung

Einklappen
Keine Ankündigung bisher.

Verhaltensänderung nach Umstellung SQLite Plugin -> Database Plugin (MySQL/SQLite)

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

    Verhaltensänderung nach Umstellung SQLite Plugin -> Database Plugin (MySQL/SQLite)

    Nach der Umstellung von SQLite auf das neue database pluglin verhält sich meine Laufzeit Messung ganz anders:

    ich habe folgende items definiert:
    Code:
    Pool:
    
        Laufzeit:
    
            Pumpe:
                type: num
                visu: 'yes'
                visu_acl: rw
                knx_dpt: 9
                database: 'yes'
    
                heute:
                    type: num
                    visu: 'yes'
                    visu_acl: rw
                    knx_dpt: 9
                    database: 'yes'
                    eval_trigger: Pool.Laufzeit.Pumpe
                    eval: sh.Pool.Laufzeit.Pumpe() - sh.Pool.Laufzeit.Pumpe.db('max', '1d')
                    sv_widget: "{{ plot.period('item', 'item', 'max', '30d', '', '', '', '', 'Pumpe', '', '', '', '1d') }}"
    diese items versorge ich mittels logic einmal täglich um 23 Uhr:

    Code:
    # OSF1
    import urllib.request
    req = urllib.request.urlopen("http://192.168.178.40/Laufzeit.htm")
    data = req.read().decode('UTF-8')
    words = data.split()
    sh.Pool.Laufzeit.Pumpe(words[0])
    sh.Pool.Laufzeit.Heizung(words[2])
    sh.Pool.Laufzeit.Solar(words[4])
    logger.warning(words)
    logger.warning('Pumpe: ' + str(sh.Pool.Laufzeit.Pumpe()) + ' heute: ' + str(sh.Pool.Laufzeit.Pumpe.heute()) )
    logger.warning('Heizung: ' + str(sh.Pool.Laufzeit.Heizung()) + ' heute: ' + str(sh.Pool.Laufzeit.Heizung.heute()))
    logger.warning('Solar: ' + str(sh.Pool.Laufzeit.Solar()) + ' heute: ' + str(sh.Pool.Laufzeit.Solar.heute()))
    in meinem log erscheint folgendes:

    Code:
    2018-07-19 23:00:00 WARNING  OSF1         logics.Pool1 ['2182', 'Stunden', '93', 'Stunden', '1777', 'Stunden'] -- OSF1.py:<module>:9
    2018-07-19 23:00:00 WARNING  OSF1         logics.Pool1 Pumpe: 2182 heute: 0.0 -- OSF1.py:<module>:10
    2018-07-19 23:00:00 WARNING  OSF1         logics.Pool1 Heizung: 93 heute: 0.0 -- OSF1.py:<module>:11
    2018-07-19 23:00:00 WARNING  OSF1         logics.Pool1 Solar: 1777 heute: 0.0 -- OSF1.py:<module>:12
    mein eval errechnet in mySQL aber immer 0 und manchmal (vermutlich nach Neustart) negative Werte.
    die Werte in der DB stimmen auch nicht: siehe screenshots

    maria1.JPG
    maria2.JPG

    mit SQLite hat das immer so funktioniert

    was mache ich falsch ?
    Zuletzt geändert von bmx; 29.07.2018, 08:32. Grund: Ich habe den Titel mal ein wenig präzisiert.

    #2
    in den item Informationen im backend server finde ich folgendes:

    item1.JPG

    item2.JPG

    irgendwie stimmt das nicht mit den eval Definitionen

    Kommentar


      #3
      Du mußt zunächst davon ausgehen, das Schreiboperationen an die Datenbank nicht sofort geschrieben sondern erst gesammelt werden. Gerade auf Raspi macht das Sinn die Schreibzugriffe zu reduzieren.

      Vielleicht kannst Du Deine Logik ändern:

      Code:
      # OSF1
      import urllib.request
      req = urllib.request.urlopen("http://192.168.178.40/Laufzeit.htm")
      data = req.read().decode('UTF-8')
      words = data.split()
      pumpe_neu = words[0]
      heizung_neu = words[2]
      solar_neu = words[4]
      sh.Pool.Laufzeit.Pumpe(pumpe_neu)
      sh.Pool.Laufzeit.Heizung(heizung_neu)
      sh.Pool.Laufzeit.Solar(solar_neu)
      logger.warning('Laufzeit.htm: {}'.format(words))
      logger.warning('Pumpe: {} heute: {}'.format(pumpe_neu, sh.Pool.Laufzeit.Pumpe.heute()) )
      ... usw

      Kommentar


        #4
        ich schreibe ja nur einmal am Tag um 23 Uhr und ich verstehe nicht, wieso in deiner Logik weniger Schreibzugriffe erfolgen sollen.

        zudem: was haben die Schreibzugriffe mit der Rechnerei zu tun.
        m.E. läuft mit dem eval irgend etwas schief:
        eval: sh.Pool.Laufzeit.Pumpe() - sh.Pool.Laufzeit.Pumpe.db('max', '1d')

        die db function im eval hat doch mit SQLite funktioniert

        Kommentar


          #5
          seit mehreren Tagen kämpfe ich jetzt hiermit; bin leider kein Python Experte.
          mit dem eval und dem eval trigger haut es wohl nicht hin, keine Ahnung warum.

          jetzt versuche ich einfach den Wert in der Logik zu errechnen und das Item in die DB zu stellen.

          wieso geht das denn nicht so wie in dem Beispiel oben #3

          Code:
          Stunden = sh.Pool.Laufzeit.Pumpe() - sh.Pool.Laufzeit.Pumpe.db('min', '1d')
          logger.info('Stunden: {}'.format(Stunden) )
          sh.Pool.Laufzeit.Pumpe.heute(Stunden)
          Code:
          2018-07-25  20:28:55 INFO     logics.Test2      Stunden: 8.0
          2018-07-25  20:28:55 ERROR    logics.Test2      Logic: logics.Test2, File: /usr/local/smarthome/logics/test2.py, Line: 6, Method: <module>, Exception: 'float' object is not callable
          Traceback (most recent call last):
            File "/usr/local/smarthome/lib/scheduler.py", line 493, in _task
              exec(obj.bytecode)
            File "/usr/local/smarthome/logics/test2.py", line 6, in <module>
              sh.Pool.Laufzeit.Pumpe.heute(Stunden)
          TypeError: 'float' object is not callable

          Kommentar


            #6
            Der Übeltäter liegt wohl in der item definition:

            ich habe:

            knx_dpt: 9

            rausgenommen und schon geht's

            Kommentar


              #7
              jetzt liefert aber die db-Funktion m.E. nicht die korrekten Werte.

              in meiner mySQL Datenbank stehen folgende Werte:

              von heute:
              Pumpe26.JPG
              von gestern

              Pumpe25.JPG
              wie kriege ich denn den höchsten Wert des Vortages um die Laufzeit von heute zu berechnen.
              mit SQLite hat das funktioniert indem ich angab: ('max', '1d')

              mit mySQL kommen aber Werte, die ich nicht nachvollziehen kann:

              Code:
              2018-07-26  15:33:23 INFO     logics.Test2      max, 1d: 2234.0
              2018-07-26  15:33:23 INFO     logics.Test2      min, 1d: 2222.0
              2018-07-26  15:33:23 INFO     logics.Test2      max, 2d, 1d: 2222.0
              2018-07-26  15:33:23 INFO     logics.Test2      min, 2d, 1d: 2214.0

              wer kann mir auch mal bitte das DB Konzept erklären, wann werden welche Werte geschrieben.
              über einen eval_trigger sollen die Werte jeweils ermittelt werden, wenn der Staus sich ändert (ein-, ausschalten)
              offensichtlich schreibt SHNG die aber stündlich; hat dies etwas mit cache=on zu tun ?

              wieso gibt es zwei Daten zu jedem Wert: "Zeit" / "Geändert"
              offensichtlich werden die Daten nicht direkt in die DB geschrieben, weshalb mein erstes Beispiel #1 nicht mehr funktioniert
              Zuletzt geändert von whe; 26.07.2018, 14:51.

              Kommentar


                #8
                Dir ist klar, dass "1d" von jetzt 24h zurueck ist? Also auch Daten von gestern umfasst?

                2d-1d ist 48stunden von jetzt bis 24 stunden von jetzt. hat also werte von vorgestern.

                Ansonsten musst du die Anzahl Minuten seit Tageswechsel nehmen. Für den Vortag einfach 24 Stunden = 24x60 Minuten dazurechnen

                Siehe auch: https://www.smarthomeng.de/zeitdaten...ogik-berechnen

                Da müsste ich eher Grundrechenarten als das DB Konzept erklären ;-)
                Ich kann mir auch schwer erklären, dass das SQLITE das "richtig" gemacht hat, da die "1d" Angabe meines Wissens direkt in das Query übernommen wurde.. Mutmaßlich war es da weniger schön zu sehen, da keine grafische Oberfläche.

                Achja die in deinen Screenshots sichtbaren Werte für Min/Max 24h sind dann auch ersichtlich
                Zuletzt geändert von psilo; 26.07.2018, 15:36.

                Kommentar


                  #9
                  Siehe auch mein Beispiel aus dem Artikel für den Verbrauch seit Mitternacht:
                  Code:
                  consumption_since_midnight:
                      type: num
                      eval: sh.knx.cellar.utility_room.water_meter.db('count>0', sh.date.minute.since.midnight.dbstr(), 'now')
                      eval_trigger: knx.cellar.utility_room.water_meter
                      database@mysqldb: init

                  Kommentar


                    #10
                    hier der Codeteil der das im SQLITE berechnet hat, auf Anhieb verstehe ich zwar nicht alles, sehe aber auch keine black magic die aus "1d" die Zeit seit Mitternacht macht:
                    Code:
                            self._frames = {'i': minute, 'h': hour, 'd': day, 'w': week, 'm': month, 'y': year}
                            self._times = {'i': minute, 'h': hour, 'd': day, 'w': week, 'm': month, 'y': year}
                            
                            
                        def _get_timestamp(self, frame='now'):
                            try:
                                return int(frame)
                            except:
                                pass
                            dt = self._sh.now()
                            ts = int(time.mktime(dt.timetuple()) * 1000 + dt.microsecond / 1000)
                            if frame == 'now':
                                fac = 0
                                frame = 0
                            elif frame[-1] in self._frames:
                                fac = self._frames[frame[-1]]
                                frame = frame[:-1]
                            else:
                                return frame
                            try:
                                ts = ts - int(float(frame) * fac)
                            except:
                                self.logger.warning("DB select: unkown time frame '{0}'".format(frame))
                            return ts
                    Vielleicht kam das dadurch zustande, dass das SQLITE früher die Werte teilweise aggregiert hat, um Platz zu sparen. Das Databaseplugin schreibt die Werte 1:1 raus, was m.E. besser ist.. Und mit obigen Überlegungen dann auch deutlich genauer auszulesen ist.

                    Kommentar


                      #11
                      PPS: Aber cool zu sehen, dass die ersten Leute die Web GUI verwenden Hat sich der Aufwand gelohnt.. Vielleicht sollte man noch ein Inputfeld bauen, das bestimmte Queries absetzbar macht... Um solche Dinge zu checken.

                      Kommentar


                        #12
                        danke für die Tipps,

                        dann sollte doch mein eval oben #1 funktionieren, hat aber immer 0 geliefert.

                        vielleicht warte ich auch mal bis heute Abend, da ich die logic um 23 Uhr ausführe.

                        Kommentar


                          #13
                          der aktuelle wert steht nicht in der log tabelle. check den bitte bzgl. post 1. mach den eval doch mal ohne subtraktion. nur auf dem max wert

                          Kommentar


                            #14
                            und ein init anstatt yes bei database koennte beim neustart wunder bewirken. sonst steht 0 im item

                            Kommentar


                              #15
                              Zitat von psilo Beitrag anzeigen
                              PPS: Aber cool zu sehen, dass die ersten Leute die Web GUI verwenden Hat sich der Aufwand gelohnt.. Vielleicht sollte man noch ein Inputfeld bauen, das bestimmte Queries absetzbar macht... Um solche Dinge zu checken.
                              Ich würde eher bevorzugen dass man die abgesetzten sql queries loggen kann um dann über mysql client xyz sich das Ergebnis anzusehen. Wenn das bereits geht ziehe ich die Äußerung zurück
                              Grüße
                              Marcel

                              Kommentar

                              Lädt...
                              X