Hallo zusammen,
ich möchte mit einem Wemos meine Wechselrichter seriell auslesen und habe mich mal ans Werk gemacht, leider komme ich nicht ganz weiter.
Das Gerät ein Phocos Anygrid, besitzt eine Serielle Schnittstelle RJ45, RX,TX und GND. Davon hängen bei mir 3 Stück im Inselbetrieb, diese sind auch miteinander verbunden Parallelkabeln und Signalleitungen) und liefern mit Hterm auch Daten. Damit Daten gesendet werden, muss man vorher was senden, QPGS0.
Mit Hterm sind das folgende Daten in Hex:
51 50 47 53 30 3F DA für QPGS0 Wechselrichter 1
51 50 47 53 31 2F FB für QPGS1 Wechselrichter 2
51 50 47 53 32 1F 98 für QPGS2 Wechselrichter 3
Empfangen in Hterm wird nach senden für z.B. die Hex Werte von QPGS0
Mein Code:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5); // RX, TX nodeMcu D1 = GPIO 5 / D2 = GPIO 4
const unsigned int SEND_DURATION = 1000;
const unsigned int SEND_PAUSE = 10;
const int SERIAL_BUFFER_SIZE = 150;
unsigned long previousMillis;
bool sending;
const byte QPGS0[] = { 0x51, 0x50, 0x47, 0x53, 0x30, 0x3F, 0xDA };
const byte QPGS1[] = { 0x51, 0x50, 0x47, 0x53, 0x31, 0x2F, 0xFB };
const byte QPGS2[] = { 0x51, 0x50, 0x47, 0x53, 0x32, 0x1F, 0x98 };
char Ausgabe[50];
int i = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
// set the data rate for the SoftwareSerial port
}
mySerial.begin(2400);
}
void loop() {
if (mySerial.available())
{
if (millis() - previousMillis > SEND_DURATION)
{
previousMillis = millis();
mySerial.write(QPGS0,sizeof(QPGS0));
mySerial.write( '\r' );
delay(SEND_PAUSE); //mal ganz einfach. 10ms sind hier nicht so schlimm
//sending = false;
//serielle Schnittstelle auslesen
empfangeDaten(); // Sende über Softwareserial Empfange über Serial
}
if (millis() - previousMillis > SEND_DURATION)
{
previousMillis = millis();
mySerial.write(QPGS1,sizeof(QPGS1));
mySerial.write( '\r' );
delay(SEND_PAUSE); //mal ganz einfach. 10ms sind hier nicht so schlimm
//sending = false;
}
empfangeDaten();
if (millis() - previousMillis > SEND_DURATION)
{
previousMillis = millis();
mySerial.write(QPGS2,sizeof(QPGS2));
mySerial.write( '\r' );
delay(SEND_PAUSE); //mal ganz einfach. 10ms sind hier nicht so schlimm
//sending = false;
}
empfangeDaten();
}
}
void empfangeDaten() {
while (Serial.available()) {
Serial.println("Ausgabe beginnt ");
if (i < 149) {
Ausgabe[i] = mySerial.read();
Serial.print(Ausgabe[i]);
Serial.println(i);
i++;
}
}
}
Leider Empfange ich nichts auf der Seriellen Konsole, kann sich das jemand anschauen, was ich hier falsch mache?
Bilder vom Wemos:
Das Query Protokoll des Anygrid Wechselrichters:
Any-Grid_PSW-H_RS-232 Query Protocol_2019-02-21 (1).pdf (560.0 KB)
Das Ziel, die Wechselrichter Daten, über MQTT an den Iobroker zusenden.
Noch ein weiter Weg, denn wenn ich endlich mal eine Ausgabe auf dem Seriellenmonitor habe, muss ich die Daten erst Parsen.
Grüsse
Antonio