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
Ankündigung
Einklappen
Keine Ankündigung bisher.
Unterstützung von MySQLdb
Einklappen
X
-
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.Zitat von betzs Beitrag anzeigenRichtiger 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.
Einen Kommentar schreiben:
-
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...Zitat von betzs Beitrag anzeigenFür die Anwendung der Smarthome ist IMHO die SQLite DB vollkommen ausreichend, da wurden schon wesentlich größere Dinge mit gemacht.
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:
-
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:
-
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:
-
Neue Version im Github. Von Alex gemeldete Fehler gefixed.
Einen Kommentar schreiben:
-
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(*) 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.
Stimmt natürlich, so weit hatte ich nicht gedacht.Die richtige Syntax wenn MySQL auf einem anderen Rechner läufft wäre dannZitat 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.
Code:GRANT ALL PRIVILEGES ON smarthome.* TO 'smarthome'@'%' IDENTIFIED BY 'smarthome';
Auch da hast du Recht, danke für den Hinweis. ich werde das umändern.Zitat von Alex Beitrag anzeigenMeiner Meinung nach müsste da noch ein _fdb_lock.release() eingefügt werden:
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 anzeigenAuf die Import-Anweisung "from mysql.connector import errorcode" kannst Du m.E. verzichten, wenn Du bei folgenden Zeilen
"mysql." vor errorcode schreibst: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")
Gerne. Ich danke auch allen hier für sh.py und SmartVISU. Ein fantastiches Duo :-)Zitat von Alex Beitrag anzeigenNochmals vielen Dank für das Plugin :-)
Einen Kommentar schreiben:
-
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:
-
Hi Serge
Ja, an einen MySQL-Plugin hätte ich durchaus großes Interesse.Zitat von Foxi352 Beitrag anzeigenHallo,
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 ?
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:
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.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
Auf die Import-Anweisung "from mysql.connector import errorcode" kannst Du m.E. verzichten, wenn Du bei folgenden Zeilen
"mysql." vor errorcode schreibst: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")
Nochmals vielen Dank für das Plugin :-)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")
Viele Grüße,
Alex
Einen Kommentar schreiben:
-
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 ZeileZitat von jaykay Beitrag anzeigenZuerst scheint folgender Import noch zu fehlen:
Code:from mysql.connector import errorcode
würde ALLES von mysql.connector einbinden...Code:import mysql.connector as mysql
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).
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 anzeigenDie Tabellen werden angelegt bleiben aber leer?Code:AttributeError: 'Item' object has no attribute 'threads'
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.Zitat von jaykay Beitrag anzeigenFehlt mir noch was bei meinen items oder wo suche ich am besten weiter?
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:
-
Hallo Serge,
vielen Dank für das HoWTo ;-) Irgendwie klappt es bei mir nicht....
Zuerst scheint folgender Import noch zu fehlen:
Das verhindert eine unschöne Fehlermeldung:Code:from mysql.connector import errorcode
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:26:15,255 ERROR Main Plugin sql exception: global name 'errorcode' is not defined -- plugin.py:__init__:57
Die Tabellen werden angelegt bleiben aber leer?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'
Auf der Konsole & im Logfile sehe ich nur folgende Infos zum (My)SQL Plugin: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') }}"
Fehlt mir noch was bei meinen items oder wo suche ich am besten weiter?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
Danke und Gruß
JayKay
Einen Kommentar schreiben:
-
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:
dbxxxx Parameter brauchst du nur anzugeben wenn sie von dem hier angegebenen Default abweichen.Code:[sql] class_name = SQL # class_path = plugins.sqlite class_path = plugins.mysql # dbhost = localhost # dbname = smarthome # dbuser = smarthome # dbpass = smarthome
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:
-
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:
-
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:
-
Hi Kay,
ja es ist stable. (Bei mir wollte das Autokorrekt auch zuschlagen und staple schreiben)Zitat von jaykay Beitrag anzeigenIst das sqlite plugin staple, so das es als Referenz verwendet werden kann?
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:


Einen Kommentar schreiben: