ArduMower ESP Firmware mit MQTT, HomeAssistant und Prometheus

tim

New member
Hallo zusammen!

Pünktlich zum Ende der Mähsaison habe ich endlich meine "ArduMower Modem" Firmware für den ESP32 auf GitHub unter https://github.com/timotto/ardumower-modem veröffentlicht. Der größte unterschied zur `esp_modem` Vorlage ist der MQTT Support samt HomeAssistant Autodiscovery als Staubsauger. Ich habe auch einen Prometheus Endpoint hinzugefügt um Metriken über die Mähvorgänge zu sammeln (-: Bluetooth und HTTP Kommunikation lassen sich jetzt gleichzeitig verwenden.

Die Firmware wird per CI gebaut. Sie hat Unit- und Integration-Tests und auch eine kleine Validation-Suite. Nach der ersten Installation lassen sich Updates über das Webinterface installieren - ganz ohne Arduino IDE. Die gesamte Konfiguration passiert über das Webinterface vom Modem. Die Firmware lässt sich wie gewohnt über die Arduino IDE übersetzen. Um den Quellcode zu bearbeiten ist allerdings ein anderer Editor notwendig, da ich den Quellcode über mehrere Unterverzeichnisse verteilt habe. Da ich gerne Arduino CLI verwende, lässt sich alles auch von der Kommandozeile aus ausführen - ganz ohne Arduino IDE.

Ein paar Details sind noch nicht fertig, wie z.B. die Konfiguration des Formats der über MQTT veröffentlichten Nachrichten. Ich habe kein iPhone und bin mir nicht sicher, ob damit die Bluetooth Kommunikation reibungslos funktioniert. Als CI verwende ich zur Zeit Concourse CI, möchte es aber bei Gelegenheit auf GitHub Actions umstellen. Die README ist auch noch viel zu schweigsam.

Viele Grüße,
Tim
 
Hi Tim, ich werde demnächst mich mal mit deinem ardumover modem auseinandersetzen. Ich habe aktuell noch die die "originale Version" im sunray Github im Einsatz und nutze das Auslesen der states. Das setzen eines Commands habe ich noch nicht zum laufen bekommen, habe auch nicht wirklich viel Zeit dafür investiert. MQTT ist da manchmal ein bissle zickig.

Ich nutze IOBroker als System. Ein kurzes Skript habe ich schon, um die States-JSON zu parsen und den Strom, sowie den Akkustand mitzutracken. Mein Ziel geht dahin den ArduMover über IOBroker zu steuern, was ein Starten und Stoppen bei bestimmten Mähpunkten beinhalten soll, um bestimmte Abschnitte zu mähen. Wenn ein allgemeineres Interesse besteht, könnte ich daraus auch einen Adapter in IOBroker basteln.

Nun zu meiner eigentlichen Frage: gibt es einen gravierenden Unterschied in der Version, den ich beachten muss, welche im offiziellen Git von Andreas aufgenommen wurde und deiner ardumover modem Version?

Gruß
Felix
 
Bei mir läuft auch Home Assistant zur Automatisierung. Mein Ardumower läuft noch nicht, aber ich habe den ESP32 auch so konfiguriert, dass er eine MQTT-Anbindung hat. Ich bin gespannt was darüber publiziert wird.

Könnt ihr mal die publizierten Daten zum Topic des Mähroboters hier einstellen, damit ich mal schauen kann, was sich alles verwerten lässt?
Ich hoffe ja, dass sich im Zusammenspiel mit Home Assistant und Node Red einige Automatisierungen mit den sonstigen Sensoren des Hauses ergänzen lassen.

Vielen Dank und viele Grüße
Oliver
 
HI Oliver,

Ein kleines Beispiel, wie die Rohdaten aus dem MQTT kommen.

Props: {"firmware":"Ardumower Sunray","version":"1.0.223"}
States: {"battery_voltage":25.82,"position":{"x":XX.XX,"y":-X.XX,"delta":-1.36,"solution":2,"age":1.89,"accuracy":0.02,"visible_satellites":36,"visible_satellites_dgps":35,"mow_point_index":431},"target":{"x":X.XX,"y":-X.XX},"job":0,"sensor":0,"amps":0.02,"map_crc":XXXXX}

Mit dem Standard Javascript JSON-Parser, kann man dann auf die einzelnen Teiles des Objektes zugreifen und weiter verarbeiten.
 
So sieht die Ausgabe von der ArduMower Modem Firmware aus:

/mowersim/ArdumowerSim/online true
/mowersim/ArdumowerSim/stats {"durations":{"idle":0,"charge":0,"mow":0,"mow_float":0,"mow_fix":0,"mow_invalid":0},"obstacles":{"count":0,"sonar":0,"bumper":0,"gps_motion_low":0}}
/mowersim/ArdumowerSim/props {"firmware":"Ardumower Sunray","version":"1.0.219"}
/mowersim/ArdumowerSim/state {"battery_voltage":28.12000084,"position":{"x":-10.77000046,"y":-4.550000191,"delta":2.619999886,"solution":1,"age":0.050000001,"accuracy":0.02,"visible_satellites":36,"visible_satellites_dgps":29,"mow_point_index":11},"target":{"x":-7.46999979,"y":-6.460000038},"job":2,"sensor":0,"amps":0,"map_crc":-26017}
 
Hallo,
ich habe es heute auch mal probiert konnte mich aber nur per Bluetooht verbinden, via Weboberfläche konnte ich mich zwar mit dem ESP32 verbinden aber nicht mit der Sunray App.
 
Hallo,
ich habe es heute auch mal probiert konnte mich aber nur per Bluetooht verbinden, via Weboberfläche konnte ich mich zwar mit dem ESP32 verbinden aber nicht mit der Sunray App.
Das lag vermutlich an einem "CORS" Fehler in meiner Modem Firmware. Entweder hatte sich etwas in der Sunray App geändert, oder die Browser sind mal wieder strenger geworden. Ich konnte bei mir den Fehler nachstellen. In Version 1.1.2 ist das jetzt repariert.

Falls es doch noch Probleme gibt, dann schau bitte mal in die Console vom Browser, was für Fehlermeldungen dort stehen. Im Chrome Browser findest du die Console im Menü unter More Tools->Developer Tools und dann im Tab Console.
 
Hi,
habe das gleiche Problem wie Beecee, mit Bluetooth funktioniert es, über Lan bekomme ich auf der Seriellen Ardumower Konsole immer einen CRC Error.


MfG B-Tronic
 
Hi,
habe das gleiche Problem wie Beecee, mit Bluetooth funktioniert es, über Lan bekomme ich auf der Seriellen Ardumower Konsole immer einen CRC Error.


MfG B-Tronic
Welche Version von ArduMower und ArduMower Modem hast du laufen? Im Modem gab es vor Version 1.1.4 noch einen Fehler, der manchmal die HTTP Verbindung verhindert hat. Das ist allerdings selten aufgetreten und ließ sich meist mit einem Neustart vom ArduMower beheben.
 
Ardumower ist eine modifizierte 1.0178, Modem hab ich am Samstag von Github gezogen
Ich vermute du hast das Modem selber kompiliert und nicht die exakt selben library Versionen wie ich verwendet. Die library ESPAsyncWebServer musste ich leider etwas anpassen, damit sie mit der Sunray App zurecht kommt. Die App sendet einen falschen content-type bei HTTP requests, weswegen die originale ESPAsyncWebServer library versucht, den Inhalt der HTTP requests zu interpretieren. Das führt dann am Ende zum "CRC Error". In meinem Hack der library habe ich diese Interpretation entfernt.

Ich hab den Source code vom Modem angepasst, damit jetzt eine Fehlermeldung ausgegeben wird, wenn nicht die "richtige" ESPAsyncWebServer library installiert ist. Hoffentlich schaffe ich es bald, die ESPAsyncWebServer library durch etwas stabiles zu ersetzen. Meinen Hack von der Library findest du hier: https://github.com/timotto/ESPAsyncWebServer/tree/hack/bad-content-type

Wenn du die Modem Firmware mit der Arduino IDE from source baust, dann kannst du über die Unit-Tests prüfen, ob alles funktioniert: https://github.com/timotto/ardumower-modem/blob/main/test/README.md

Wenn du keine Lust hast, die libraries passend zu machen, dann nimm das vorkompilierte Firmware binary aus den GitHub releases. Falls du noch meine Modem Firmware auf dem ESP drauf hast, kannst du die bequem über das Modem Web Interface installieren. Ansonsten macht https://github.com/timotto/ardumower-modem/blob/main/util/modem_install/modem_install.ino im Prinzip dasselbe.
 
Hi @felixganzer, +1 für iobroker - bist Du da schon weitergekommen? MQTT habe ich in der aktuellen Version von Sunray nicht kompiliert bekommen und hoffe auf einen Adapter. Was hattest Du Dir für ein Script gebaut, magst Du das teilen?
Vielen Dank, maigold
 
Ich muss zugeben, dass ich noch keine Zeit hatte mich darum zu kümmern.

Ich habe bis jetzt ein kleines Script, welches mir den Strom und die Spannung über die Zeit protokolliert. Mit der Bildung eines Mittelwertes um die Anzahl der Punkte über die Zeit zu reduzieren.

Javascript:
//##################################################################################################
//      Schreibe Ardumower State in einzelne Objekte
//##################################################################################################

//##################################################################################################
//      Globale Variablen
//##################################################################################################

var average_Counter  = 0;
var battery_value = 0;
var actualCurrent_value = 0;

//##################################################################################################
//      Mittelwert Berechnung Battery
//##################################################################################################

function averageBattery_Value(value)
{
    //console.log(average_Counter);

    battery_value += value;

    if (average_Counter < 10) {
        return false;
    }
    else {
        battery_value /= (average_Counter);
        return true;
    }
}

//##################################################################################################
//      Mittelwert Berechnung actualCurrent
//##################################################################################################

function averageCurrent_Value(value)
{
    //console.log(average_Counter);

    actualCurrent_value += value;

    if (average_Counter < 10) {
        return false;
    }
    else {
        actualCurrent_value /= (average_Counter);
        return true;
    }
}

//##################################################################################################
//      Diagramm Stromverbrauch über Mähpunkt
//##################################################################################################

function Diagramm_Reset() {

    // Datenpunkte werden erstellt

}

//##################################################################################################
//      Main Function
//##################################################################################################

on({id: 'mqtt.0.Ardumower.state'/*Ardumower/state*/, change: "any"}, function (obj)
{
    //{"battery_voltage":0,"position":{"x":0,"y":0,"delta":0,"solution":0,"age":0,"accuracy":0,"visible_satellites":0,"visible_satellites_dgps":0,"mow_point_index":0},"target":{"x":0,"y":0},"job":0,"sensor":0,"amps":0,"map_crc":0}
    
    average_Counter++;

    var jsonValue = JSON.parse(obj.state.val);

    if (averageBattery_Value(Number(jsonValue.battery_voltage))) {
        setState('mqtt.0.Ardumower.State.Battery'/*State Battery Voltage*/,battery_value);
        //console.log("schreibe battery_Voltage");
    }

    if (averageCurrent_Value(Number(jsonValue.amps))) {
        setState('mqtt.0.Ardumower.State.actualCurrent'/*actualCurrent*/,actualCurrent_value);
        //console.log("schreibe actualCurrent");
    }

    setState('mqtt.0.Ardumower.State.MowPoint',Number(jsonValue.position.mow_point_index))

    if (average_Counter > 9) average_Counter = 1; 
});
 
hallo,
habe eine Frage. Das Modem läuft auf einem zusätzlichen ESP32?
Habe es jetzt auf den Mower ESP32 installiert . Verbindung klappt
Beim Einstellen des MQTT Server kann ich kein Port eintragen, wo mache ich das?.

Vielen Dank
 
Zuletzt bearbeitet:
Ich würde auch gern über MQTT meinen Robot steuern und deine Version nutzen. Nur scheitert es bei mir schon daran das ich Windows Nutzer bin und hier die Dateinamen "Con* reserviert sind. Betrifft die con.cpp & con.h. Hattet ihr die umbenannt?
Gibt es für dein Ardumower-Modem eine Schritt für Schritt Anleitung?
 
Hallo @felixganzer ,

danke, aber ich stehe immer noch auf dem Schlauch. Es scheint zwei unterschiedliche Ansätze für MQTT zu geben:
1. auf dem ESP32 oder
2. auf dem M4 (Funktion in Sunray)
Ich würde meinen, dass der Funktionsumfang innerhalb der Sunray - weil nativ - auch größer ist, also mehr gesteuert werden kann. Meine Wunsch wäre es dicht am Standard zu bleiben und die Sunray Variante zu nutzen, allerdings bekomme ich Kompilierungsfehler sobald ich bei MQTT die Kommentierung rausnehme.

Hat das schon jemand erfolgreich im Einsatz?
 
Mein Kenntnisstand ist folgender: In der Sunray Firmware wurde mal grundlegend versucht MQTT zu implementieren. Dieser Ansatz wurde nicht weiterverfolgt und war glaube ich so nicht funktionstüchtig. Aktuell gibt es im offiziellen Repo in der offiziellen ESP32 Firmware ein funktionierendes MQTT. Dieses stammt aber von Tim, welcher es als seine eigene Version in seinem Repo ständig weiterentwickelt. Selbstverständlich auf seine Bedürfnisse ausgerichtet.
 
@tim
Habe mir heute Mal deine binary auf den ESP32 aufgespielt. Bluetooth funktioniert ! WLAN funktioniert ! Aber bei Sunray bekomme ich einen "http 400 bad request"
In der Chrome Console sieht das ungefähr soooo aus:
1652730972566.png
Kann damit jemand was anfangen ?
Auf das Webinterface zur Konfiguration auf dem ESP32 kann ich ohne Probleme zugreifen. Funktioniert als AP oder als Client.
Aktuell ist der Mower als Client mit der IP 192.168.86.80 in meinem WLAN angemeldet, aber über Sunray kein Zugriff.
 
Ich würde auch gern über MQTT meinen Robot steuern und deine Version nutzen. Nur scheitert es bei mir schon daran das ich Windows Nutzer bin und hier die Dateinamen "Con* reserviert sind. Betrifft die con.cpp & con.h. Hattet ihr die umbenannt?
Gibt es für dein Ardumower-Modem eine Schritt für Schritt Anleitung?
Wenn du die Software nur benutzen und nicht verändern/anpassen willst, dann nimm einfach den modem_installer, um das neuste Release vom esp32 selbst runterladen und installieren zu lassen: https://github.com/timotto/ardumower-modem/blob/main/util/modem_install/modem_install.ino
 
Oben