Forum: Mikrocontroller und Digitale Elektronik Esp8266 und Mysql


von Horst (Gast)


Lesenswert?

Hat hier schon jemand mit ESp8266, der Arduinoumgebung und dem 
MySQL-Connector (https://github.com/ChuckBell/MySQL_Connector_Arduino) 
gearbeitet?

Für ein paar Quick&Dirty Funksteuerungen (die Frau hat festgestellt, daß 
plötzlich Weihnachten ist) hab ich einige Sonoff SS20-Steckdosen 
genommen die sich ihren Schaltzustand aus einer MySQL-DB holen, die 
Abfrage soll einmal die Sekunde laufen.

Im Betrieb hat sich herausgestellt, daß der eingebaute Schalter extrem 
träge reagiert.

Bei der Fehlersuche hat sich gezeigt, daß selbst der einfache 
MySQL-Select aus dem Beispiel 
(https://github.com/ChuckBell/MySQL_Connector_Arduino/blob/master/examples/basic_select/basic_select.ino) 
über eine Sekunde dauert. Das Errorlog des Servers ist leer, es wird 
nicht einmal ein slow_query protkolliert.

Gibt es ähnliche Erfahrungen/Lösungen/Alternativen?

von Oliver S. (phetty)


Lesenswert?

Wieso nimmst du nicht Tasmota?

Da brauchst du keine Datenbank. Das holt sich die Zeit aus dem Netz, 
kann anhand von eingestelltem Längen/Breitengrad den Sonnenstand 
errechnen und bei errechneter Dämmerung einschalten.

https://github.com/arendst/Tasmota

von Stefan F. (Gast)


Lesenswert?

> Gibt es ähnliche Erfahrungen/Lösungen/Alternativen?

Nein, das habe ich so extrem noch nie erlebt.
Ist die Datenbank auch so langsam, wenn du die gleiche Abfrage mit einem 
anderen MySQL Client (auf dem PC) ausführst?

Wie lautet das SQL Statement, wie sieht die Tabellenstrukur aus (show 
create table ....) und wie viele Datensaätze hat sie insgesamt?

von Horst (Gast)


Lesenswert?

Oliver S. schrieb:
> Wieso nimmst du nicht Tasmota?

Weil ich schon eine laufende MySQL-Datenbank habe, mit auch die Zeit von 
einem NTP-Server hole und für die sechs Wochen die Dämmerung nicht neu 
berechnen muß.
Die Frage nach Alternativen bezog sich auf eine MySQL-Lib für Arduino.


Die Abfragen von anderen Geräten und vom Webserver, der mit der DB auf 
einem PI3 läuft, liegen im normalen Bereich.
Die Tabelle 'Schalter' hat aktuell sieben Spalten:

Nummer,In1,In2,Out1,Out2,Temp,Bezeichnung

und für jeden der 5 SS20 eine Zeile.
Der Query ist ein simpler

SELECT Out1 FROM Schalter WHERE Nummer = $IP[3]

Wobei IP[0-3] die aktuell zugewiesene IP-Adresse ist.

Den Datenbankauszug kann ich nachher noch ausführlich posten.

von Stefan F. (Gast)


Lesenswert?

Horst schrieb:
> Die Abfragen von anderen Geräten und vom Webserver, der mit der DB auf
> einem PI3 läuft, liegen im normalen Bereich.

Dann ist die DB ja Ok, so dass dies nicht nötig ist:
> Den Datenbankauszug kann ich nachher noch ausführlich posten.

Du könntest den Zugriff auf die DB durch ein simples PHP Script leiten, 
dann brauchst du auf dem ESP8266 nur den normalen HTTP Client, der 
schnell ist.

von Torsten (Gast)


Lesenswert?

1) Die Frage, warum du nicht Tasmota nimmst, kam ja schon.
2) Vielleicht schaust du dir mal MQTT zu Steuerung an. Nicht nur, weil 
das Tasmota das auch kann, sondern weil es für solche Zwecke halt 
absolut geeignet ist.

von Horst (Gast)


Lesenswert?

Torsten schrieb:
> Vielleicht schaust du dir mal MQTT zu Steuerung an.

Danke, die Vorschläge sind nett, aber ich stelle nicht mein komplettes 
System um, nur weil eine Komponente nicht ganz so gut damit läuft.
Notfalls lasse ich auf dem Pi ein Script laufen, das die DB ausliest und 
die Steckdosen direkt über TCP anspricht bis ich die ohne Arduino neu 
geschrieben habe.

Mich interessiert nur, wo es bei der MySQL-Lib hakt.

von Stefan F. (Gast)


Lesenswert?

Versuche das mal dort zu klären, wo der Author der Bibliothek support 
leistet: https://github.com/ChuckBell/MySQL_Connector_Arduino/issues

von Horst (Gast)


Lesenswert?

Stefan F. schrieb:
> Versuche das mal dort zu klären, wo der Author der Bibliothek
> support
> leistet: https://github.com/ChuckBell/MySQL_Connector_Arduino/issues

Nachdem, was da zu lesen ist, ist eine Laufzeit von einer bis mehreren 
Sekunden für einen Query normal.
Dann bleibt das erstmal so.

von Oliver S. (phetty)


Lesenswert?

Du hast also eine mysql-Datenbank wo EInschalt- und Ausschaltzeiten drin 
stehen und lässt da dann diverse Arduinos und esp8266 drauf zugreifen.
Das scheint ein interessantes Konzept zu sein, kannst du uns mehr dazu 
erzählen?
Wie kommen die Daten in die Datenbank rein?

von Horst (Gast)


Lesenswert?

Naja, weniger Arduinos, die verwende ich selten und das sind jetzt die 
ersten ESP. Es sind ein paar Pi (Wetterastation, Heizungssteuerung ...), 
einige Mega8 und STM32 die über RS485 wieder an einem Pi-Zero hängen und 
als Sensoren und Schalter dienen (Lichtsteuerung, Zustand Türen+Fenster 
...).
Alle schreiben ihre Daten in die Datenbank auf einem PI3 und holen sich 
die Sollzustände dort ab. Diverse Scripte geben dann neue Zustände für 
die Aktoren in der Datenbank vor.
Auf dem läuft auch ein Webserver über den alle Zustände abgefragt und 
geändert werden können.
Natürlich auf einer Oberfläche mit LCARS-Design.

Irgendwann hab ich da mal ne Doku zu fertig und pack die auf meine 
Webseite.

von Postgresql12 (Gast)


Lesenswert?

Horst schrieb:
> .. die
> Abfrage soll einmal die Sekunde laufen.

Hm, hat mysql inzwischen nicht auch einen listen/notify System?

von JJ (Gast)


Lesenswert?

Von Autor von Tasmota gibt es scheinbar eine MQTT/MySQL Schnittstelle:
https://github.com/arendst/mqtt-mysql

Sorry, wenn wir hier alle auf MQTT rumreiten, aber das ist ein wirklich 
elegantes Kommunikationssystem.

von Horst (Gast)


Lesenswert?

JJ schrieb:
> Sorry, wenn wir hier alle auf MQTT rumreiten, aber das ist ein wirklich
> elegantes Kommunikationssystem.

Das will ich ja gerne glauben, aber ich sehe trotzden keinen Sinn darin 
meine Anlage auf ein neues Protokoll umzustellen, nur weil ein Schalter 
nicht auf Anhieb mit meinem läuft. Zumal ich für den sowieso was selbst 
schreiben will sobald er keine Lichterketten mehr schalten muß.

von Stefan F. (Gast)


Lesenswert?

Horst schrieb:
> ich sehe trotzden keinen Sinn darin
> meine Anlage auf ein neues Protokoll umzustellen, nur weil ein Schalter
> nicht auf Anhieb mit meinem läuft

Dann schreibe halt deinen eigenen MySQL Connector, wenn du meinst, das 
sei einfacher oder besser.

von Harry L. (mysth)


Lesenswert?

MYSQL ist kein Ersatz für MQTT und MQTT ist kein Ersatz für MYSQL.

Gemeinsam ist das allerdings eine sehr gute Kombination.

von Horst (Gast)


Lesenswert?

Stefan F. schrieb:
> Dann schreibe halt deinen eigenen MySQL Connector, wenn du meinst, das
> sei einfacher oder besser.

Besser geh ich von aus, auf einem stm32F103 mit Cat5 läuft der schnell 
genug, das sollte der ESP also auch besser können, einfacher als Arduino 
nicht, sonst hätte ich das nicht versucht, einfacher als die Umstellung 
auf MQTT mit Sicherheit.

Ich war nur erstaunt, daß die Abfragen so langsam liefen und dachte ich 
hätte was falsch gemacht.

von Harry L. (mysth)


Lesenswert?

Horst schrieb:
> einfacher als die Umstellung
> auf MQTT mit Sicherheit.

Du hast die Funktion von MQTT nicht einmal ansatzweise verstanden.

SQL im IoT bis in das Frontend zu bringen ist so ziemlich die dümmste 
Idee überhaupt.

...aber wenn man nix Anderes kennt.

von sid (Gast)


Lesenswert?

Horst schrieb:
> genommen die sich ihren Schaltzustand aus einer MySQL-DB holen, die
> Abfrage soll einmal die Sekunde laufen.

AUTSCH!

Aber gut..
Gegenangebot..
statt einer Abfrage jede Sekunde nach jedem einzelnen Schaltzustand..
mach Dir eine zweite Tabelle mit nur einer Zeile und einer Spalte
mittels Routine lässt Du den Schaltzustand in einen fortlaufenden 
binärstring
schreiben
und Du fragts nur diese eine Zeile in dieser Tabelle ab

Im Fehlerfall kannst Du dann auf die eigentliche Tabelle zugreifen.
jede sekunde reicht der binärstring um zu sehen ob alle schalter da 
waren wo sie vor einer Sekunde waren
jede neue NULL bedeutet schlicht aus, jede neue 1 bedeutet entweder an,
oder "sieh in anderer tabelle nach"
Denk aber daran das während Du sql ausliesst kein neues auslesen der 
tabelle gestartet wird
ansonsten hast Du gaaanz schnell die process list voll und mysql geht in 
die Knie

von Horst (Gast)


Lesenswert?

ok, dann möchte ich mich bei allen Beteiligten entschuldigen, daß ich 
dumm bin und kein mqtt sondern eigene Scripte und mysql verwende.
Ich bin halt alt und schreibe alles selber, damit ich weis was es macht.

EOD4me

von sid (Gast)


Lesenswert?

Ohweh.. wenn Du meinen Beitrag so verstanden hast entschuldige bitte!

ich find nur sekündliche Abfrage einer Datenbanktabelle unbekannter 
Grösse
mindestens schwierig;
ich muss gestehen dass mir persönlich eine http abfrage an php auch 
sinnvoller erscheint, aber das ist Geschmacksache mehr nicht.

Ich denke bloss, eine seinzelne Zeile
"select * from bintable limit 1;"
sicherlich eine kürzere Antwort als
"select * from switchtable limit 100;" ;)
erfordert.

deswegen die idee die schaltstellungen durchnummeriert
als binary zu schicken und im esp dann die bits zu interpretieren als 
"an/aus"
Die einzelne Zeile kann man als Routine erstellen
sobald sich in der switchtable was ändert.
was das ganze relativ bequem macht meines Erachtens nach

von Horst (Gast)


Lesenswert?

sid schrieb:
> Ohweh.. wenn Du meinen Beitrag so verstanden hast entschuldige bitte!

Das war nicht auf Deinen Post bezogen

sid schrieb:
> ich find nur sekündliche Abfrage einer Datenbanktabelle unbekannter
> Grösse mindestens schwierig;

Ganz unbekannt ist die nicht, wie oben schon geschrieben hat die Tabelle 
eine Zeile für jede Steckdose mit sieben Spalten, eindeutig definiert 
durch die unique Nummer, die sich aus dem letzten Oktett der IP-Adresse 
ergibt.

Somit liefert die Abfrage
SELECT Out1 FROM Schalter WHERE Nummer = $IP[3]
genau einen Wert oder die Tabelle ist kaputt.
Ich brauche ja nicht die (Soll)zustände aller Schalter und Steckdosen, 
da komme ich ohne Wildcards und Limiter aus.
Die Zuordnungsmatrix Sensoren/Schalter/Aktoren/Steckdosen ... liegt in 
einem anderen Script, daß dann die Sollwerte in der DB setzt.

sid schrieb:
> ich muss gestehen dass mir persönlich eine http abfrage an php auch
> sinnvoller erscheint

Damit verschiebe ich die Arbeit nur auf den Server und der ESP langweilt 
sich noch mehr.

von Martin M. (mcmaier)


Lesenswert?

Horst schrieb:
> Natürlich auf einer Oberfläche mit LCARS-Design.

Hallo Horst,
kannst du davon mal einen Screenshot hochladen? Würde mich interessieren 
;-)

Hast du eine Webseite, wo man bisschen was über dein Projekt lesen kann?

Finde die Thematik auch interessant. Bisher habe ich nur einige ESPs als 
MQTT-Sensoren/Aktoren laufen, gesteuert über OpenHAB. Um die Sensordaten 
besser loggen und verarbeiten zu können, muss ich mich aber noch mehr 
mit Datenbanken, PHP-Skripten und RESTful Interfaces usw. befassen...

von Sven K. (quotschmacher)


Lesenswert?

Martin M. schrieb:
> RESTful Interfaces

könnte das nicht auch was für den horst sein? mit python schnell ne 
kleine web-api machen, die dann auf dem db-server mitläuft. dann kann 
man mit einem einfachen http get den soll-zustand abfragen und gut is. 
und dann noch ein http post für das setzen. fertig. dann kann alles mit 
sql auf dem deutlich flotteren servern laufen und die schaltsteckdose 
muss nur noch die antwort vom server auswerten und selber kein sql 
machen.
so als überlegung, wenn man nicht alles umstellen möchte und kein mqtt 
will.

von sid (Gast)


Lesenswert?

Horst schrieb:
> Ganz unbekannt ist die nicht, wie oben schon geschrieben hat die Tabelle
> eine Zeile für jede Steckdose mit sieben Spalten

es geht nicht um die Anzahl der Spalten, es geht um die Anzahl der 
Zeilen.

while row vs if row
versteh das so, der Controller fragt erstmal nach dem
gemeinsamen hash aller spalten, und arbeitet die nur ab FALLS sich 
was ändert sonst wartet er die sekunde und fragt erneut.
WENN sich was ändert fragt er nur nach denen WELCHE sich geändert 
haben nicht nach allen

von Horst (Gast)


Lesenswert?

Martin M. schrieb:
> kannst du davon mal einen Screenshot hochladen? Würde mich interessieren
>
> Hast du eine Webseite, wo man bisschen was über dein Projekt lesen kann?

Aktuell ist das noch nicht so aufbereitet, daß es vorzeigbar währe. Ist 
aber demnächst in Planung.

Das LCARS-Design hab ich von da: 
https://github.com/joernweissenborn/lcars

von andreasgf (Gast)


Lesenswert?

Horst schrieb:
> Bei der Fehlersuche hat sich gezeigt, daß selbst der einfache
> MySQL-Select aus dem Beispiel
> 
(https://github.com/ChuckBell/MySQL_Connector_Arduino/blob/master/examples/basic_select/basic_select.ino)


Wie lange dauert es denn ?
Naja, in Zeile 55 wird nachdem Connect schonmal 1 sek. gewartet.
Im loop zeile 66 wieder 1 sek., und nochmal 0,5 sek (Zeile 90) für die 
2te Abfrage.

evtl. können die Zeiten verkürzt werden.

Gruß
Andreasgf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.