Solarregler EPEVER Tracer und Tasmota
-
tourer4778 -
20. November 2021 um 06:35 -
Erledigt
-
-
-
Hi.
Was meinst du mit "auslesen" ?? Meinst du serielles Logging? Das geht z.B. mit Putty.
Oder ein FW Backup? das geht dann unter anderem mit dem Tasmotizer.
-
Hi.
Was meinst du mit "auslesen" ?? Meinst du serielles Logging? Das geht z.B. mit Putty.
Oder ein FW Backup? das geht dann unter anderem mit dem Tasmotizer.
Derzeit habe ich eine Firmware am Laufen, die für den EPEVER speziell gemacht wurde, um die Daten des Ladereglers seriell auszulesen.
Ich würde aber gerne das mit Tasmota machen, damit der ESP noch andere Dinge machen kann.
Allerdings weiß ich nicht, wie die Daten aus dem Laderegler bekomme, wenn ich Tasmota laufen habe. Was müsste ich zum Beispiel in der Konsole eingeben, damit ich die Werte bekomme?
-
Hi.
Derzeit habe ich eine Firmware am Laufen, die für den EPEVER speziell gemacht wurde, um die Daten des Ladereglers seriell auszulesen.
Wenn darum geht sich die seriellen Daten anzusehen die da raus kommen, dann:
Meinst du serielles Logging? Das geht z.B. mit Putty.
https://www.youtube.com/watch?v=dO-BMOzNKcI
Was müsste ich zum Beispiel in der Konsole eingeben,
Welche Konsole?? Linux? Da mach ich das mit picocom
https://linux.die.net/man/8/picocom
Und wie erwähnt, bevor Du Tasmota flasht, zieh dir ein Dump File mit Tasmotizer, das Du die Orginal FW wieder zurückspielen kannst.
-
Das meine ich nicht. Die Firmware, die derzeit läuft, hatte ich auch schon selbst drauf gemacht. Diese wurde von jemanden gemacht für den ESP8266. Aber darum geht es mir nicht.
Wenn alles über Tasmota läuft, muss ich erstmal die Daten anfordern, vom Laderegler. Ich habe keinen Plan, wie das funktionieren soll, was ich zum Beispiel in der Konsole von Tasmota eingeben muss, damit dieser, die Daten sendet.
-
Hast Du dir das mal durchgelesen?
https://tasmota.github.io/docs/Commands/#serial-bridge
ZitatInformation received by Tasmota over the serial bridge is captured automatically.
Was bedeutet: Wenn du Deinen Laderegler seriell mit dem Wemos verbunden hast, die Schnittstelle in Tasmota demenstprechend eingestellt ist:
- GPIO auf Seriel oder SerialBridge je nachdem wo angeschlossen,
- Baudrate bzw sBaudrate, Serialconfig, Serialdelimeter über die Konsole wie es der Laderegler eben braucht
erscheinen die seriellen Daten direkt in der Konsole. Hab ich zwar noch nie versucht aber müsste dann im JSON Format sein deklariert als: {"SSerialReceived":{"Data":"<string>"}}
Und das kann dann auch verarbeitet werden z.B. via Rules
EDIT:
So, jetzt hab ich mir den Sketch mal angesehen den du verlinkt hast. Hätte ich vielleicht eher machen sollen.
Das ist Modbus! Den Unterstützt Tasmota meines Wissens nicht,
Sorry ... hab ich jetzt erst gesehen.
-
Hast Du dir das mal durchgelesen?
Natürlich nicht .
Baudrate bzw sBaudrate, Serialconfig, Serialdelimeter über die Konsole wie es der Laderegler eben braucht
Okay, Bautrate könnten die 115200 sein.
Serialconfig, Serialdelimeter
C
Alles anzeigen*/ #include "config.h" #include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <SimpleTimer.h> #include <ModbusMaster.h> #include <LeifHomieLib.h> #define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0])) int timerTask2, timerTask3; float bvoltage, bcurrent, bpower, btemp, bremaining, lvoltage, lcurrent, lpower, pvvoltage, pvcurrent, pvpower; uint8_t result; WiFiClient espClient; HomieDevice homie; HomieProperty * pPropbvoltage=NULL; HomieProperty * pPropbcurrent=NULL; HomieProperty * pPropbpower=NULL; HomieProperty * pPropbremaining=NULL; HomieProperty * pProplvoltage=NULL; HomieProperty * pProplcurrent=NULL; HomieProperty * pProplpower=NULL; HomieProperty * pProppvvoltage=NULL; HomieProperty * pProppvcurrent=NULL; HomieProperty * pProppvpower=NULL; // this is to check if we can write since rs485 is half duplex bool rs485DataReceived = true; ModbusMaster node; SimpleTimer timer; char buf[10]; String value; // tracer requires no handshaking void preTransmission() {} void postTransmission() {} // a list of the regisities to query in order typedef void (*RegistryList[])(); RegistryList Registries = { AddressRegistry_3100, AddressRegistry_311A, }; // keep log of where we are uint8_t currentRegistryNumber = 0; // function to switch to next registry void nextRegistryNumber() { currentRegistryNumber = (currentRegistryNumber + 1) % ARRAY_SIZE( Registries); } void setup() { Serial.begin(115200); Serial.println("Booting"); WiFi.mode(WIFI_STA); WiFi.hostname(OTA_HOSTNAME); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); } // Modbus slave ID 1 node.begin(EPSOLAR_DEVICE_ID, Serial); node.preTransmission(preTransmission); node.postTransmission(postTransmission); // Port defaults to 8266 // ArduinoOTA.setPort(8266); // Hostname defaults to esp8266-[ChipID] ArduinoOTA.setHostname(OTA_HOSTNAME); // No authentication by default //ArduinoOTA.setPassword((const char *)"123"); ArduinoOTA.onStart([]() { Serial.println("Start"); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); HomieLibRegisterDebugPrintCallback([](const char * szText){ Serial.printf("%s",szText); }); { HomieNode * pNode=homie.NewNode(); pNode->strID="properties"; pNode->strFriendlyName="Properties"; HomieProperty * pProp; pPropbvoltage=pProp=pNode->NewProperty(); pProp->strFriendlyName="Battery Voltage"; pProp->strID="bvoltage"; pProp->strFormat="V"; pProp->SetRetained(true); pProp->datatype=homieFloat; pPropbcurrent=pProp=pNode->NewProperty(); pProp->strFriendlyName="Battery Charging Current"; pProp->strID="bcurrent"; pProp->strFormat="A"; pProp->SetRetained(true); pProp->datatype=homieFloat; pPropbpower=pProp=pNode->NewProperty(); pProp->strFriendlyName="Battery Charging Power"; pProp->strID="bpower"; pProp->strFormat="W"; pProp->SetRetained(true); pProp->datatype=homieFloat; pPropbremaining=pProp=pNode->NewProperty(); pProp->strFriendlyName="Battery Remaining"; pProp->strID="bremaining"; pProp->strFormat="%"; pProp->SetRetained(true); pProp->datatype=homieFloat; pProppvvoltage=pProp=pNode->NewProperty(); pProp->strFriendlyName="PV Voltage"; pProp->strID="pvvoltage"; pProp->strFormat="V"; pProp->SetRetained(true); pProp->datatype=homieFloat; pProppvcurrent=pProp=pNode->NewProperty(); pProp->strFriendlyName="PV Current"; pProp->strID="pvcurrent"; pProp->strFormat="A"; pProp->SetRetained(true); pProp->datatype=homieFloat; pProppvpower=pProp=pNode->NewProperty(); pProp->strFriendlyName="PV Power"; pProp->strID="pvpower"; pProp->strFormat="W"; pProp->SetRetained(true); pProp->datatype=homieFloat; pProplvoltage=pProp=pNode->NewProperty(); pProp->strFriendlyName="Load Voltage"; pProp->strID="lvoltage"; pProp->strFormat="V"; pProp->SetRetained(true); pProp->datatype=homieFloat; pProplcurrent=pProp=pNode->NewProperty(); pProp->strFriendlyName="Load Current"; pProp->strID="lcurrent"; pProp->strFormat="A"; pProp->SetRetained(true); pProp->datatype=homieFloat; pProplpower=pProp=pNode->NewProperty(); pProp->strFriendlyName="Load Power"; pProp->strID="lpower"; pProp->strFormat="W"; pProp->SetRetained(true); pProp->datatype=homieFloat; } homie.strFriendlyName="EPSolar 1"; homie.strID="EPsolar1"; homie.strID.toLowerCase(); homie.strMqttServerIP=MQTT_IP; homie.strMqttUserName=MQTT_USER; homie.strMqttPassword=MQTT_PASS; homie.Init(); timerTask2 = timer.setInterval(10000, doRegistryNumber); timerTask3 = timer.setInterval(10000, nextRegistryNumber); } void doRegistryNumber() { Registries[currentRegistryNumber](); } void AddressRegistry_3100() { result = node.readInputRegisters(0x3100, 16); if (result == node.ku8MBSuccess) { bvoltage = (long)node.getResponseBuffer(0x04) / 100.0f; pPropbvoltage->SetValue(dtostrf(bvoltage, 2, 3, buf )); bcurrent = (long)node.getResponseBuffer(0x05) / 100.0f; pPropbcurrent->SetValue(dtostrf(bcurrent, 2, 3, buf )); bpower = ((long)node.getResponseBuffer(0x07) << 16 | node.getResponseBuffer(0x06)) / 100.0f; pPropbpower->SetValue(dtostrf(bpower, 2, 3, buf )); lvoltage = (long)node.getResponseBuffer(0x0C) / 100.0f; pProplvoltage->SetValue(dtostrf(lvoltage, 2, 3, buf )); lcurrent = (long)node.getResponseBuffer(0x0D) / 100.0f; pProplcurrent->SetValue(dtostrf(lcurrent, 2, 3, buf )); lpower = ((long)node.getResponseBuffer(0x0F) << 16 | node.getResponseBuffer(0x0E)) / 100.0f; pProplpower->SetValue(dtostrf(lpower, 2, 3, buf)); pvvoltage = (long)node.getResponseBuffer(0x00) / 100.0f; pProppvvoltage->SetValue(dtostrf(pvvoltage, 2, 3, buf )); pvcurrent = (long)node.getResponseBuffer(0x01) / 100.0f; pProppvcurrent->SetValue(dtostrf(pvcurrent, 2, 3, buf )); pvpower = ((long)node.getResponseBuffer(0x03) << 16 | node.getResponseBuffer(0x02)) / 100.0f; pProppvpower->SetValue(dtostrf(pvpower, 2, 3, buf )); } else { rs485DataReceived = false; } } void AddressRegistry_311A() { result = node.readInputRegisters(0x311A, 2); if (result == node.ku8MBSuccess) { bremaining = node.getResponseBuffer(0x00) / 1.0f; pPropbremaining->SetValue(dtostrf(bremaining, 2, 3, buf )); } else { rs485DataReceived = false; } } void loop() { ArduinoOTA.handle(); timer.run(); homie.Loop(); }
-
Wie gesagt:
EDIT:
So, jetzt hab ich mir den Sketch mal angesehen den du verlinkt hast. Hätte ich vielleicht eher machen sollen.
Das ist Modbus! Den Unterstützt Tasmota meines Wissens nicht,
Sorry ... hab ich jetzt erst gesehen. -
der MODBUS wird sehr wohl unterstützt. sieh dir in den Tasmota Docs die Doku zu Smart Meter Interface an. Dort gibt es auch einige Beispiele.
-
Okay, danke für die Info.
Dieser Adapter den ich habe, macht aus dem RS485 Singal ein TTL Signal. Dachte das wäre dann Seriell
-
ja klar ist es ja auch. die Protokolle laufen dann über seriellen MODBUS. du brauchst einen Adapter der automatisch Receive und Transmit umschaltet,
und du must dann für deinen Controller die MODBUS Registercodes anpassen
-
ja klar ist es ja auch. die Protokolle laufen dann über seriellen MODBUS. du brauchst einen Adapter der automatisch Receive und Transmit umschaltet,
und du must dann für deinen Controller die MODBUS Registercodes anpassen
Ahh, okay, dann hört es auch schon auf .
Es hätte ja sein können, das es einfacher sein würde. Bin da nicht so tief in der Materie ...
Trotzdem Danke
-
Hallo zusammen,
ich weiss der Beitrag ist etwas älter, aber ich hätte da vielleicht eine Lösung
Smart Meter Interface: Epever MPPT Tracer AN Serie 10-40A via Modbus #12800
Ich habe das selber bei mir so am laufen. Inklusive Einbindung IOBroker und Grafana lade/entlade Diagrammen