Esp8266 und Mysql

Gast #6045381
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?
Gast #6045579
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?
Gast #6045628
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.
Gast #6045649
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.
Gast #6045696
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.
Gast #6045709
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.
Gast #6047103
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.
Gast #6047233
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ß.
Gast #6047647
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.
Gast #6047955
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
Gast #6047961
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
Gast #6047980
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
Gast #6047997
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.
#6048003
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...
#6048129
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.
Gast #6048482
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
Gast #6049543
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren