// Uitlezen van Growatt 2000S via RS-232 met een Wemos mini D1 (ESP8266) // Benodigde module: https://nl.aliexpress.com/item/4000587246651.html #include #include #include #include #include "settings.h" // Hier staan alle passwords en dergelijke in: #define wifi_ssid WIFI_SSID #define wifi_password WIFI_PASSWORD #define mqtt_server MQTT_SERVER #define mqtt_port MQTT_PORT #define mqtt_user MQTT_USER #define mqtt_password MQTT_PASSWORD #define in_topic "/inverter/getdata" #define PIN_LED_FAULT 4 // D2 #define PIN_LED_COMM 5 // D1 #define PIN_TX 12 //D6 #define PIN_RX 14 //D5 #define SLAVE_ADDRESS 1 GrowattInverter inverter(PIN_RX, PIN_TX, SLAVE_ADDRESS); WiFiClient espClient; PubSubClient client; const char* bericht = "0"; String allData; bool led_status = HIGH; unsigned long last_poll = 0; bool verzenden = true; void setup() { Serial.begin(9600); pinMode(PIN_LED_FAULT, OUTPUT); pinMode(PIN_LED_COMM, OUTPUT); digitalWrite(PIN_LED_FAULT, HIGH); digitalWrite(PIN_LED_COMM, HIGH); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { delay(500); } digitalWrite(PIN_LED_FAULT, WiFi.status() ? 1 : 0); //digitalWrite(PIN_LED_COMM, inverter.valid ? 1 : 0); client.setClient(espClient); client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); ArduinoOTA.begin(); digitalWrite(PIN_LED_FAULT, LOW); digitalWrite(PIN_LED_COMM, LOW); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { //Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect("GrowattInverter", mqtt_user, mqtt_password)) { //Serial.println("connected"); // Once connected, publish an announcement... client.publish("/inverter/status", "init"); // ... and resubscribe client.subscribe(in_topic); } else { //Serial.print("failed, rc="); //Serial.print(client.state()); //Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void callback(char* topic, byte* payload, unsigned int length) { //verzenden = true; last_poll = millis(); } void publishStatus(uint16_t st) { char buf[16]; String str = "unknown"; switch (st) { case 0: str = "waiting"; digitalWrite(PIN_LED_COMM, HIGH); break; case 1: str = "normal"; digitalWrite(PIN_LED_COMM, LOW); digitalWrite(PIN_LED_FAULT, LOW); break; case 3: str = "fault"; digitalWrite(PIN_LED_FAULT, HIGH); break; } str.toCharArray(buf, 16); client.publish("/inverter/status", buf, true); } void loop() { static uint32_t i; uint8_t j, result = 0; uint16_t data[6]; // i++; String tmp; char topic[40] = ""; char value[40] = ""; if (millis() >= last_poll + 60000) { //interval van een minuut // if (verzenden) { last_poll = millis(); inverter.read(); publishStatus(inverter.status); if (inverter.valid) { /* Kdy * Energy today [Wh] (KDY) kmt Energy this month [kWh] (KMT) kyr Energy this year [kWh] (KYR) kt0 * Energy total [kWh] (KT0) tnf * frequentie van de netspanning * 100 tkk * Temperatuur van de inverter pac * AC power [mW] (PAC) Power AC prl AC power [%] (PRL) Power Load il1 AC current [mA] (IL1) idc DC current [mA] (IDC) ul1 AC voltage [mV] (UL1) udc DC voltage [mV] (UDC) sys 20001 .. 20009; 20008 is netbedrijf, 20002 is te weinig licht */ // insert into log1 (kdy,kmt,kyr,kt0,tnf,tkk,pac,prl,il1,idc,ul1,udc,sys) // values (92,59,880,5353,5006,30,0,0,0,0,0,0,20002); // insert into log1 (kdy,kt0,tnf,tkk,pac,pac1,il1,ul1,ttotal,ppv) float kdy = inverter.Etoday; // Kdy float kt0 = inverter.Etotal; // kt0 float tnf = inverter.Fac; // tnf float tkk = inverter.Tinverter; // tkk float pac = inverter.Pac; // float pac1 = inverter.Pac1; // pac float il1 = inverter.Iac1; // il1 float ul1 = inverter.Vac1; // ul1 float ttotal = inverter.ttotal; float ppv = inverter.Ppv; // allData = String(kdy); allData.concat(","); allData.concat(kt0); allData.concat(","); allData.concat(tnf); allData.concat(","); allData.concat(tkk); allData.concat(","); allData.concat(pac); allData.concat(","); allData.concat(pac1); allData.concat(","); allData.concat(il1); allData.concat(","); allData.concat(ul1); allData.concat(","); allData.concat(ttotal); allData.concat(","); allData.concat(ppv); bericht = allData.c_str(); client.publish("/inverter/alldata", bericht, true); //verzenden = false; // Deze wordt via de callback vanaf de SolarPi weer op true gezet } delay(1000); } if (!client.connected()) { reconnect(); } client.loop(); ArduinoOTA.handle(); // set word 0 of TX buffer to least-sign; }