Hallo in Runde, ich versuche grad einen ESP8266 zu motivieren Messwerte an eine Raspi im lokalen WLAN zu senden.
#include <ESP8266WiFi.h> // Use this for WiFi instead of Ethernet.h
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
IPAddress server_addr('127.0.0.1'); // IP of the MySQL *server* here
//IPAddress server_addr('192.168.178.43'); // nix funzt
// IPAddress server_addr('localhost'); // IP of the MySQL *server* here
char user[] = "admin"; // MySQL user login username
char password[] = "***"; // MySQL user login password
// Sample query
char INSERT_SQL[] = "INSERT INTO pytest(txt, nbm) VALUES('Arduino', 1)";
// WiFi card example
char ssid[] = "***"; // your SSID
char pass[] = "***"; // your SSID Password
WiFiClient client; // Use this for WiFi instead of EthernetClient
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;
void setup()
{
Serial.begin(115200);
// while (!Serial); // wait for serial port to connect. Needed for Leonardo only
// Begin WiFi section
Serial.printf("\nConnecting to %s", ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// print out info about the connection:
Serial.println("\nConnected to network");
Serial.print("My IP address is: ");
Serial.println(WiFi.localIP());
Serial.print("Connecting to SQL... ");
if (conn.connect(server_addr, 3306, user, password))
Serial.println("OK.");
else
Serial.println("FAILED.");
// create MySQL cursor object
cursor = new MySQL_Cursor(&conn);
}
void loop()
{
if (conn.connected())
cursor->execute(INSERT_SQL);
delay(5000);
}
Die Verbindung zum WLAN ist o.k. Aber die Verbindung zur Datenbank wird nicht hergestellt.
Benutzer und PW der Datenbank sind richtig eingetragen. Vom Raspi aus kann per Pythonscript auf die Datenbank zugegriffen werden. In dem Fall verwende ich als IP:'localhost'
Aber egal welche IP ich unter Arduino verwende - keine Verbindung zur Datenbank!
Alternativ könntest du auch die Daten per UDP zum Raspi schicken und dann dort mit nem kleinen Skript in die Datenbank lokal eintragen.
So hatte ich das mal gemacht:
Anleitung 1 - Daten mit UDP senden/empfangen:
Anleitung 2 - Daten in Datenbank schreiben (und ich wollte Daten auch mal als graf wieder auslesen, deshalb etwas mehr als du brauchst):
Man kann lokal problemlos vom ESP8266 direkt auf MySQL/MariaDB zugreifen. Die Verbindung ist unverschlüsselt, was im lokalen Netz in meinen Augen kein Problem ist.
Auf eine ferne Datenbank greife ich per HTTPS auf ein PHP-Script zu, dass die Daten per PDO oder mysqli in die Datenbank einträgt.
Die grafische Auswertung erfolgt mit chart.js, das per PHP "gefüttert" wird.
Vom Prinzip her hast du nix übersehen. Ich halte im lokalen Netz nur die Wahrscheinlichkeit für extrem gering. Worst-case ist die app schmiert ab, wenn er etwas anderes schickt. Wenn er uns ärgern möchte schickt er ein gültiges Format mit falschen Werten
Risiko muß natürlich jeder für sich selber abwägen
am Ende der Datei eingefügt. sudo systemctl restart mariadb
pi@RP4:~ $ sudo systemctl restart mariadb
Job for mariadb.service failed because the control process exited with error code.
See "systemctl status mariadb.service" and "journalctl -xe" for details.
aber da steht nix, dass mariadb is listen - Fehler?
docs.rackspace ist da auch nicht so hilfreich: mysql -u root -p
verlangt das Passwort von root. Das bei der Installation festgelegt Passwort wird nicht akzeptiert.
Am Ende 2 Tage viel Erfahrung gesammelt - Ergebniss: 0
Der ursprünglich Plan ist per Python Messwerte vom Arduino anzufragen.
Nach Aufforderung sendet der ESP8266 die Meßwerte an den Raspi auf welchem das Pythonscript dann weiter abgearbeitet wird und anschließend zu Thingsspeak als einen Datensatz senden.
Umsetzen wollte ich es mit einem MQTT-Broker: Public und Subscribe funzen. Aber die Antwort vom ESP kommt nicht im Pythonscript an.
Vielleicht kennt noch wer eine andere Lösung?
PS: mir wäre es sehr lieb die ganze Prozedur auf dem Raspi in Python abzuarbeiten
Die bind-Adresse ist die der Netzwerkverbindung, auf die die DB lauschen soll, nicht die des ESP.
Die des ESP muss beim User, der die Daten schreiben soll, eingetragen werden.
Ok, jetzt hast du mich neugierig gemacht. Könnte ich in Zukunft ja vielleicht auch mal brauchen also würd ich das spätestens zum Wochenende mal probieren
Aja, habe gestern noch bis spät gebastelt - bin zu doof dafür
meine Lösung:
Auf dem Raspi werder per Python-Script die Messdaten in einen String gesammelt.
anschließend wird der Arduino angepingt.
Variante A: ESP ist im Netz: dann erhält er vom Raspi per MQTT-Broker den Topic mit den Messdaten, ergänzt diesen mit Aussentemperatur und Luftfeuchte, und sendet alles Richtung Thingspeak.
Variante B: ESP ist nicht im Netz: dann sendet Python die Messdaten direkt an Thingspeak.
Ich bin mir nur unsicher wie der ESP mit dem String umgehen kann.
Danke für jede Hilfe und Unterstützung, Jubel von den Tribünen - man lernt noch immer dazu....
glückwunsch wenn du zufrieden bist . hatte es jetzt auch noch mal probiert. weiß zwar nicht ob es jetzt in die richtung geht wie du es dir vorstellst aber ich habe jetzt auf dem ESP ein topic subscribed wo ihm dann wiederum ein befehl geschickt werden kann auf den hin er dann seine messdaten published, die dann in dem python skript ankommen. ist glaub ich nicht exakt dein use case bzw. fehlt nur noch das weiterschreiben in die datenbank, aber vielleicht hilft es ja noch.
damit auch ich es in ein paar monaten noch wiederfinde hab ichs mir hier zusammen geschrieben:
Danke für die Lösung, das war der Plan.
Vielleicht noch ein Hinweis zum sehr schön erläuterten Tutorial:
Nach Installation des MQTT-Servers auf dem Raspie klappte das Senden und Empfangen auf dem Raspi in 2 Konsolen perfekt. Aber am ESP kam trotzdem nix an.
Erst nach dem Tip (gelesen im Elektronik-Kompedium)
Zuerst öffnen wir die Konfigurationsdatei von Mosquitto: sudo nano /etc/mosquitto/conf.d/local.conf
In die Datei fügen wir folgende Zeilen ein:
listener 1883
allow_anonymous true
Anschließend die Datei speichern und schließen: Strg + O, Return, Strg + X.
Damit die Konfiguration wirksam wird, muss Mosquitto neu gestartet werden. sudo systemctl restart mosquitto<