DBBridge – Troubleshooting

Im Idealfall solltet Ihr diesen Artikel nie lesen müssen. Alles wichtige wird in DBBridge – Ein Bluetti Kompanion und DBBridge – Datenbank und Webanwendung angesprochen und erklärt!

Doch wie ich durch einige Kunden weiß, gibt es doch immer wieder ein paar Probleme. Und diesen Problemen möchte ich mit diesem Artikel zu Leibe rücken.

Allgemein

Auch mir passiert es immer wieder dass ich versehentlich Fehler bei der Eingabe von Passwörtern oder API keys mache. Die erste Empfehlung ist darum sich viel Mühe bei der Eingabe dieser Dinge zu geben und wirklich Zeichen für Zeichen zu prüfen ob es die richtigen sind!

Funktioniert DBBridge vielleicht gerade dann nicht, wenn Du mit dem Smartphone mit der Bluetti verbunden bist? Das geht dann natürlich nicht.

Es gab mehrfach den Fall dass DBBridge scheinbar defekt ist, da die normale Anzeige nicht mehr kam und der ‘Unicorn’-Zähler sich beständig erhöht. In diesem Fall einfach einmal das Bluetooth oder sogar die Bluetti ein- und wieder ausschalten. Das hat das Problem nachweisbar in mehreren Fällen behoben!

Wie arbeitet man eigentlich auf dem Raspberry Pi?

Viele werden wahrscheinlich die Datenbank auf einem Raspberry Pi oder ähnlichem einrichten. Für Anfänger entsteht da das Problem wie sie überhaupt mit dem Raspberry Pi arbeiten können. Wenn Ihr allerdings einen zweiten Bildschirm, eine zweite Tastatur und eine zweite Maus habt, ist das natürlich kein Problem. Aber falls nicht, ist es sogar einfacher den Raspberry Pi über Putty oder einer Remotedesktopverbindung von Windows zu machen. Doch auch für Putty müsst Ihr einmal den Monitor/Tastatur/Maus Weg wählen. Und dann auf dem Raspberry Pi SSH frei schalten. Wie das geht findet Ihr hier.

Auch für die Remotedesktopverbindung von Windows benötigt Ihr einmal einen normalen Zugang zum Raspberry Pi. Und müsst dort dann die Unterstützung für die Remotedesktopverbindung mit:

sudo apt install xrdp [Enter]

aktivieren.

Um dann tatsächlich mit dem Raspberry Pi zu arbeiten müsst Ihr anschließend mit Putty eine Terminalverbindung öffnen oder erst die Remotedesktopverbindung öffnen, Euch anmelden und dann dort auf dem Raspberry Pi Desktop ein Terminalfenster öffnen.

Um mit der Datenbank selbst zu arbeiten bedarf es des Datenbankclients. Den startet Ihr im Terminal mit:

sudo mysql -u root -p

Ich verwende dazu allerdings meist unter Windows den alten MySQL Query Browser oder gleich die MySQL GUI Tools, ich glaube da ist der MySQL Query Browser dabei.

Die Verbindung von DBBridge zur Datenbank funktioniert nicht

Eigentlich ist  MySQL und sein Nachfolger MariaDB problemlos zu installieren und einzusetzen. Doch im Zusammenhang mit DBBridge gibt es eine kleine Hürde: Denn DBBridge ist ein kleiner Computer der sozusagen aus der Ferne auf die MySQL Datenbank zugreifen möchte. Und das wird von MySQL standardmäßig nicht erlaubt! Es ist aber gar kein Problem es zu ermöglichen und eigentlich wird auf meiner Seite zur Einrichtung der Datenbank und dem Webserver alles notwendige eingerichtet. Aber wer zum Beispiel schon eine Datenbank am Laufen hat und die Einrichtung weitgehend selbst vornimmt, der übersieht das vielleicht. Die 2 wichtigsten Punkte dabei sind:

Ist in der Konfigurationsdatei (bei MariaDB auf dem Raspberry Pi ist das die Datei ‘/etc/mysql/mariadb.conf.d/50-server.cnf’ ) der verwendeten Datenbank ‘bind-address = 0.0.0.0‘ gesetzt?
Ist in der Datenbank kein User eingerichtet worden der einen Fernzugriff auf die Datenbank hat? Dabei ist das ‘%’-Zeichen sehr wichtig! Hier noch einmal ein Beispiel für einen passenden User samt einzurichtender Rechte:

CREATE USER ‘dbbridge’@’%’ IDENTIFIED BY ‘publictraffic’;
GRANT SELECT, INSERT ON dbbridge.* TO ‘dbbridge’@’%’;
FLUSH PRIVILEGES;

Und der hier definierte User ist der, den Ihr im Konfigurationsdialog von DBBridge angeben müsst!

In meinem Datenbankscript wird auch ein passender User eingerichtet.

Solltet Ihr vor dem Abarbeiten des Scripts in MySQL das Script in einem Editor geändert haben, um zum Beispiel den Usernamen oder das Userpasswort anzupassen und das Script ist anschließend aufgrund einem Fehler von Euch nicht durchgelaufen, so müsst Ihr vor einem erneuten Durchlauf die Datenbank und den User löschen. Das geht so:

Erst noch bei MySQL/MariaDB anmelden:

sudo mysql -u root -p

Dann

DROP USER ‘dbbridge’@’%’;

DROP DATABASE dbbridge;

Dann könnt Ihr mit

SOURCE database.sql;

das Script noch einmal durchlaufen lassen.

Wenn Ihr sehen wollt, was für User bisher angelegt worden sind:

SELECT User, Host FROM mysql.user;

Wenn Ihr die IP vom Raspberry Pi herausfinden wollt:

ifconfig [Enter]

Es werden keinen Datensätze mehr in die Datenbank eingetragen

Wenn die Datenbankverbindung grundsätzlich funktioniert, aber gelegentlich Probleme auftauchen. Es kann unter Umständen vorkommen, dass die Datenbankverbindung nicht immer korrekt geschlossen wird. Eigentlich ist alles so programmiert, dass das auf keinen Fall passieren darf, aber der verwendete Datenbanktreiber hat möglicherweise ein Problem. Jedenfalls könnten dann nach einiger Zeit zu viele offenen Datenbankverbindungen entstehen und irgendwann kann dann keine neue mehr erstellt werden! Um dies zu verhindern, kann die Datenbank so konfiguriert werden, dass sie offene Verbindungen automatisch löscht:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf [Enter] Damit ruft Ihr den Nano Editor auf und könnt die Konfigurationsdatei von MariaDB ändern.
Fügt unter ‘[mariadb]’ die Zeile ‘interactive_timeout = 90’ ein. Damit werden eventuell nicht geschlossene Datenbankverbindungen nach 90 Sekunden automatisch gelöscht.

Probleme mit OpenWeatherMap

Also ihr habt Euch einen API key von OpenWeatherMap geholt und DBBridge zeigt keine Wettervorhersage an? Ich gehe einmal davon aus, dass Ihr das WiFi eingerichtet habt und es auch funktioniert? Auf der zweiten Seite mit den 4 grauen Feldern müsste bei funktionierender WLAN Verbindung rechts unten die aktuelle Uhrzeit zu sehen sein?

Wie mir meine Kunden mitgeteilt haben ist es nicht mehr ganz so einfach wie vor etwa einem Jahr einen brauchbaren API key von OpenWeatherMap zu bekommen. Mittlerweile müsst Ihr das ‘One Call API 3.0’ beantragen und dabei Eure Adresse da lassen. Trotzdem sollen bis zu 1000 Abfragen pro Tag kostenlos sein und mehr als 24 Abfragen am Tag macht DBBridge bisher auf keinen Fall.

Ob der API key funktioniert könnt Ihr ausprobieren, in dem Ihr nachfolgende URL in einem Browser einsetzt, die vielen XXX durch Euren API key ersetzt und absendet.

One Call API 3.0

http://api.openweathermap.org/data/2.5/onecall?lat=49.8461&lon=8.7586&exclude=minutely,hourly&lang=de&APPID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Seit kurzem habe ich auch eine Unterstützung des ‘5 Day / 3 Hour Forecast’ API eingebaut. dafür benötigt Ihr dann doch keine Adresse und Kreditkarte. Dafür bietet sie auch nur eine Vorhersage für 5 Tage an.

5 Day / 3 Hour Forecast

http://api.openweathermap.org/data/2.5/forecast?&lat=49.7461&lon=8.8586&lang=de&appid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Wenn alles klappt, bekommt Ihr in etwa folgendes zurück:

{"lat":49.8461,"lon":8.7586,"timezone":"Europe/Berlin","timezone_offset":3600,"current":{"dt":1678122854,"sunrise":1678082334,"sunset":1678122844,"temp":276.92,"feels_like":273.35,"pressure":1006,"humidity":69,"dew_point":271.93,"uvi":0,"clouds":100,"visibility":10000,"wind_speed":4.25,"wind_deg":247,"wind_gust":7.52,"weather":[{"id":804,"main":"Clouds","description":"Bedeckt","icon":"04n"}]},"daily":[{"dt":1678100400,"sunrise":1678082334,"sunset":1678122844,"moonrise":1678118580,"moonset":1678082700,"moon_phase":0.47,"temp":{"day":276.75,"min":273.94,"max":277.78,"night":274.95,"eve":276.92,"morn":274.21},"feels_like":{"day":273.48,"night":271.14,"eve":273.35,"morn":271.52},"pressure":1007,"humidity":76,"dew_point":272.68,"wind_speed":4.51,"wind_deg":255,"wind_gust":9.81,"weather":[{"id":616,"main":"Snow","description":"Regen und Schnee","icon":"13d"}],"clouds":100,"pop":0.65,"rain":0.17,"snow":0.87,"uvi":1.14},{"dt":1678186800,"sunrise":1678168608,"sunset":1678209341,"moonrise":1678209180,"moonset":1678170000,"moon_phase":0.5,"temp":{"day":277.26,"min":274.99,"max":278.85,"night":276.9,"eve":277.75,"morn":275.49},"feels_like":{"day":272.8,"night":272.08,"eve":273.57,"morn":270.75},"pressure":1001,"humidity":73,"dew_point":272.97,"wind_speed":7.09,"wind_deg":233,"wind_gust":14.35,"weather":[{"id":616,"main":"Snow","description":"Regen und Schnee","icon":"13d"}],"clouds":100,"pop":0.6,"rain":0.6,"snow":0.12,"uvi":1.51},{"dt":1678273200,"sunrise":1678254881,"sunset":1678295838,"moonrise":1678299840,"moonset":1678257180,"moon_phase":0.53,"temp":{"day":275.48,"min":273.58,"max":276.94,"night":273.58,"eve":274.9,"morn":274.85},"feels_like":{"day":273.4,"night":273.58,"eve":274.9,"morn":272.63},"pressure":994,"humidity":100,"dew_point":275.53,"wind_speed":6.53,"wind_deg":232,"wind_gust":13.68,"weather":[{"id":616,"main":"Snow","description":"Regen und Schnee","icon":"13d"}],"clouds":100,"pop":1,"rain":19.47,"snow":7.8,"uvi":0.77},{"dt":1678359600,"sunrise":1678341154,"sunset":1678382335,"moonrise":1678390500,"moonset":1678344360,"moon_phase":0.56,"temp":{"day":275.26,"min":273.46,"max":277.67,"night":277.67,"eve":276.91,"morn":273.7},"feels_like":{"day":273.63,"night":275.73,"eve":275.32,"morn":273.7},"pressure":1005,"humidity":99,"dew_point":275.23,"wind_speed":2.23,"wind_deg":204,"wind_gust":5.45,"weather":[{"id":616,"main":"Snow","description":"Regen und Schnee","icon":"13d"}],"clouds":100,"pop":1,"rain":13.88,"snow":1.62,"uvi":0.63},{"dt":1678446000,"sunrise":1678427426,"sunset":1678468831,"moonrise":1678481340,"moonset":1678431540,"moon_phase":0.59,"temp":{"day":282.04,"min":278.11,"max":283.72,"night":283.44,"eve":282.51,"morn":280.01},"feels_like":{"day":279.12,"night":282.82,"eve":279.1,"morn":276.91},"pressure":1004,"humidity":91,"dew_point":280.7,"wind_speed":9.77,"wind_deg":219,"wind_gust":24.11,"weather":[{"id":501,"main":"Rain","description":"Mäßiger Regen","icon":"10d"}],"clouds":100,"pop":1,"rain":12.26,"uvi":0.47},{"dt":1678532400,"sunrise":1678513698,"sunset":1678555327,"moonrise":1678572300,"moonset":1678518780,"moon_phase":0.63,"temp":{"day":284.14,"min":281.31,"max":285.94,"night":281.39,"eve":281.31,"morn":285.91},"feels_like":{"day":283.36,"night":279.89,"eve":280.2,"morn":285.36},"pressure":1002,"humidity":79,"dew_point":280.68,"wind_speed":10.83,"wind_deg":227,"wind_gust":23.16,"weather":[{"id":500,"main":"Rain","description":"Leichter Regen","icon":"10d"}],"clouds":95,"pop":1,"rain":7.96,"uvi":1},{"dt":1678618800,"sunrise":1678599969,"sunset":1678641823,"moonrise":0,"moonset":1678606260,"moon_phase":0.66,"temp":{"day":281.65,"min":281.18,"max":282.59,"night":282.52,"eve":281.91,"morn":281.18},"feels_like":{"day":277.99,"night":279.25,"eve":278.67,"morn":277.62},"pressure":1010,"humidity":86,"dew_point":279.47,"wind_speed":9.05,"wind_deg":247,"wind_gust":17.92,"weather":[{"id":501,"main":"Rain","description":"Mäßiger Regen","icon":"10d"}],"clouds":100,"pop":1,"rain":8.32,"uvi":1},{"dt":1678705200,"sunrise":1678686240,"sunset":1678728318,"moonrise":1678663380,"moonset":1678694100,"moon_phase":0.69,"temp":{"day":285.77,"min":283.71,"max":287.24,"night":287.24,"eve":286.45,"morn":285.64},"feels_like":{"day":285.23,"night":286.64,"eve":286.06,"morn":285.29},"pressure":1001,"humidity":82,"dew_point":282.86,"wind_speed":10.83,"wind_deg":242,"wind_gust":21.85,"weather":[{"id":501,"main":"Rain","description":"Mäßiger Regen","icon":"10d"}],"clouds":100,"pop":1,"rain":14.15,"uvi":1}],"alerts":[{"sender_name":"Deutscher Wetterdienst","event":"frost","start":1678136400,"end":1678176000,"description":"There is a risk of frost (Level 1 of 2).\nMinimum temperature: 0 - -2 °C","tags":["Extreme temperature value"]}]}

Wenn Euer API key nicht stimmt, kommt so etwas:

{"cod":401, "message": "Invalid API key. Please see https://openweathermap.org/faq#error401 for more info."}

Wenn DBBridge dann immer noch keine Wetterdaten bekommt, prüft bitte noch einmal Eure Eingabe in den Konfigurationseinstellungen von DBBridge.

Hardware

  • Ist das DBBridge mechanisch in Ordnung?
  • Klemmt der Reset-Taster?
  • Steckt das USB-Kabel richtig?
  • Schon mal den Strom weggenommen und wieder neu eingesteckt?
  • Ist es feucht geworden?
  • Da fällt mir noch etwas ein: Verwendest Du ein gutes USB Kabel? Manche Kabel bzw. Stromversorgungen führen manchmal dazu, dass die Stromversorgung nicht ausreichend ist. Das wäre dann speziell beim Herstellen einer WiFi Verbindung der Fall (also beim DBBridge immer nach einer Minute), dann zieht der ESP32 nämlich wesentlich mehr Energie als im Normalbetrieb???

Stromversorgung

Achtet bei Verwendung der WiFi-Funktionen, also wenn Ihr WLAN verwendet, was wahrscheinlich nahezu immer der Fall ist, darauf, eine ausreichende Stromversorgung zu verwenden. Einer meiner Kunden konnte nachweisen, dass es Probleme mit dem WLAN geben kann, wenn man minderwertige USB Netzteile verwendet.

Ich habe da einmal nachrecherchiert und bin auf diesen Artikel gestoßen:

Die Tücken der ESP32-Stromversorgung

Nach diesem Artikel ist es tatsächlich möglich, dass der ESP32 beim Zugriff auf das WLAN für kurze Zeit über 400 mA benötigt und dass es USB Netzteile gibt, die eine schwankende bzw. nicht genügend gleichgerichtete Spannung besitzen, dass damit Mikrocontroller vom Typ ESP32 – und das ist die Basis von DBBridge – nicht richtig versorgt werden.

Mein Kunde hatte ursprünglich ein 5 Watt USB Netzteil verwendet und beobachtete dabei immer wieder Verbindungsabbrüche. Eigentlich hätten 5 Watt ausreichen müssen. Dann kaufte er ein 10 Watt und schließlich ein 15 Watt USB Netzteil, mit dem DBBridge schließlich funktionierte. Ich glaube allerdings nicht dass es eines 15 Watt oder 10 Watt Netzteils bedarf und vermute eher, dass die beiden kleineren Netzteile andere Probleme hatten.

Aber wie auch immer, es gibt offensichtlich Probleme bei minderer Stromversorgung. Und dies hat nichts mit DBBridge zu tun, sondern scheint den ESP32 ganz allgemein zu betreffen.

Webanwendung individualisieren

Wenn die Webanwendung soweit läuft, wollt Ihr wahrscheinlich noch, dass sie anstatt ‘Bluetti EP500 Pro’ den Namen Eurer Energiestation anzeigt. Das könnt Ihr in den Zeilen 283, 285 und 300 der Datei ‘bluetti.html’ anpassen.

Ein paar weitere individuelle Einstellungen werden in der Tabelle ‘config’ der Datenbank ‘dbbridge’ vorgenommen. Dort gibt es die Felder ‘kwh_price’, ‘kwh_max’ und ‘start_date’. In diese Felder müsst Ihr die für Euch richtigen Werte eingeben. Das geht mit SQL Update oder einem beliebigen Datenbanktool Eurer Wahl. ‘kwh_max’ wird allerdings noch nicht ausgewertet.

Es werden nicht mehr alle Daten auf der Webseite angezeigt

Die Tabelle ‘daysum’ wird nicht mehr gefüllt oder enthält für bestimmte Tage ‘null’-Werte? Wenn Sie nicht mehr gefüllt wird kontrolliert bitte ob der ‘Event scheduler’ noch läuft? Mit ‘SET GLOBAL event_scheduler = ON;’ könnt Ihr ihn aktivieren. Aber eigentlich wird das durch mein Datenbankscript alles automatisch eingerichtet. Und damit er beim Starten der Datenbank mit gestartet wird, muss eine Änderung in der Konfigurationsdatei vorgenommen werden. Das findet Ihr aber alles in meiner Anleitung.

Ihr könnt die Tabelle aber recht schnell neu erzeugen. Dazu müsst Ihr sie als erstes löschen:

 DROP TABLE daysum;

Und dann mit folgendem SQL-Befehl wieder anlegen:

CREATE TABLE daysum AS
SELECT
DATE(InsertTimeStamp) AS day,
SUM(dc_input_power*(UNIX_TIMESTAMP(InsertTimeStamp) - UNIX_TIMESTAMP(b2InsertTimeStamp))*0.00027777)/1000 AS 'dc_input_power',
SUM(dc_output_power*(UNIX_TIMESTAMP(InsertTimeStamp) - UNIX_TIMESTAMP(b2InsertTimeStamp))*0.00027777)/1000 AS 'dc_output_power',
SUM(ac_input_power*(UNIX_TIMESTAMP(InsertTimeStamp) - UNIX_TIMESTAMP(b2InsertTimeStamp))*0.00027777)/1000 AS 'ac_input_power',
SUM(ac_output_power*(UNIX_TIMESTAMP(InsertTimeStamp) - UNIX_TIMESTAMP(b2InsertTimeStamp))*0.00027777)/1000 AS 'ac_output_power'
FROM (SELECT b1.*, b2.InsertTimeStamp AS b2InsertTimeStamp
FROM bluetti b1, bluetti b2
WHERE b1.ID = b2.ID + 1) b
GROUP BY DATE(InsertTimeStamp)
ORDER BY InsertTimeStamp DESC;

Das kann, je nachdem wie viele Datensätze Ihr schon in der Tabelle ‘bluetti’ gesammelt habt, auch einen Moment dauern!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert