Batterien länger nutzen und aktiv Umweltschutz betreiben
Home Assistant mit dem Auffrischgerät verbinden
Nachdem wir im ersten Beitrag ein bereits vollständig funktionierendes Gerät kennen gelernt haben, wollen wir es nun mit dem Home Assistant verbinden. Auch diesmal wird uns das MQTT-Protokoll dabei gute Dienste leisten.
Ein Vorteil ist, dass wir kein Display oder Bedienelemente im Programm berücksichtigen müssen. Das Dashboard des Home Assistant übernimmt diese Aufgaben. Wenn das Auffrischgerät fertig ist, sehen wir dies auf dem Mobiltelefon, Pad oder PC und können uns sogar eine Mitteilung zusenden lassen.
Mit der Home Assistant App auf dem Mobiltelefon haben wir den aktuellen Status immer griffbereit.
Schauen wir uns an, was dafür notwendig ist.
Der Sketch umfasst nun fünf Funktionsblöcke. Das Hauptprogramm wuchs ein ganzes Stück.
Hatten wir in Teil 1 gar keine Libraries eingebunden. Nun sind es nun insgesamt drei, die für die WiFi – Verbindung und MQTT notwendig sind. Außerdem benötigen wir <string.h>.
Es folgt im Sketch die Benutzerkonfiguration, in der Sie bitte die SSID ihres WLAN und das dazu passende Passwort eintragen. Auch diesmal habe ich wieder eine statische IP – Adresse vergeben.
Nun folgen die Credentials für den MQTT – Server sowie das MQTT – Passwort.
Die MQTT – Topics werden als Stringvariablen angelegt. Die Batteriespannungen bekommen die Topics „batt1 … batt4“, der jeweilige Status einer Batterie steht in „batt1stat … batt4stat“. Diese Stati sind „Keine Batterie“, „Frischt auf“ und „***Beendet***“.
Die nun folgende Initialisierung kennen wir schon aus dem 1. Teil. Hier kommt noch das Array „battstat[]“ hinzu, dass den jeweiligen Batteriezustand festhält. Es wird auf allen vier Positionen mit „Keine Batt.“ initialisiert.
void setup() folgt mit der Initialisierung des WiFi und MQTT – Servers. Keine Besonderheiten.
void loop() zeigt nur kleine Änderungen. Zu Beginn wird die MQTT-Verbindung geprüft und ggfls. neu hergestellt. Es folgt der schon bekannte Prozess aus Ladeimpuls und Messungen, nun ergänzt durch die beiden Unterprogramme Statusmeldungen(); und WiFi_MQTT();
Das Unterprogramm für Statusmeldungen
Mithilfe der Statusmeldungen sehen wir, ob in einem Fach eine Batterie eingelegt ist, ob die Batterie gerade aufgefrischt wird oder ob der Auffrischvorgang beendet ist.
Die erste IF-Abfrage prüft, ob die Batteriespannung gleich null ist. Dies ist gleich bedeutend mit „keine Batterie ist eingelegt“.
Für die eigene MQTT – Programmierung ist es vielleicht interessant zu sehen, wie Strings in MQTT übertragen werden. Die Inhalte von battstat[] sind als Characterstrings mit bis zu 16 Zeichen definiert, tatsächlich aber kürzer. Grund dafür ist das notwendige Terminator-Zeichen ‚\0‘ das MQTT verlangt.
Das Unterprogramm WiFi_MQTT
Hier habe ich die Funktionen zusammengefasst, die unser WiFi starten, die statische IP-Adresse setzen, die Verbindung zum MQTT-Server herstellen und das Publishing übernehmen.
Das Publishing ist eine einfache Funktion. Zunächst wird überprüft, ob die Verbindung noch aktiv ist. Ansonsten erfolgt ein reconnect.
Danach wird für jede Batterie der Messwert mit zwei Nachkommastellen übergeben. Einen solchen Wert nennt man im MQTT-Jargon ein „payload“ (wörtlich: „Bezahlte Fracht“). Die Funktion
snprintf(payload, sizeof(payload), "%.2f", battU[0]);
baut die payload zusammen, die in der folgenden Zeile an den MQTT-Server an das richtige Topic ge-published wird. (Leider gibt’s dafür keine deutschsprachige Ausdrucksweise).
In der folgenden Zeile wird der Status des jeweiligen Batteriestatus verschickt. Für ihn hatten wir schon in „Statusmeldungen.ino“ die richtige Zusammensetzung incl. Terminator-Zeichen gebaut.
Was ist im Home Assistant zu tun?
Da MQTT recht gut in den Home Assistant integriert ist und auch dort mitläuft, haben wir auf dieser Seite nur wenig Arbeit.
Wie schon aus meinen früheren Blogbeiträgen hier bekannt, genügt es, die configuration.yaml sauber zu ergänzen und den Home Assistant neu zu starten. Damit werden die notwendigen Entitäten generiert und sind verfügbar.
Sie erinnern sich noch, dass Sie unbedingt auf die Anordnung der Zeilen achten müssen und für die Zwischenräume immer nur die Zwischenraumtaste benutzen, niemals TAB!
Dies vorausgeschickt, sieht unser Eintrag folgendermassen aus:
Wenn Sie schon MQTT-Sensoren definiert haben, dann tragen Sie Ihre Sensoren darunter ein. Ansonsten bekommen Sie eine Fehlermeldung, weil
mqtt:
. . sensor:
nur einmal in configuration.yaml auftreten darf. Das gilt auch für alle analogen Fälle.
Beim MQTT-Eintrag fällt vielleicht noch auf, dass ein
expire_after: 30
eingetragen ist. Diese Funktion gibt es noch nicht allzu lange. Inzwischen kann man in der Sensordefinition festlegen, dass z.B. 30 s nach dem letzten MQTT-Sensorwert dessen Wert zurück gesetzt wird. So entsteht nicht der Eindruck, es sein noch eine Batterie eingelegt.
Wenn das Gerät ausgeschaltet ist, sind die Sensoren nicht mehr verfügbar und es kommt die entsprechende Meldung im Dashboard.
Eine Ergänzung zum Beitrag Teil 1
Nicht jeder hat Messwiderstände in der Bastelkiste (1% oder besser). Deswegen habe ich jetzt im Sketch von Teil 2 noch eine Variable
float corr[4] ={1.0, 1.0, 1.09, 1.0}; //Korrekturwerte
eingeführt. Es ist dies ein Faktor, mit dem der jeweilige Messwert zu multiplizieren ist, wenn die Messwiderstände nicht genau stimmen. Das misst man am besten mit einem ordentlichen Multimeter aus und errechnet sich den Korrekturfaktor. Ich hatte einen Widerstand zu wenig und habe mir prompt einen Messfehler von satten 9% eingefangen, der so korrigiert wurde.
Wenn alle Korrekturwerte = 1.0 sind, sind ihre Widerstände perfekt.
Falls Sie die neue Funktion benötigen oder nutzen möchten, ist sie überall im neuen Sketch schon implementiert.
Praktischer Einsatz
Wir haben nun ein schönes Auffrischgerät, das auch seine Arbeit gut macht. Wie setzen wir es ein?
Da ich schon seit Jahren Alkaline-Batterien auffrische, achte ich darauf, was andere Leute tun. So traf ich einen älteren Herrn, der auf dem Flohmarkt eine Batteriebox anbot:

Seither begleitet sie mich. Sie enthält ganz oben ein kleines Testgerät, das einen recht groben Anhaltspunkt liefert, ob eine Batterie noch brauchbar ist.
Meine Batterien sind so geordnet, dass links die AA-Batterien liegen, die getestet und aufgeladen sind. Sie decken den Bedarf des Haushalts, des Labors und der Werkstatt.
In der Mitte und rechts liegen die AA-Zellen, die nach Augenschein nicht beschädigt oder auslaufen sind, die ich aber noch nicht getestet und/oder aufgeladen habe.
Das Ganze hat dazu geführt, dass ich bei einem Jahresbedarf von rund 60 Alkaline AA-Zellen in 2025 keine einzige Batterie neu eingekauft habe und alle Geräte prima arbeiten. Ein Vorrat ist noch übrig.
Es würden mich freuen, wenn Sie ebenfalls einen Beitrag zum Umweltschutz mit diesem Projekt leisten und zugleich ihren Geldbeutel schonen möchten.
Bis zum nächsten Blog-Beitrag,
Ihr
Michael Klein






