Custom Firmware for a Solax WIFI USB Stick as an esp32/8266
This works with the ESP8266 Arduino platform
https://github.com/esp8266/Arduino
This works with the ESP32 Arduino platform
https://github.com/espressif/arduino-esp32
ESP | USB |
---|---|
GND (USB) | GND |
VIN (USB) | 5V |
GPI01 (TX)(USB) | TX |
GPI03 (RX)(USB) | RX |
ESP | DEBUG USB |
---|---|
GPI02 | RX |
TODO: add image
Implemented Features:
- Built-in simple Webserver
- Simple Webhook
- The data received will be transmitted by MQTT to a server of your choice.
- The data received is also provied as JSON
- Wifi manager with own access point for initial configuration of Wifi and MQTT server
- TLS support for esp32
- NODEMCU V1 (ESP8266) with a Solax Inverter connected via USB (USB-Serial Chip: CH340)
- X1 Mini
For ENDPOINT Data and sended post request
{
"gridVoltage": number,
"gridCurrent": number,
"gridPower": number,
"pv1Voltage": number,
"pv1Current": number,
"pv2Voltage": number,
"pv2Current": number,
"pv1Power": number,
"pv2Power": number,
"gridFrequency": number,
"mode": number,
"eTotal": number,
"eToday": number,
"temp": number,
"runTime": number,
}
Still missing freatures are:
- Parse Serial
- Parse Settings
- pwr limit
Notice: Only the register dongle and request data is tested
Spezial thanks go to @tuxmike
Byte offset | Datatype | Description | Value |
---|---|---|---|
0 | uint16 | Static preamble | 0xAA 0x55 |
2 | uint8 | Total msg frame size (byte) | size of: header + payload + checksum |
3 | uint8 | Cmd control code | e.g. 0x01 |
4 | uint8 | Cmd function code | e.g. 0x8C |
5 | ... | payload | see cmd table |
[Frame size-2] | uint16 | Checksum | uint16 binary sum of all msg bytes |
Control code | Function Code | Payload length (byte) | Checksum length (byte) | Description |
---|---|---|---|---|
01 | 05 | 0 | 2 | Request read serial numbers |
01 | 85 | 40 | 2 | Response read serial numbers |
02 | 01 | 10 | 2 | Request register pocket dongle serial number |
02 | 01 | 10 | 0 (!) | Response register pocket dongle serial number |
01 | 16 | 0 | 2 | Request inverter settings |
01 | 96 | 400 | 2 | Response inverter settings |
01 | 0C | 0 | 2 | Request inverter data |
01 | 8C | 200 | 2 | Response inverter data |
01 | 04 | 0 | 2 | Request inverter error data |
01 | 84 | 44 | 2 | Response inverter error data |
05 | 00 | 2 | 2 | Request enter pin |
05 | 42 | 2 | 2 | Request write setting pwr limit value |
05 | 60 | 2 | 2 | Request write setting pwr limit on/off |
03 | 80 | 0 | 2 | Response enter pin ok |
03 | 81 | 0 | 2 | Response setting write ok |
Byte offset | Datatype | Description |
---|---|---|
0 | char[14] | Inverter serial number |
14 | char[14] | Inverter serial number padding, spaces |
28 | uint16 | Inverter model code |
30 | char[8] | Pocket dongle serial number |
38 | uint16 | Inverter model type |
Byte offset | Datatype | Description |
---|---|---|
0 | char[10] | Pocket dongle serial number |
Byte offset | Datatype | Description | Unit |
---|---|---|---|
0 | uint16 | Grid voltage | 0.1V |
2 | uint16 | Grid current | 0.1A |
4 | uint16 | Grid power | 1W |
6 | uint16 | PV1 voltage | 0.1V |
8 | uint16 | PV2 voltage | 0.1A |
10 | uint16 | PV1 current | 0.1V |
12 | uint16 | PV2 current | 0.1A |
14 | uint16 | PV1 power | 1W |
16 | uint16 | PV2 power | 1W |
18 | uint16 | Grid frequency | 0.01Hz |
20 | uint16 | Mode | See Invertermodes |
22 | uint32 | E Total | 0.1kwh |
26 | uint16 | E Today | 0.1kwh |
28 | ? | ? | ? |
... | ... | ... | ... |
78 | uint16 | Inverter Temperature | °C |
82 | uint32 | Runtime-total | 1h |
86 | ? | ? | ? |
... | ... | ... | ... |
110 | uint8 | 0x1B ? | ? |
... | ... | ... | ... |
Code | Description |
---|---|
0 | Waiting |
1 | Checking |
2 | Normal |
3 | Fault |
4 | Permanent Fault |
5 | Update |
6 | Off-grid waiting |
7 | Off-grid |
8 | Self Testing |
9 | Idle |
10 | Standby |
Byte offset | Datatype | Description | Unit |
---|---|---|---|
0 | uint16 | PV1 voltage | 0.1V |
2 | uint16 | PV2 voltage | 0.1V |
4 | uint16 | ? | ? |
6 | uint16 | Grid voltage | 0.1V |
8 | uint16 | Grid frequency | 0.01Hz |
10 | ? | ? | ? |
... | ... | ... | ... |
Byte offset | Datatype | Description | Unit |
---|---|---|---|
0 | uint16 | VAC low | 0.1V |
2 | uint16 | VAC high | 0.1V |
4 | uint16 | FAC low | 0.01Hz |
6 | uint16 | FAC high | 0.01Hz |
8 | uint16 | ? | 0.1? |
12 | uint16 | VAC 10m avg | 0.1V |
14 | uint16 | VAC low slow | 0.1V |
16 | uint16 | VAC high slow | 0.1V |
18 | uint16 | FAC low slow | 0.01Hz |
20 | uint16 | FAC high slow | 0.01Hz |
... | ... | ... | ... |
208 | uint16 | Settings PIN A | decimal |
250 | uint16 | Settings PIN B (?) | decimal |
280 | uint16 | Start time | s |
... | ... | ... | ... |
Byte offset | Datatype | Description | Unit |
---|---|---|---|
0 | uint16 | PIN | decimal |
Byte offset | Datatype | Description | Unit |
---|---|---|---|
0 | uint16 | power limit | W |
Byte offset | Datatype | Description | Unit |
---|---|---|---|
0 | uint16 | power limit on/off | 0U=off, 1U=on |
- Battery If you have a battery connected to your inverter -> You can read the values out and print it in a issue.