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

    #31
    ich verwende nur database init und habe super charts und habe keinen cronjob laufen, der shng alle paar minuten restartet . (also nein. es ist wie yes nur mit initialisierung - im Übrigen wird 'yes' garnicht abgefragt sondern hier könnte auch "database = schnitzenpitz" stehen... beliebige strings reichen derzeit, solange das database attribut da ist.)

    und: schau doch auch mal selber in den code bei so fragen, wenn Dich was stört oder Du mir nicht glaubst.
    ich hab den gleichen aufwand wie du, wenn ich das mache, da der Code auch nicht von mir stammt... und ich habe auch 2 kinder und ein leben... aber ist klar, ist halt einfacher so
    Und wenn einen was stört und der Code das nachweislich auch nicht bereits umsetzt, bieten sich im Open Source Bereich ganz wunderbar Pull Requests an

    Die Antwort ist auf jdn. Fall gar nicht schwer, siehe meine Kommentare im Quelltext unten:

    --> https://github.com/smarthomeNG/plugi...se/__init__.py

    Code:
        def parse_item(self, item):
            if self.has_iattr(item.conf, 'database'): #ALLE Items die database = <irgendwas> stehen haben schreiben raus.
                self._buffer_insert(item, [])
                item.series = functools.partial(self._series, item=item.id())
                item.db = functools.partial(self._single, item=item.id())
                item.dbplugin = self
    
                if self._initialized and self.get_iattr_value(item.conf, 'database') == 'init':
                    # ...
                    try:
                        # ... hier wird das item intalisiert ....
                        cache = self.readItem(str(item.id()), cur=cur)
                        if cache is not None:
                            value = self._item_value_tuple_rev(item.type(), cache[COL_ITEM_VAL_STR:COL_ITEM_VAL_BOOL+1])
                            last_change = self._datetime(cache[COL_ITEM_TIME])
                            last_change_ts = self._timestamp(last_change)
                            prev_change = self._fetchone('SELECT MAX(time) from {log} WHERE item_id = :id', {'id':cache[COL_ITEM_ID]}, cur=cur)
                            if value is not None and prev_change is not None:
                                item.set(value, 'Database', prev_change=self._datetime(prev_change[0]), last_change=last_change)
                            self._buffer_insert(item, [(last_change_ts, None, value)])
                    except Exception as e:
                        self.logger.error("Reading cache value from database for {} failed: {}".format(item.id(), e))
                    cur.close()
                    self._db.release()
                return self.update_item
                # hier geht es zum update, also dem rausschreiben von daten, das gilt für ALLE items die database = <beliebigerstring>
                # in der yaml datei haben, in der update_item methode werden alle zum update freigegebenen items in ein array aufgenommen.
            else:
                return None
    Code:
        # Aufnahme der Items in ein buffer Array:
        def update_item(self, item, caller=None, source=None, dest=None):
            acl = 'rw' if not self.has_iattr(item.conf, 'database_acl') else self.get_iattr_value(item.conf, 'database_acl')
            if acl is 'rw':
                start = self._timestamp(item.prev_change())
                end = self._timestamp(item.last_change())
                last = None if len(self._buffer[item]) == 0 or self._buffer[item][-1][1] is not None else self._buffer[item][-1]
                if last:  # update current value with duration
                    self._buffer[item][-1] = (last[0], end - start, last[2])
                else:     # append new value with none duration
                    self._buffer[item].append((start, end - start, item.prev_value()))
    
                # add current value with None duration
                self._buffer[item].append((end, None, item()))
    Zuletzt geändert von psilo; 29.07.2018, 07:01.

    Kommentar


      #32
      Achja: Werte werden im Plugin erst in einem Buffer gesammelt und dann per Scheduler
      Code:
      smarthome.scheduler.add('Database dump ' + self._name + ("" if prefix == "" else " [" + prefix + "]"), self._dump, cycle=self._dump_cycle, prio=5)
      im 60 Sekunden Takt rausgeschrieben.

      Also auch immer genug Geduld haben.
      Zuletzt geändert von bmx; 29.07.2018, 08:33.

      Kommentar


        #33
        tut mir Leid, wenn ich Dich überstrapaziert habe.

        aber die ganzen Zusammenhänge sind für mich teilweise unlogisch.

        ich definiere items, die ich nur über eine logic versorge, die einmal am Tag ( kurz vor Mitternacht ) ausgeführt wird.
        in dieser Logic werden mittels HTTP request die Werte von meiner Pool Steuerung geholt.

        wieso finde ich dann in der Datenbank mehrere Werte am Tag, zu ganz unlogischen Zeiten.
        dazu muss doch jemand die logic triggern, sonst kriegt SHNG ja keine Werte.

        von einer Datenbank erwarte ich auch, dass sie immer realtime Werte für alle Nutzer hat.
        wenn ich die Daten irgendwo sammle, sind die Daten nie aktuell.

        das kann man sich doch nicht alles aus dem Coding anlesen
        wäre schön wenn die Entwickler solche Dinge dokumentieren würden.
        das würde sicher viele Fragen und Probleme im Forum von selbst klären

        Kommentar


          #34
          whe
          wäre schön wenn die Entwickler solche Dinge dokumentieren würden.
          -> oha, denn ich habe das plugin bzw. die basis von smarthome.py auch nicht entwickelt und muss mir auch viele dinge reverse engineeren.

          Versuch es doch wirklich selber herauszukriegen, baue Debug-Logzeilen ein die nur bei dem einen Item Infos ausgeben. Usw. Anders mache ich das wenn ich Probleme habe auch nicht.

          Sich hinstellen, die Arme zu verschränken und auf die Entwickler zu schimpfen, die das unentgeldlich in ihrer Freizeit machen und dazu noch dutzende (wenn nicht hunderte) Seiten Doku und Blogartikel schreiben usw. macht es doch auch nicht besser? Irgendwo fehlt es immer, drum ist das Ganze Open Source, damit man selber aktiv beiträgt.

          Selbst wenn ich die Zeit hätte, müsste ich exakt Deine Konstellation nachbauen, um Dir genau da weiterhelfen zu können. Das kannst Du besser!

          Und kleine Randbemerkung: selbst superteure Bezahlsoftware muss was diese Dinge angeht auch nicht besser sein.. Meist ist in Freizeitprojekten wie SHNG mehr Herzblut als bei einem Programmierer der das als Job macht..

          PPS:
          von einer Datenbank erwarte ich auch, dass sie immer realtime Werte für alle Nutzer hat.
          wenn ich die Daten irgendwo sammle, sind die Daten nie aktuell.
          --> Alleine wegen so etwas wie dem Konstrukt einer Datenbanktransaktion, was heutzutage Standard ist, wirst Du NIE 100% Realtime Werte haben. Du bist gerne eingeladen einen besseren Vorschlag zu pushen, der Deine Erwartungen erfüllt, für mich reicht derzeit das Databaseplugin wie es ist aus und läuft seit Monaten stabil.
          und einen 60 Sekunden Cycle für das rausdumpen historischer Werte finde ich nicht wirklich tragisch und hat schätzungsweise auch was mit Performance und Stabilität zu tun. Du darfst gerne einen Github Issue machen, auf den der Autor sich dann dazu äußern kann.

          Und in der Freizeit die ich für SHNG habe, baue ich es, neben mehreren Dutzend weiteren Baustellen, sporadisch weiter aus.. Da ich wie gesagt das Plugin auch nicht selber geschrieben habe, tue ich mir schwer, an den Kernmethoden Änderungen zu machen, da ich sie dafür vollumfänglich verstehen möchte. Ansonsten geht auf einmal gar nichts mehr. Das ist eine sensible Baustelle, da macht man nicht mal eben so alles anders.. Und auch das SQLite Plugin hatte so seine Flaws. Zudem wurde uns damals verboten, bestimmte Commits zu übernehmen, da diese angeblich nicht mehr unter der GPL standen..

          Hättest ja zu Callidomus wechseln können, der Shop ist noch online ;-P
          Zuletzt geändert von psilo; 29.07.2018, 14:27.

          Kommentar


            #35
            whe Oha, Du legst ja ein ganz schönes Anspruch-Denken an den Tag, dafür dass hier eine Reihe von Mitstreitern in ihrer Freizeit das Projekt von den Toten wiedererweckt haben und intensiv vorantreiben.
            Viele Grüße
            Martin

            There is no cloud. It's only someone else's computer.

            Kommentar


              #36
              PPS: den Buffer hatte das sqlite plugin übrigens EBENFALLS schon https://github.com/smarthomeNG/plugi...init__.py#CL64

              Kommentar


                #37
                sorry,
                ich möchte mich mit niemandem anlegen.
                ich will die Konstruktion nur verstehen.
                da ist es einfacher den Entwickler, der es geschrieben hat, zu fragen, als es sich durch reverse Engineering selbst zu erarbeiten.

                ich habe es jetzt verstanden; ich werde mich da durchwurschteln, habe als Rentner ja sowieso nichts zu tun.

                vielleicht ist ja nur das tolle database UI daran Schuld, dass ich jetzt Dinge einfach sehe, die es vorher wahrscheinlich genauso bei SQLite gab, aber mir verborgen waren. Aber nach der Umstellung auf database hat halt dieser Zweig keine Tageswerte mehr geliefert und beim eintauchen in die Details kamen Fragen über Fragen.

                Kommentar


                  #38
                  der "entwickler" liest hier nur meist nicht mit. da wäre ein issue sinniger. sein pseudonym hier im forum kenne ich gerade ad hock auch nicht, das war anders als auf github.

                  er hat derzeit meiner wahrnehmung nach aber auch nicht allzuviel zeit für das plugin oder tiefere analysen. viel code wurde eben auch aus dem sqlite plugin nachgebaut, welches ja widerum auch wieder von jemand anders ist..

                  ich hätte da auch wünsche, wie einen nativen count für die datensätze eines items. bisher kriege ich das nur auf tagesebene, da ich die gesamtzahl der einträge in python zaehle.. ein "select count" wäre hier toll.. aber ich traue mich ehrlich gesagt mit der zeit die ich derzeit habe nicht selber dran.. zuviel logik wie locks etc die ich erst verstehen müsste.da würde ich mir auch mehr kommentare im code wünschen. gibt es aber halt nicht

                  Kommentar


                    #39
                    freut mich, dass ich niemanden zu sehr geärgert habe; werde mich bessern.

                    zudem habe ich trotz Formal 1 meinen Fehler gefunden.
                    sicher konnte niemand Werte in die DB "schmuggeln" ohne entspr. coding.

                    man sollte festhalten, was man macht.
                    manchmal baut man an so vielen Stellen etwas ein, dass man den Überblick verliert.

                    danke für Deine geduldige Unterstützung.

                    Kommentar


                      #40
                      Hallo,
                      habe database plugin jetzt mit mariaDB , habe aber jetzt im log diese Sache.

                      Plugin 'database' from section 'Database' exception: invalid syntax (<string>, line 1)
                      Traceback (most recent call last):
                      File "/usr/local/smarthome/lib/plugin.py", line 129, in __init__
                      plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._gtrans)
                      File "/usr/local/smarthome/lib/plugin.py", line 567, in __init__
                      exec("self.plugin.__init__(smarthome{0}{1})".forma t("," if len(arglist) else "", argstring))
                      File "<string>", line 1

                      self.plugin.__init__(smarthome,driver="pymysql",co nnect="["host:'xxxx'", OrderedDict([('user', 'xxxxxx')]), OrderedDict([('passwd', 'xxxx')]), OrderedDict([('db', 'smarthome_db')])]",prefix="log",cycle="30")
                      ^
                      SyntaxError: invalid syntax

                      zudem legt er keine DB an beim Start.
                      stretch mit master1.5.1 und alles up to date.

                      mfg

                      Kommentar


                        #41
                        pino sind die Leerzeichen wirklich im Code oder nur beim Copy Paste entstanden?
                        .forma t
                        ,co nnect=

                        Kommentar


                          #42
                          Wie sieht denn Dein Abschnitt in der etc/plugin.yaml dazu aus?
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar


                            #43
                            also Onkelandy sieht wirklich so aus org copy paste.
                            mein etc/plugin.yaml ist wie im auszug unten , aber den arbeitet er ja ab.
                            undanach kommt die meldung.
                            werde das öog mal dazu legen anhang.

                            Database:
                            class_name: Database
                            class_path: plugins.database
                            driver: pymysql #sqlite3
                            connect:
                            - host:'xxxxx'
                            - user: 'xxxxxx'
                            - passwd: 'xxxxx'
                            - db: 'smarthome_db'
                            instance: mysqldb
                            prefix: log
                            cycle: 30
                            Angehängte Dateien

                            Kommentar


                              #44
                              Unter connect darf bei user/password/db kein Leerzeichen nach dem Doppelpunkt kommen und die Werte sollen nicht in Hochkommas stehen.
                              (Ja, ich finde das auch sehr unglücklich...)

                              Übrigens: Kennst du das CODE-Tag hier im Forum? Dann würden die Einrückungen nicht weggeputzt.

                              Kommentar


                                #45
                                Habe das jetzt geändert nur gebracht hat es nicht viel.
                                habe host auf local und 127.xxx und auf rechner ip aber immer das gleich.
                                Er arbeitet die /etc/plugin.yaml ab nur ("invalid literal for int() with base 10:")
                                kann es an maria liegen version 10.1 ?

                                2018-09-27 18:47:45 DEBUG Main set plugin Database instance to mysqldb
                                2018-09-27 18:47:45 DEBUG Main Plugin 'Database': args = '{'cycle': "'30'", 'prefix': "'log'", 'driver': "'pymysql'", 'connect': OrderedDict([('host', '127.0.0.1'), ('user', 'xxxx'), ('passwd', 'xxxx), ('db', 'smarthome_db')])}'
                                2018-09-27 18:47:45 DEBUG Main plugin 'database': Found 'driver' with value 'pymysql' in /etc/plugin.yaml
                                2018-09-27 18:47:45 DEBUG Main plugin 'database': Found 'connect' with value 'OrderedDict([('host', '127.0.0.1'), ('user', 'smarthome'), ('passwd', 'root'), ('db', 'smarthome_db')])' in /etc/plugin.yaml
                                2018-09-27 18:47:45 DEBUG Main plugin 'database': Found 'prefix' with value 'log' in /etc/plugin.yaml
                                2018-09-27 18:47:45 DEBUG Main plugin 'database': Found 'cycle' with value '30' in /etc/plugin.yaml
                                2018-09-27 18:47:45 ERROR Main Plugin 'database' from section 'Database' exception: invalid literal for int() with base 10: "OrderedDict([('host'"
                                Traceback (most recent call last):
                                File "/usr/local/smarthome/lib/plugin.py", line 129, in __init__
                                plugin_thread = PluginWrapper(smarthome, plugin, classname, classpath, args, instance, self.meta, self._gtrans)
                                File "/usr/local/smarthome/lib/plugin.py", line 567, in __init__
                                exec("self.plugin.__init__(smarthome{0}{1})".forma t("," if len(arglist) else "", argstring))
                                File "<string>", line 1, in <module>
                                File "/usr/local/smarthome/plugins/database/__init__.py", line 92, in __init__
                                self._db = lib.db.Database(("" if prefix == "" else prefix.capitalize() + "_") + "Database", driver, Utils.string_to_list(connect))
                                File "/usr/local/smarthome/lib/utils.py", line 465, in string_to_list
                                er=int(er)
                                ValueError: invalid literal for int() with base 10: "OrderedDict([('host'"

                                Kommentar

                                Lädt...
                                X