Bei DIY MPPT, FOSS und OSHW Solar-Bleiakku-Lader haben @weef und @elektra einen OSHW MPPT charger vorgestellt. Anfangs noch mit einem ATMega8 als Steuercomputer ausgestattet (2017), ist auf der Neuauflage nun ein ESP32 zu Gast (2019), der mit NodeMCU/Lua programmiert wird.
Wir entwickeln hier ein paar Erweiterungen, damit Telemetriedaten sowohl an den GitHub - ISEMS/isems-data-collector als auch an InfluxDB/Grafana übermittelt werden können.
Auf Basis dieser Implementierung ließen sich nun auch
komfortabel bestimmte Ereignisse innerhalb der Appliance automatisch fernmelden und als Annotationen im Graphen darstellen, so wie es @wtf, @weef und @roh bei ihrer Autonomen Zelle realisiert haben.
Wetterdaten aus dem Datenmischwerk in die Darstellung dazuholen [2].
ich habe eine Kleinigkeit in telemetry.lua gefixt. Sieht gut aus. Ich verwende ein ESP32-Dev-Board ohne Peripherie. Ich musste nur den Tiefentladeschutz in mp2.lua auskommentieren, da der Node sonst automatisch nach jedem Start in den Tiefschlaf geht. Die Telemetrie wird über is.lua nach einer Minute zum ersten Mal vom Timer aufgerufen.
LG Elektra
Log-Ausgabe
Preparing mqtt data.
Submitting telemetry data to MQTT broker.
Creating JSON payload.
JSON payload: {"batteryVoltage":1.591,"ratedSolarModuleCapacity":20,"timeToShutdown":999,"batteryChargeEstimate":0,"status":"886","mppVoltage":2.299,"rateBatteryCapacity":7.2,"isemsRevision":"1","batteryHealthEstimate":100,"openCircuitVoltage":2.299,"latitude":52.520008,"nodeId":"ESP32-Meshnode-Elektra-test","temperatureCorrectedVoltage":19.065,"lowVoltageDisconnectVoltage":11.9,"longitude":13.404954,"timestamp":1579142675,"isPowerSaveMode":0,"batteryTemperature":-137.19}
Http post data.
Submitting telemetry data to HTTP endpoint.
Creating JSON payload.
I (3714617) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000
JSON payload: {"batteryVoltage":1.591,"ratedSolarModuleCapacity":20,"timeToShutdown":999,"batteryChargeEstimate":0,"status":"886","mppVoltage":2.299,"rateBatteryCapacity":7.2,"isemsRevision":"1","batteryHealthEstimate":100,"openCircuitVoltage":2.299,"latitude":52.520008,"nodeId":"ESP32-Meshnode-Elektra-test","temperatureCorrectedVoltage":19.065,"lowVoltageDisconnectVoltage":11.9,"longitude":13.404954,"timestamp":1579142675,"isPowerSaveMode":0,"batteryTemperature":-137.19}
Connected to MQTT broker.
I (3714847) HTTP_CLIENT: Redirect to https://isems.mqtthub.net/api-notls/isems/testdrive/foobar/ESP32-Meshnode-Elektra-test/data.json
Antwort: 405 Method Not Allowed
<html>
<head><title>405 - Method Not Allowed</title></head>
<body>
<h1>Method Not Allowed</h1>
<p>Your browser approached me (at /api-notls/isems/testdrive/foobar/ESP32-Meshnode-Elektra-test/data.json) with the method "POST". I only allow the method HEAD here.</p>
</body>
</html>
Da wo hier noch "hello" steht, muss natürlich json rein.
HTTP-Telemetrie funkt nicht
Da macht noch irgendwas Quatsch. Wahrscheinlich der Server. Der /api-notls Suffix ist für nicht-TLS Kommunikation gedacht. In diesem Fall sollte natürlich gerade nicht zu https://... rübergeschwenkt werden.
Falls TLS auf dem Eumel funktioniert, hieße die richtige Endpunkt-URL in der Konfiguration so:
Das ist jetzt behoben. Für die Konfiguration des isems.mqtthub.net virtual hosts im Nginx fehlte noch der dedizierte Port-80 Schnipsel, der Anfragen an das /api-notls-Präfix exklusiv unverschlüsselt durchlässt. Alle anderen Anfragen werden weiterhin nach https:// umgeleitet.
P.S. @wtf: Ich hab das derweil mal auf eltiempo aufgelegt – gute Nachbarschaft und so. Ich hoffe das passt für Dich.
das Konkatenieren habe ich aus config.lua entfernt und in telemetry.lua verschoben, der MQTT Code gibt mehr Feedback auf die Konsole aus und mit QoS Level 1 bekomme ich auch die Bestätigung, dass die Daten ankommen. HTTP POST beantwortet der Server immer noch mit einem 405.
LG Elektra
mqtt_topic: isems/testdrive/foobar/ESP32-Meshnode-1-Testing-Elektra42
Http telemetry url: https://isems.mqtthub.net/api/isems/testdrive/foobar/ESP32-Meshnode-1-Testing-Elektra42/data.json
Preparing mqtt data.
Submitting telemetry data to MQTT broker.
Creating JSON payload.
JSON payload: {"batteryVoltage":1.479,"status":"886","batteryHealthEstimate":100,"latitude":52.52,"ratedSolarModuleCapacity":10,"rateBatteryCapacity":8,"timeToShutdown":3553,"batteryChargeEstimate":0,"temperatureCorrectedVoltage":19.077,"lowVoltageDisconnectVoltage":11.9,"openCircuitVoltage":2.275,"longitude":13.4,"mppVoltage":2.275,"isPowerSaveMode":0,"batteryTemperature":-137.6}
########## MQTT broker host: isems.mqtthub.net
Http post mqtt data.
Submitting telemetry data to HTTP endpoint.
Creating JSON payload.
JSON payload: {"batteryVoltage":1.479,"status":"886","batteryHealthEstimate":100,"latitude":52.52,"ratedSolarModuleCapacity":10,"rateBatteryCapacity":8,"timeToShutdown":3553,"batteryChargeEstimate":0,"temperatureCorrectedVoltage":19.077,"lowVoltageDisconnectVoltage":11.9,"openCircuitVoltage":2.275,"longitude":13.4,"mppVoltage":2.275,"isPowerSaveMode":0,"batteryTemperature":-137.6}
> ########## Connected to MQTT broker
########## Success: MQTT message sent.
405
<html>
<head><title>405 - Method Not Allowed</title></head>
<body>
<h1>Method Not Allowed</h1>
<p>Your browser approached me (at /api/isems/testdrive/foobar/ESP32-Meshnode-1-Testing-Elektra42/data.json) with the method "POST". I only allow the method HEAD here.</p>
</body>
</html>
@elektra: Eine von beiden Telemetrievarianten funkt scheinbar noch nicht. Man müsste nun schauen, welche von beiden das ist. Ich habe gerade eben mal das Logging am Server höhergestellt, vielleicht kommt wir damit dem Problem auf die Schliche, wenn das Testgerät nochmals Daten übermittelt (bis 11:43 Uhr tat es das).
Stimmt denn die Dokumentation bei http - NodeMCU Documentation nicht mehr? Dort ist der zweite Parameter in der Signatur noch nicht { headers = headers }, sondern einfach nur ein String. Ich vermute die Signatur hat sich geändert, ergo ist die Dokumentation veraltet und Du hast den Code entsprechend angepasst. Wollte nur nocheinmal sicher gehen.
http.post('http://httpbin.org/post',
'Content-Type: application/json\r\n',
'{"hello":"world"}',
function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
Gedanken
Worauf ich hier hinauswill ist, wenn sich die Signatur tatsächlich geändert hat und man dort nun eine Map/Dictionary/Table übergibt, es u.U. auch nicht mehr angebracht ist, den Wert des Header-Feldes mit "\r\n" zu suffixen.
Dann müsste/könnte es korrekt folgendermaßen heißen.
2020-01-23T17:38:43+0100 [kotori.io.protocol.http ]
DEBUG: Received HTTP request on uri /api/isems/testdrive/foobar/ESP32-Meshnode-1-Testing-Elektra42/data,
content type is "application/json"
Wunderbar! Ich habe das Logging nun wieder runtergestellt und Du kannst nun, nachdem beide Varianten funktionieren, gerne im (Test-)Betrieb wieder nur eine Variante (bevorzugt MQTT) anschalten.
Beide Varianten zu haben war nur / vor allem für die Flexibilität gedacht. Es macht praktisch keinen Sinn, die Daten doppelt zu übertragen.