Ankündigung

Einklappen
Keine Ankündigung bisher.

Unterstützung von MySQLdb

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

  • knxvenom
    antwortet
    Hi,

    wird das mysql plugin noch gepflegt und läuft gut?
    ich bekomme demnächst mein minnowboard und da wollte ich auf mysql umsteigen da ich für meine ganzen scripte sowieso mysql verwende.

    grüße

    Einen Kommentar schreiben:


  • 2ndsky
    antwortet
    Zitat von betzs Beitrag anzeigen
    Richtiger Support für mehrere Datenbanken bedeutet in der Regel das man ein ORM wie z.B. SQLAlchemy einführt. Mit RAW SQL Queries zu arbeiten ist hässlich und sorgt für mehr Wartungsaufwand bei jeder neuen Datenbank die man unterstützen möchte.
    Korrekt, aber einen Mapper zu verwenden kostet zusätzlich Performance, die man auf einem Pi nicht im Überschuss hat. Marcus hat am sqlite Plugin ja schon ordentlich geschraubt diesbezüglich.

    Einen Kommentar schreiben:


  • Foxi352
    antwortet
    Zitat von betzs Beitrag anzeigen
    Für die Anwendung der Smarthome ist IMHO die SQLite DB vollkommen ausreichend, da wurden schon wesentlich größere Dinge mit gemacht.
    Da hast du natürlich Recht dass SQLite ausreichend ist. Das ist aber nicht der Punkt. Es gibt Leute die haben Gründe die Daten auf einem Zentralen DB Server abzuspeichern. Sei es auch nur weil sie nicht wollen dass es z.B. beim rPI in einer Datei auf der SD Karte landet. Alleine schon des Backup wegens...

    Was auch immer die Beweggründe sind: Es ist nicht SO kompliziert das in sh.py unterzubringen. Marcus hat mich gestern auf einen interessanten Pull Request aufmerksam gemacht der da schon einen ausreichenden Lösungsweg aufzeigt. 95% der User können ja auch gerne bei SQLite bleiben wenn es denen ausreichend ist ...

    Einen Kommentar schreiben:


  • betzs
    antwortet
    Richtiger Support für mehrere Datenbanken bedeutet in der Regel das man ein ORM wie z.B. SQLAlchemy einführt. Mit RAW SQL Queries zu arbeiten ist hässlich und sorgt für mehr Wartungsaufwand bei jeder neuen Datenbank die man unterstützen möchte.

    Der Dialekt von Postgres ist übrigens größtenteils mit dem Standard konform, was man vom MySQL (oft) nicht sagen kann

    Für die Anwendung der Smarthome ist IMHO die SQLite DB vollkommen ausreichend, da wurden schon wesentlich größere Dinge mit gemacht.

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hallo Serge,

    danke erst einmal für Deinen Einsatz.

    Aus den folgenden Gründen sehe ich hier momentan ein separates Plugin.

    Das SQLite-Plugin ist für mich ein sehr zentrales/wichtiges Plugin das einfach ohne Abhängigkeiten funktioniert. Ich habe bereits darüber nachgedacht das als Plugin zu entfernen und direkt fest einzubauen.
    Weiterhin hat das Plugin noch nicht alle Features, die ich gerne hätte.

    Wenn wir das jetzt in ein DB-Plugin mergen, dann müsste ich mich auch um den MySQL kümmern und bei Erweiterungen/Änderungen den MySQL spezifischen Teil ergänzen und testen.

    Ich möchte aber nicht ausschließen das ich meine Meinung ändere, aber momentan habe ich andere Baustellen.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • Foxi352
    antwortet
    Neue Version im Github. Von Alex gemeldete Fehler gefixed.

    Einen Kommentar schreiben:


  • Foxi352
    antwortet
    Zitat von Alex Beitrag anzeigen
    (*) Das Plugin ist - so, wie ich das sehe - nur für die Entwicklungsversion von sh.py lauffähig. In sh.py 1.0 fehlt in der Item-Klasse einige Eigenschaften/Funktionen (type() und prev_change bei set()), auf die das Plugin zugreift. Das nur als Hinweis.
    Ok, das erklärt das Problem von JayKay. Da ich mit der develop Version arbeite, und mknx's sqlite plugin einfach umgeschrieben habe basiert es natürlich auch auf dessen dev Version. und da sind ja kürzlich ein paar Änderungen vorgenommen worden. Das heisst für alle dass das MySQL Plugin hiermit offiziell nur mit der develop Version von sh.py läufft :-)

    Zitat von Alex Beitrag anzeigen
    (*) Mein erster Stolperstein bei der Installation auf meinem Entwicklungsrechner (das ist nicht der Rechner, auf dem MySQL läuft) war, dass ich durch die im HowTo dokumentierte "GRANT ALL PRIVILEGES ON smarthome.* TO 'smarthome'@'localhost' IDENTIFIED BY 'smarthome';" lediglich per localhost auf die DB zugreifen darf, nicht jedoch von einem anderen Rechner aus.
    Stimmt natürlich, so weit hatte ich nicht gedacht.Die richtige Syntax wenn MySQL auf einem anderen Rechner läufft wäre dann
    Code:
    GRANT ALL PRIVILEGES ON smarthome.* TO 'smarthome'@'%' IDENTIFIED BY 'smarthome';
    Zitat von Alex Beitrag anzeigen
    Meiner Meinung nach müsste da noch ein _fdb_lock.release() eingefügt werden:
    Auch da hast du Recht, danke für den Hinweis. ich werde das umändern.

    Zitat von Alex Beitrag anzeigen
    Auf die Import-Anweisung "from mysql.connector import errorcode" kannst Du m.E. verzichten, wenn Du bei folgenden Zeilen
    Code:
                if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                    logger.error("MySQL: Problem with username or password")
                elif err.errno == errorcode.ER_BAD_DB_ERROR:
                    logger.error("MySQL: Database not found")
    "mysql." vor errorcode schreibst:
    Ich verstehe nicht warum ich das Problem nicht habe, aber wenn es hilft und bei mir keine Probleme macht werden ich das so umändern.
    Zitat von Alex Beitrag anzeigen
    Nochmals vielen Dank für das Plugin :-)
    Gerne. Ich danke auch allen hier für sh.py und SmartVISU. Ein fantastiches Duo :-)

    Einen Kommentar schreiben:


  • jaykay
    antwortet
    sh.py läuft bei Auf einem std. Debian 7. Wenn ich am Wochenende dazu komme, versuche ich das mal auf einem anderen Testsystem ob es reproduzierbar ist.
    Vielleicht beißt es sich mit einem anderen Plugin oder item.

    Danke & Gruss

    JayKay

    Einen Kommentar schreiben:


  • Alex
    antwortet
    Hi Serge

    Zitat von Foxi352 Beitrag anzeigen
    Hallo,

    Aus verschiedenen Gründen hätte ich gerne meine Daten vom Raspberry auf einem externen MySQL Server und nicht in sqlite auf der SD.
    ...
    Frage ist: Besteht Interesse das Plugin reifen zu lassen und als offizielles Plugin weiterzuführen ?
    Ja, an einen MySQL-Plugin hätte ich durchaus großes Interesse.

    Daher habe ich Dein MySQL-Plugin einmal in mein - zugegebenermassen etwas verbasteltes, auf 1.0 basierendes SmartHome.py - eingebaut. Seit heute früh läuft das Plugin nun und schreibt fleissig Daten in die DB :-)

    Dafür schon einmal vielen Dank.

    Erlaube mir folgende Anmerkungen:

    (*) Das Plugin ist - so, wie ich das sehe - nur für die Entwicklungsversion von sh.py lauffähig. In sh.py 1.0 fehlt in der Item-Klasse einige Eigenschaften/Funktionen (type() und prev_change bei set()), auf die das Plugin zugreift. Das nur als Hinweis.

    (*) Mein erster Stolperstein bei der Installation auf meinem Entwicklungsrechner (das ist nicht der Rechner, auf dem MySQL läuft) war, dass ich durch die im HowTo dokumentierte "GRANT ALL PRIVILEGES ON smarthome.* TO 'smarthome'@'localhost' IDENTIFIED BY 'smarthome';" lediglich per localhost auf die DB zugreifen darf, nicht jedoch von einem anderen Rechner aus. Das ist eigentlich logisch, aber vielleicht möchtest Du das im HowTo erwähnen.

    Dann ist es so, dass wenn kein Zugriff auf die Datenbank erfolgen kann, sei es wegen fehlender Zugriffsrechte oder wegen falschen Zugangsdaten, das Plugin zwar eine Meldung ausgibt, jedoch nach meiner Einschätzung der _fdb_lock nicht freigegeben wird.

    Meiner Meinung nach müsste da noch ein _fdb_lock.release() eingefügt werden:
    Code:
            self._fdb_lock.acquire()
            self._dumpfile = dumpfile
            try:
                self._con = mysql.connect(user=self._dbuser, password=self._dbpass, host=self._dbhost, database=self._dbname)
            except mysql.Error as err:
                if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                    logger.error("MySQL: Problem with username or password")
                elif err.errno == errorcode.ER_BAD_DB_ERROR:
                    logger.error("MySQL: Database not found")
                else:
                    logger.error("MySQL: Could not connect to the database: {}".format(err))
                self._fdb_lock.release() # !!!! HIER DEN LOCK FREIGEBEN
                return
            self.connected = True
    Tatsächlich habe ich bei nicht für Netzwerk-Zugriff freigegebener Datenbank oder bei falschen Benutzer-Daten die verschiedensten, nicht direkt in Zusammenhang mit dem MySQL-Plugin stehenden Fehlermeldungen von sh.py bekommen - auch die von JayKay oben zitierte.

    Auf die Import-Anweisung "from mysql.connector import errorcode" kannst Du m.E. verzichten, wenn Du bei folgenden Zeilen
    Code:
                if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                    logger.error("MySQL: Problem with username or password")
                elif err.errno == errorcode.ER_BAD_DB_ERROR:
                    logger.error("MySQL: Database not found")
    "mysql." vor errorcode schreibst:
    Code:
                if err.errno == mysql.errorcode.ER_ACCESS_DENIED_ERROR:
                    logger.error("MySQL: Problem with username or password")
                elif err.errno == mysql.errorcode.ER_BAD_DB_ERROR:
                    logger.error("MySQL: Database not found")
    Nochmals vielen Dank für das Plugin :-)

    Viele Grüße,
    Alex

    Einen Kommentar schreiben:


  • Foxi352
    antwortet
    Zitat von jaykay Beitrag anzeigen
    Zuerst scheint folgender Import noch zu fehlen:
    Code:
    from mysql.connector import errorcode
    Das finde ich komisch. Bei mir klappt das ohne das Import. Ich habe vor sh.py noch nicht mit Python gearbeitet daher wenig Erfahrung, aber ich dachte die Zeile
    Code:
    import mysql.connector as mysql
    würde ALLES von mysql.connector einbinden...
    Wie gesagt, bei mir klappt das ja anscheinend. Was hast du denn für ein OS ? Ich hab es auf einer Linux VM mit Ubuntu 13.10 laufen .... Hab noch nicht auf meinem rPi getestet, da ist die SD mal wieder abgeraucht (was der Grund meines Wechsels auf einen "richtigen" Rechner war).


    Zitat von jaykay Beitrag anzeigen
    Code:
    AttributeError: 'Item' object has no attribute 'threads'
    Die Tabellen werden angelegt bleiben aber leer?
    Beides verstehe ich nicht, ich sehe nicht direkt was die Items und Threads Fehlermeldung aus der genannten .py Datei mit dem mysql plugin zu tun hat ... Deshalb kommen wahrscheinlich auch keine Werte in die DB...
    Zitat von jaykay Beitrag anzeigen
    Fehlt mir noch was bei meinen items oder wo suche ich am besten weiter?
    Nein, an den Items muss bis jetzt noch nichts geschraubt werden, ich will es bis jetzt ja kompatibel halten damit man einfach hin- und herswitchen kann.

    Wenn ich weiss auf welcher Platform du es laufen hast, welches OS u.s.w. dann versuche ich deine Probleme zu reproduzieren und im besten Fall zu beheben :-)

    Serge

    Einen Kommentar schreiben:


  • jaykay
    antwortet
    Hallo Serge,

    vielen Dank für das HoWTo ;-) Irgendwie klappt es bei mir nicht....

    Zuerst scheint folgender Import noch zu fehlen:
    Code:
    from mysql.connector import errorcode
    Das verhindert eine unschöne Fehlermeldung:
    Code:
    2014-03-27 19:26:15,255 ERROR    Main         Plugin sql exception: global name 'errorcode' is not defined -- plugin.py:__init__:57
    Wenn ich dann im SQL Plugin den class_path auf mysql abändere und smarthome -d laufen lasse bekomme ich folgende Exception:
    Code:
    2014-03-27 19:29:45,046 ERROR    System       Logic: System, File: /usr/local/smarthome/logics/system.py, Line: 15, Method: <module>, Exception: 'Item' object has no attribute 'Load' -- scheduler.py:_task:334
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
        exec(obj.bytecode)
      File "/usr/local/smarthome/logics/system.py", line 15, in <module>
        sh.Messungen.System.Load(round(l5, 2))
    AttributeError: 'Item' object has no attribute 'Load'
    
    
    2014-03-27 19:29:52,025 ERROR    env_stat     Logic: env_stat, File: /usr/local/smarthome/lib/env/stat.py, Line: 13, Method: <module>, Exception: 'Item' object has no attribute 'threads' -- scheduler.py:_task:334
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 327, in _task
        exec(obj.bytecode)
      File "/usr/local/smarthome/lib/env/stat.py", line 13, in <module>
        sh.env.core.threads(threading.activeCount())
    AttributeError: 'Item' object has no attribute 'threads'
    Die Tabellen werden angelegt bleiben aber leer?

    Code:
            [[[FlurKG]]]
                name = FlurKG [Lux]
                type = num
                visu = yes
                sqlite = yes
                rrd = yes
                sv_widget = "{{ plot.period('item', 'item', 'avg','24h') }}"
                knx_dpt = 9
                knx_listen = 0/1/0
                knx_init = 0/1/0
    
            [[[Load]]]
                name = Load
                type = num
                visu = yes
                sqlite = yes
                rrd = yes
                sv_widget = "{{ plot.period('item', 'item', 'avg','24h') }}"
    Auf der Konsole & im Logfile sehe ich nur folgende Infos zum (My)SQL Plugin:
    Code:
      cat smarthome.log | grep SQL
    2014-03-27 20:37:01,183 DEBUG    Main         MySQL 5.5.35-0+wheezy1 -- __init__.py:__init__:84
    2014-03-27 20:37:01,739 DEBUG    Main         MySQL Maintain next time: 2014-03-28 03:02:00+01:00 -- scheduler.py:_next_time:289
    
    cat smarthome.log | grep sql
    2014-03-27 20:37:01,124 DEBUG    Main         Plugin: sql -- plugin.py:__init__:43
    Fehlt mir noch was bei meinen items oder wo suche ich am besten weiter?

    Danke und Gruß

    JayKay

    Einen Kommentar schreiben:


  • Foxi352
    antwortet
    Wenn du mal testen willst:
    • Im smarthome/plugin Verzeichnis ein neues Unterverzeichnis mysql anlegen
    • Die Datei aus folgendem Link da rein kopieren: https://github.com/Foxi352/smarthome.../plugins/mysql
    • Den nötigen Python Mysql Connector installieren:
      Code:
      pip install --allow-external mysql-connector-python  mysql-connector-python
    • Auf deinem MySQL Server eine Datenbank smarthome anlegen.
    • Einen SQL Benutzer anlegen, z.B. mit der folgenden Kommandozeile:
      Code:
      GRANT ALL PRIVILEGES ON smarthome.* TO 'smarthome'@'localhost' IDENTIFIED BY 'smarthome';
    • in smarthome/etc die Datei plugin.conf anpassen:
      Code:
      [sql]
          class_name = SQL
      #    class_path = plugins.sqlite
          class_path = plugins.mysql
      #    dbhost = localhost
      #    dbname = smarthome
      #    dbuser = smarthome
      #    dbpass = smarthome
      dbxxxx Parameter brauchst du nur anzugeben wenn sie von dem hier angegebenen Default abweichen.


    Dann Smarthome neu starten und er müsste automatisch die Tabellen anlegen und anfangen zu befüllen. Momentan brauchst du in den Items nichts zu ändern, sprich es nutzt auch das sqlite = xx Parameter. Damit kann man sehr einfach zwischen sqlite und mysql hin und her schalten indem man einfach die eine Zeile in plugin.conf ändert. (class_path=xxxx)

    Bis jetzt läuft es bei mir stabil und ich habe auch noch kein Problem festgestellt und noch keine Fehlermeldung erhalten.

    MfG,

    Serge

    Einen Kommentar schreiben:


  • jaykay
    antwortet
    Hallo Serge,

    Ich wäre da sehr dran interessiert. Habe auch ein großen MySQL Server der gerne alles machen sollte ;-)

    Gruß

    JayKay

    Einen Kommentar schreiben:


  • Foxi352
    antwortet
    Hallo,

    Aus verschiedenen Gründen hätte ich gerne meine Daten vom Raspberry auf einem externen MySQL Server und nicht in sqlite auf der SD.

    Ich hab deshalb heute mal das sqlite plugin kopiert und zu einem mysql plugin umgeschrieben. War ne dicke Stunde Arbeit, also kein grösseres Problem (bis jetzt). Funktioniert soweit, muss natürlich noch ausführlich getestet werden.

    Frage ist: Besteht Interesse das Plugin reifen zu lassen und als offizielles Plugin weiterzuführen ?

    Wenn ja, müsste man sich mal überlegen ob man es nicht irgendwie hinkommt dass man ein generelles SQL plugin von der plugin.conf aus lädt und mit einem Parameter à la engine=mysql oder engine=sqlite irgend eine sub.py included die dann die db Aufrufe macht .... in den items.conf könnte man dann auch einfach sql=yes oder db=yes anstelle von sqlite=yes oder mysql=yes angeben ...

    Natürlich nur falls vom Häuptling aus überhaupt offizielle Unterstützung von mehreren DB Engines gewünscht ist :-) Ich weiss ja dass die Zeit knapp ist ;-)

    Serge

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hi Kay,
    Zitat von jaykay Beitrag anzeigen
    Ist das sqlite plugin staple, so das es als Referenz verwendet werden kann?
    ja es ist stable. (Bei mir wollte das Autokorrekt auch zuschlagen und staple schreiben)

    Aber noch mal das Problem liegt nicht bei Python und die Anbindung der DB.
    Die Differenzierung kommt durch die unterschiedlichen SQL Statements und dem Umgang mit den unterschiedlichen Rückgaben.

    Bis bald

    Marcus

    Einen Kommentar schreiben:

Lädt...
X