Hallo,
ich bin aktuell am programmieren einer neuen Firmware für meinen Wifi-Stick welcher am Growatt Solarwechselrichter hängt.
Aus irgendeinem Grund hat sich dieser verabschiedet.
Ich bekomme zwar Ersatz von Growatt, möchte aber auf langer Sicht nicht in der China-Cloud meine Daten sehen.
Also habe ich den Stick zerlegt und einen ESP8266 entdeckt. Die benötigten Pin für RX und TX waren auch vorhanden.
Der Stick hängt mit USB am Wechselrichter. Alle wichtigen Bauteile sind also für eine Kommunikation vorhanden. Er lief ja vorher auch
Was habe ich bis jetzt erreicht:
WLan ... läuft wieder
InFluxDB... Verbindung und Datenversendung an den Rasperry läuft. Testdaten werden in InfluxDB
Grafana ... läuft auf dem Rasperry
Was benötige ich jetzt noch? Das auslesen der Register mit Modbus.
Beispiel: float pv1voltage --- aus dem Wechselrichter aufrufen.
Auf dem Stick gibt es nur den USB-RS232 Converter. Einen RS485 gibt es nicht. Falls das wichtig sein sollte.
Hier noch mein Code welcher so eventuell nicht perfekt ist, aber er läuft.
Wie rufe ich Modbus auf und benutze es.
Gruß Ralf
Mein Code
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <ModbusMaster.h>
#include <ESP8266WiFi.h>
#include <InfluxDbClient.h>
#include "setup.h"
const char* SSID = "xxx";
const char* PSK = "xxx";
const char* GATEWAY = "192.168.2.1";
#define INFLUXDB_URL "http://192.168.2.6:8086"
#define INFLUXDB_DB_NAME "solar"
#define DEVICE "Growatt"
WiFiClient espClient;
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_DB_NAME);
#define LED_GN 0 // GPIO0
#define LED_RT 2 // GPIO2
#define LED_BL 16 // GPIO16
ModbusMaster growatt;
Point wechselrichter_batt_cap("batt_cap");
Point wechselrichter_batt_volt("batt_volt");
Point wechselrichter_modul_volt("modul_volt");
Point wechselrichter_modul_amp("modul_amp");
Point wechselrichter_modul_kw("modul_kw");
Point wechselrichter_ac_out_amp("ac_out_amp");
Point wechselrichter_ac_out_kw("ac_out_kw");
Point wechselrichter_ac_in_amp("ac_in_amp");
Point wechselrichter_ac_in_kw("ac_in_kw");
int letztestunde, aktuellestunde;
long batt_cap;
long batt_volt;
long modul_volt;
long modul_amp;
long modul_kw;
long ac_out_amp;
long ac_out_kw;
long ac_in_amp;
long ac_in_kw;
WiFiUDP ntpUDP;
const long utcOffsetInSeconds = 3600;
char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
NTPClient timeClient(ntpUDP, GATEWAY, utcOffsetInSeconds);
void setup() {
Serial.begin(115200);
setup_wifi();
pinMode(LED_GN, OUTPUT);
pinMode(LED_RT, OUTPUT);
pinMode(LED_BL, OUTPUT);
digitalWrite(LED_GN, LOW);
digitalWrite(LED_RT, LOW);
digitalWrite(LED_BL, LOW);
//influxdb
client.setConnectionParamsV1(INFLUXDB_URL, INFLUXDB_DB_NAME);
wechselrichter_batt_cap.addTag("batt_cap", DEVICE);
wechselrichter_batt_cap.addField("batt_cap", batt_cap);
wechselrichter_batt_volt.addTag("batt_volt", DEVICE);
wechselrichter_batt_volt.addField("batt_volt", batt_volt);
wechselrichter_modul_volt.addTag("modul_volt", DEVICE);
wechselrichter_modul_volt.addField("modul_volt", modul_volt);
wechselrichter_modul_amp.addTag("modul_amp", DEVICE);
wechselrichter_modul_amp.addField("modul_amp", modul_amp);
wechselrichter_modul_kw.addTag("modul_kw", DEVICE);
wechselrichter_modul_kw.addField("modul_kw", modul_kw);
wechselrichter_ac_out_amp.addTag("ac_out_amp", DEVICE);
wechselrichter_ac_out_amp.addField("ac_out_amp", ac_out_amp);
wechselrichter_ac_out_kw.addTag("ac_out_kw", DEVICE);
wechselrichter_ac_out_kw.addField("ac_out_kw", ac_out_kw);
wechselrichter_ac_in_amp.addTag("ac_in_amp", DEVICE);
wechselrichter_ac_in_amp.addField("ac_in_amp", ac_in_amp);
wechselrichter_ac_in_kw.addTag("ac_in_kw", DEVICE);
wechselrichter_ac_in_kw.addField("ac_in_kw", ac_in_kw);
}
void setup_wifi() {
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
digitalWrite(LED_RT, HIGH); digitalWrite(LED_BL, LOW);
}
Serial.println(WiFi.localIP());
if (client.validateConnection()) {
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
timeClient.begin();
} else {
Serial.print("InfluxDB connection failed: ");
Serial.println(client.getLastErrorMessage());
}
}
void loop() {
//Zeit ermittelen
timeClient.update();
Serial.println(timeClient.getFormattedTime());
Serial.println(daysOfTheWeek[timeClient.getDay()]);
Serial.println(", ");
Serial.println(timeClient.getFormattedTime());
aktuellestunde = timeClient.getHours();
Serial.println(aktuellestunde);
if (aktuellestunde > letztestunde){
//S0 WeMos ausgelesen werden
//danach an WeMos S0 Reset senden
}
Serial.println(batt_cap);
while (WiFi.status() == WL_CONNECTED) {
delay(500);
digitalWrite(LED_BL, HIGH); digitalWrite(LED_RT, LOW);
//Testwerte
batt_cap = random(100);
batt_volt = random(40, 56);
modul_volt = random(420);
modul_amp = modul_volt / 100;
modul_kw = modul_volt * modul_amp;
ac_out_amp = random(16);
ac_out_kw = random(5000);
ac_in_amp = random(16);
ac_in_kw = random(3000);
//wechselrichter_batt_cap.clearFields();
wechselrichter_batt_cap.addField("batt_cap", batt_cap);
wechselrichter_batt_volt.addField("batt_volt", batt_volt);
wechselrichter_modul_volt.addField("modul_volt", modul_volt);
wechselrichter_modul_amp.addField("modul_amp", modul_amp);
wechselrichter_modul_kw.addField("modul_kw", modul_kw);
wechselrichter_ac_out_amp.addField("ac_out_amp", ac_out_amp);
wechselrichter_ac_out_kw.addField("ac_out_kw", ac_out_kw);
wechselrichter_ac_in_amp.addField("ac_in_amp", ac_in_amp);
wechselrichter_ac_in_kw.addField("ac_in_kw", ac_in_kw);
if (client.validateConnection()) {
// Write point
client.writePoint(wechselrichter_batt_cap);
client.writePoint(wechselrichter_batt_volt);
client.writePoint(wechselrichter_modul_volt);
client.writePoint(wechselrichter_modul_amp);
client.writePoint(wechselrichter_modul_kw);
client.writePoint(wechselrichter_ac_out_amp);
client.writePoint(wechselrichter_ac_out_kw);
client.writePoint(wechselrichter_ac_in_amp);
client.writePoint(wechselrichter_ac_in_kw);
digitalWrite(LED_GN, !digitalRead(LED_GN));delay(10);digitalWrite(LED_GN, !digitalRead(LED_GN));
delay(5000);
}
}
}