Browse Source

Merge branch 'upstream/HEAD' into control

pull/124/head
Andreas Schiffler 2 years ago
parent
commit
6032a5ad41
  1. 26
      tools/esp8266/app.cpp
  2. 2
      tools/esp8266/defines.h
  3. 71
      tools/esp8266/hmRadio.h
  4. 53
      tools/esp8266/mqtt.h
  5. 75
      tools/esp8266/platformio.ini
  6. 138
      tools/rpi/hoymiles/decoders/__init__.py

26
tools/esp8266/app.cpp

@ -127,17 +127,19 @@ void app::setup(uint32_t timeout) {
// mqtt // mqtt
char mqttAddr[MQTT_ADDR_LEN];
uint16_t mqttPort; uint16_t mqttPort;
char mqttAddr[MQTT_ADDR_LEN];
char mqttUser[MQTT_USER_LEN]; char mqttUser[MQTT_USER_LEN];
char mqttPwd[MQTT_PWD_LEN]; char mqttPwd[MQTT_PWD_LEN];
char mqttTopic[MQTT_TOPIC_LEN]; char mqttTopic[MQTT_TOPIC_LEN];
mEep->read(ADDR_MQTT_ADDR, mqttAddr, MQTT_ADDR_LEN); char mqttDevName[DEVNAME_LEN];
mEep->read(ADDR_MQTT_USER, mqttUser, MQTT_USER_LEN); mEep->read(ADDR_MQTT_ADDR, mqttAddr, MQTT_ADDR_LEN);
mEep->read(ADDR_MQTT_PWD, mqttPwd, MQTT_PWD_LEN); mEep->read(ADDR_MQTT_USER, mqttUser, MQTT_USER_LEN);
mEep->read(ADDR_MQTT_TOPIC, mqttTopic, MQTT_TOPIC_LEN); mEep->read(ADDR_MQTT_PWD, mqttPwd, MQTT_PWD_LEN);
mEep->read(ADDR_MQTT_TOPIC, mqttTopic, MQTT_TOPIC_LEN);
mEep->read(ADDR_DEVNAME, mqttDevName, DEVNAME_LEN);
//mEep->read(ADDR_MQTT_INTERVAL, &mMqttInterval); //mEep->read(ADDR_MQTT_INTERVAL, &mMqttInterval);
mEep->read(ADDR_MQTT_PORT, &mqttPort); mEep->read(ADDR_MQTT_PORT, &mqttPort);
if(mqttAddr[0] > 0) { if(mqttAddr[0] > 0) {
mMqttActive = true; mMqttActive = true;
@ -150,7 +152,7 @@ void app::setup(uint32_t timeout) {
if(0 == mqttPort) if(0 == mqttPort)
mqttPort = 1883; mqttPort = 1883;
mMqtt.setup(mqttAddr, mqttTopic, mqttUser, mqttPwd, mqttPort); mMqtt.setup(mqttAddr, mqttTopic, mqttUser, mqttPwd, mqttDevName, mqttPort);
mMqtt.mClient->setCallback(std::bind(&app::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); mMqtt.mClient->setCallback(std::bind(&app::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
mMqttTicker = 0; mMqttTicker = 0;
@ -158,6 +160,7 @@ void app::setup(uint32_t timeout) {
if(mqttAddr[0] > 0) { if(mqttAddr[0] > 0) {
char topic[30]; char topic[30];
mMqtt.sendMsg("device", mqttDevName);
mMqtt.sendMsg("version", mVersion); mMqtt.sendMsg("version", mVersion);
for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) {
iv = mSys->getInverterByPos(i); iv = mSys->getInverterByPos(i);
@ -213,9 +216,9 @@ void app::loop(void) {
yield(); yield();
if(checkTicker(&mRxTicker, 5)) { if(checkTicker(&mRxTicker, 5)) {
DPRINTLN(DBG_DEBUG, F("app_loops =") + String(app_loops)); //DPRINTLN(DBG_VERBOSE, F("app_loops =") + String(app_loops));
app_loops=0; app_loops=0;
DPRINT(DBG_DEBUG, F("a")); DPRINT(DBG_VERBOSE, F("a"));
bool rxRdy = mSys->Radio.switchRxCh(); bool rxRdy = mSys->Radio.switchRxCh();
@ -226,7 +229,8 @@ void app::loop(void) {
if(mSys->Radio.checkPaketCrc(p->packet, &len, p->rxCh)) { if(mSys->Radio.checkPaketCrc(p->packet, &len, p->rxCh)) {
// process buffer only on first occurrence // process buffer only on first occurrence
if(mSerialDebug) { if(mSerialDebug) {
DPRINT(DBG_DEBUG, "Received " + String(len) + " bytes channel " + String(p->rxCh) + ": "); DPRINT(DBG_INFO, "RX " + String(len) + "B Ch" + String(p->rxCh) + " | ");
mSys->Radio.dumpBuf(NULL, p->packet, len); mSys->Radio.dumpBuf(NULL, p->packet, len);
} }
mFrameCnt++; mFrameCnt++;
@ -316,6 +320,7 @@ void app::loop(void) {
Inverter<> *iv = mSys->getInverterByPos(id); Inverter<> *iv = mSys->getInverterByPos(id);
if(NULL != iv) { if(NULL != iv) {
if(iv->isAvailable(mTimestamp)) { if(iv->isAvailable(mTimestamp)) {
DPRINTLN(DBG_INFO, "Inverter: " + String(id));
for(uint8_t i = 0; i < iv->listLen; i++) { for(uint8_t i = 0; i < iv->listLen; i++) {
if(0.0f != iv->getValue(i)) { if(0.0f != iv->getValue(i)) {
snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i));
@ -324,6 +329,7 @@ void app::loop(void) {
} }
yield(); yield();
} }
DPRINTLN(DBG_INFO, "");
} }
} }
} }

2
tools/esp8266/defines.h

@ -21,7 +21,7 @@
//------------------------------------- //-------------------------------------
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 4 #define VERSION_MINOR 4
#define VERSION_PATCH 25 #define VERSION_PATCH 26
//------------------------------------- //-------------------------------------

71
tools/esp8266/hmRadio.h

@ -19,8 +19,8 @@
#define DTU_RADIO_ID ((uint64_t)0x1234567801ULL) #define DTU_RADIO_ID ((uint64_t)0x1234567801ULL)
#define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL) #define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL)
#define RX_CHANNELS 5 #define RF_CHANNELS 5
#define RX_LOOP_CNT 300 #define RF_LOOP_CNT 300
const char* const rf24AmpPower[] = {"MIN", "LOW", "HIGH", "MAX"}; const char* const rf24AmpPower[] = {"MIN", "LOW", "HIGH", "MAX"};
@ -56,18 +56,18 @@ class HmRadio {
public: public:
HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) { HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) {
DPRINTLN(DBG_VERBOSE, F("hmRadio.h : HmRadio():mNrf24(CE_PIN: ") + String(CE_PIN) + F(", CS_PIN: ") + String(CS_PIN) + F(", SPI_SPEED: ") + String(SPI_SPEED) + ")"); DPRINTLN(DBG_VERBOSE, F("hmRadio.h : HmRadio():mNrf24(CE_PIN: ") + String(CE_PIN) + F(", CS_PIN: ") + String(CS_PIN) + F(", SPI_SPEED: ") + String(SPI_SPEED) + ")");
mTxChLst[0] = 40;
//mTxChIdx = 1;
// Depending on the program, the module can work on 2403, 2423, 2440, 2461 or 2475MHz. // Depending on the program, the module can work on 2403, 2423, 2440, 2461 or 2475MHz.
// Channel List 2403, 2423, 2440, 2461, 2475MHz // Channel List 2403, 2423, 2440, 2461, 2475MHz
mRxChLst[0] = 03; mRfChLst[0] = 03;
mRxChLst[1] = 23; mRfChLst[1] = 23;
mRxChLst[2] = 40; mRfChLst[2] = 40;
mRxChLst[3] = 61; mRfChLst[3] = 61;
mRxChLst[4] = 75; mRfChLst[4] = 75;
mRxChIdx = 0;
mRxLoopCnt = RX_LOOP_CNT; mTxChIdx = 2; // Start TX with 40
mRxChIdx = 0; // Start RX with 03
mRxLoopCnt = RF_LOOP_CNT;
pinCs = CS_PIN; pinCs = CS_PIN;
pinCe = CE_PIN; pinCe = CE_PIN;
@ -109,7 +109,7 @@ class HmRadio {
DPRINTLN(DBG_INFO, F("Radio Config:")); DPRINTLN(DBG_INFO, F("Radio Config:"));
mNrf24.printPrettyDetails(); mNrf24.printPrettyDetails();
mTxCh = getDefaultChannel(); mTxCh = setDefaultChannels();
if(!mNrf24.isChipConnected()) { if(!mNrf24.isChipConnected()) {
DPRINTLN(DBG_WARN, F("WARNING! your NRF24 module can't be reached, check the wiring")); DPRINTLN(DBG_WARN, F("WARNING! your NRF24 module can't be reached, check the wiring"));
@ -128,7 +128,7 @@ class HmRadio {
while(mNrf24.available(&pipe)) { while(mNrf24.available(&pipe)) {
if(!mBufCtrl->full()) { if(!mBufCtrl->full()) {
p = mBufCtrl->getFront(); p = mBufCtrl->getFront();
p->rxCh = mRxChLst[mRxChIdx]; p->rxCh = mRfChLst[mRxChIdx];
len = mNrf24.getPayloadSize(); len = mNrf24.getPayloadSize();
if(len > MAX_RF_PAYLOAD_SIZE) if(len > MAX_RF_PAYLOAD_SIZE)
len = MAX_RF_PAYLOAD_SIZE; len = MAX_RF_PAYLOAD_SIZE;
@ -152,20 +152,13 @@ class HmRadio {
mIrqRcvd = true; mIrqRcvd = true;
} }
uint8_t getDefaultChannel(void) { uint8_t setDefaultChannels(void) {
//DPRINTLN(DBG_VERBOSE, F("hmRadio.h:getDefaultChannel")); //DPRINTLN(DBG_VERBOSE, F("hmRadio.h:setDefaultChannels"));
return mTxChLst[0]; mTxChIdx = 2; // Start TX with 40
} mRxChIdx = 0; // Start RX with 03
/*uint8_t getLastChannel(void) { return mRfChLst[mTxChIdx];
return mTxChLst[mTxChIdx];
} }
uint8_t getNxtChannel(void) {
if(++mTxChIdx >= 4)
mTxChIdx = 0;
return mTxChLst[mTxChIdx];
}*/
void sendControlPacket(uint64_t invId, uint8_t cmd, uint16_t data) { void sendControlPacket(uint64_t invId, uint8_t cmd, uint16_t data) {
DPRINTLN(DBG_VERBOSE, F("hmRadio.h:sendControlPacket")); DPRINTLN(DBG_VERBOSE, F("hmRadio.h:sendControlPacket"));
// sendCmdPacket(invId, 0x51, 0x80, false); // 0x80 implementation as original DTU code // sendCmdPacket(invId, 0x51, 0x80, false); // 0x80 implementation as original DTU code
@ -290,7 +283,7 @@ class HmRadio {
//DPRINTLN(DBG_VERBOSE, "sent packet: #" + String(mSendCnt)); //DPRINTLN(DBG_VERBOSE, "sent packet: #" + String(mSendCnt));
//dumpBuf("SEN ", buf, len); //dumpBuf("SEN ", buf, len);
if(mSerialDebug) { if(mSerialDebug) {
DPRINT(DBG_INFO, "Transmit " + String(len) + " | "); DPRINT(DBG_INFO, "TX " + String(len) + "B Ch" + String(mRfChLst[mTxChIdx]) + " | ");
dumpBuf(NULL, buf, len); dumpBuf(NULL, buf, len);
} }
@ -298,10 +291,10 @@ class HmRadio {
mNrf24.stopListening(); mNrf24.stopListening();
if(clear) if(clear)
mRxLoopCnt = RX_LOOP_CNT; mRxLoopCnt = RF_LOOP_CNT;
mTxCh = getDefaultChannel(); mNrf24.setChannel(mRfChLst[mTxChIdx]);
mNrf24.setChannel(mTxCh); mTxCh = getTxNxtChannel(); // switch channel for next packet
mNrf24.openWritingPipe(invId); // TODO: deprecated mNrf24.openWritingPipe(invId); // TODO: deprecated
mNrf24.setCRCLength(RF24_CRC_16); mNrf24.setCRCLength(RF24_CRC_16);
mNrf24.enableDynamicPayloads(); mNrf24.enableDynamicPayloads();
@ -312,7 +305,7 @@ class HmRadio {
// Try to avoid zero payload acks (has no effect) // Try to avoid zero payload acks (has no effect)
mNrf24.openWritingPipe(DUMMY_RADIO_ID); // TODO: why dummy radio id?, deprecated mNrf24.openWritingPipe(DUMMY_RADIO_ID); // TODO: why dummy radio id?, deprecated
mRxChIdx = 0; mRxChIdx = 0;
mNrf24.setChannel(mRxChLst[mRxChIdx]); mNrf24.setChannel(mRfChLst[mRxChIdx]);
mNrf24.setAutoAck(false); mNrf24.setAutoAck(false);
mNrf24.setRetries(0, 0); mNrf24.setRetries(0, 0);
mNrf24.disableDynamicPayloads(); mNrf24.disableDynamicPayloads();
@ -323,19 +316,25 @@ class HmRadio {
mSendCnt++; mSendCnt++;
} }
uint8_t getTxNxtChannel(void) {
if(++mTxChIdx >= RF_CHANNELS)
mTxChIdx = 0;
return mRfChLst[mTxChIdx];
}
uint8_t getRxNxtChannel(void) { uint8_t getRxNxtChannel(void) {
if(++mRxChIdx >= RX_CHANNELS) if(++mRxChIdx >= RF_CHANNELS)
mRxChIdx = 0; mRxChIdx = 0;
return mRxChLst[mRxChIdx]; return mRfChLst[mRxChIdx];
} }
uint8_t mTxCh; uint8_t mTxCh;
uint8_t mTxChLst[1]; uint8_t mTxChIdx;
//uint8_t mTxChIdx;
uint8_t mRxChLst[RX_CHANNELS];
uint8_t mRfChLst[RF_CHANNELS];
uint8_t mRxChIdx; uint8_t mRxChIdx;
uint16_t mRxLoopCnt; uint16_t mRxLoopCnt;

53
tools/esp8266/mqtt.h

@ -18,23 +18,28 @@ class mqtt {
mClient = new PubSubClient(mEspClient); mClient = new PubSubClient(mEspClient);
mAddressSet = false; mAddressSet = false;
memset(mUser, 0, MQTT_USER_LEN); memset(mBroker, 0, MQTT_ADDR_LEN);
memset(mPwd, 0, MQTT_PWD_LEN); memset(mUser, 0, MQTT_USER_LEN);
memset(mTopic, 0, MQTT_TOPIC_LEN); memset(mPwd, 0, MQTT_PWD_LEN);
memset(mTopic, 0, MQTT_TOPIC_LEN);
memset(mDevName, 0, DEVNAME_LEN);
} }
~mqtt() { } ~mqtt() { }
void setup(const char *broker, const char *topic, const char *user, const char *pwd, uint16_t port) { void setup(const char *broker, const char *topic, const char *user, const char *pwd, const char *devname, uint16_t port) {
DPRINTLN(DBG_VERBOSE, F("mqtt.h:setup")); DPRINTLN(DBG_VERBOSE, F("mqtt.h:setup"));
mAddressSet = true; mAddressSet = true;
mClient->setServer(broker, port);
mClient->setBufferSize(MQTT_MAX_PACKET_SIZE);
mPort = port; mPort = port;
snprintf(mUser, MQTT_USER_LEN, "%s", user); snprintf(mBroker, MQTT_ADDR_LEN, "%s", broker);
snprintf(mPwd, MQTT_PWD_LEN, "%s", pwd); snprintf(mUser, MQTT_USER_LEN, "%s", user);
snprintf(mTopic, MQTT_TOPIC_LEN, "%s", topic); snprintf(mPwd, MQTT_PWD_LEN, "%s", pwd);
snprintf(mTopic, MQTT_TOPIC_LEN, "%s", topic);
snprintf(mDevName, DEVNAME_LEN, "%s", devname);
mClient->setServer(mBroker, mPort);
mClient->setBufferSize(MQTT_MAX_PACKET_SIZE);
} }
void setCallback(void (*func)(const char* topic, byte* payload, unsigned int length)){ void setCallback(void (*func)(const char* topic, byte* payload, unsigned int length)){
@ -64,6 +69,11 @@ class mqtt {
return mClient->connected(); return mClient->connected();
} }
char *getBroker(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getBroker"));
return mBroker;
}
char *getUser(void) { char *getUser(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getUser")); //DPRINTLN(DBG_VERBOSE, F("mqtt.h:getUser"));
return mUser; return mUser;
@ -79,6 +89,11 @@ class mqtt {
return mTopic; return mTopic;
} }
char *getDevName(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getDevName"));
return mDevName;
}
uint16_t getPort(void) { uint16_t getPort(void) {
return mPort; return mPort;
} }
@ -92,12 +107,20 @@ class mqtt {
private: private:
void reconnect(void) { void reconnect(void) {
DPRINTLN(DBG_INFO, F("mqtt.h:reconnect")); DPRINTLN(DBG_DEBUG, F("mqtt.h:reconnect"));
DPRINTLN(DBG_DEBUG, F("MQTT mClient->_state ") + String(mClient->state()) );
DPRINTLN(DBG_DEBUG, F("WIFI mEspClient.status ") + String(mEspClient.status()) );
if(!mClient->connected()) { if(!mClient->connected()) {
if((strlen(mUser) > 0) && (strlen(mPwd) > 0)) if(strlen(mDevName) > 0) {
mClient->connect(DEF_DEVICE_NAME, mUser, mPwd); // der Server und der Port müssen neu gesetzt werden,
else // da ein MQTT_CONNECTION_LOST -3 die Werte zerstört hat.
mClient->connect(DEF_DEVICE_NAME); mClient->setServer(mBroker, mPort);
mClient->setBufferSize(MQTT_MAX_PACKET_SIZE);
if((strlen(mUser) > 0) && (strlen(mPwd) > 0))
mClient->connect(mDevName, mUser, mPwd);
else
mClient->connect(mDevName);
}
} }
char topic[MQTT_TOPIC_LEN + 13 ]; // "/devcontrol/#" --> + 6 byte char topic[MQTT_TOPIC_LEN + 13 ]; // "/devcontrol/#" --> + 6 byte
// ToDo: "/devcontrol/#" is hardcoded // ToDo: "/devcontrol/#" is hardcoded
@ -110,9 +133,11 @@ class mqtt {
bool mAddressSet; bool mAddressSet;
uint16_t mPort; uint16_t mPort;
char mBroker[MQTT_ADDR_LEN];
char mUser[MQTT_USER_LEN]; char mUser[MQTT_USER_LEN];
char mPwd[MQTT_PWD_LEN]; char mPwd[MQTT_PWD_LEN];
char mTopic[MQTT_TOPIC_LEN]; char mTopic[MQTT_TOPIC_LEN];
char mDevName[DEVNAME_LEN];
}; };
#endif /*__MQTT_H_*/ #endif /*__MQTT_H_*/

75
tools/esp8266/platformio.ini

@ -1,3 +1,13 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[platformio] [platformio]
src_dir = . src_dir = .
@ -5,32 +15,67 @@ src_dir = .
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
board = d1_mini board = d1_mini
monitor_speed = 115200
board_build.f_cpu = 80000000L board_build.f_cpu = 80000000L
; ;;;;; Possible Debug options ;;;;;;
; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level
;build_flags = -DDEBUG_ESP_PORT=Serial ;build_flags = -DDEBUG_ESP_PORT=Serial
;-DDEBUG_ESP_CORE
;-DDEBUG_ESP_WIFI
;-DDEBUG_ESP_HTTP_CLIENT
;-DDEBUG_ESP_HTTP_SERVER
;-DDEBUG_ESP_OOM
monitor_speed = 115200
monitor_filters =
;default ; Remove typical terminal control codes from input
time ; Add timestamp with milliseconds for each new line
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
lib_deps = lib_deps =
nrf24/RF24@1.4.2 nrf24/RF24@1.4.2
paulstoffregen/Time@^1.6.1 paulstoffregen/Time@^1.6.1
knolleary/PubSubClient@^2.8 knolleary/PubSubClient@^2.8
bblanchon/ArduinoJson@^6.19.4 bblanchon/ArduinoJson@^6.19.4
;esp8266/DNSServer@1.1.0 ;esp8266/DNSServer@1.1.0
;esp8266/EEPROM@^1.0 ;esp8266/EEPROM@^1.0
;esp8266/ESP8266HTTPUpdateServer@^1.0 ;esp8266/ESP8266HTTPUpdateServer@^1.0
;esp8266/ESP8266WebServer@^1.0 ;esp8266/ESP8266WebServer@^1.0
;esp8266/ESP8266WiFi@^1.0 ;esp8266/ESP8266WiFi@^1.0
;esp8266/SPI@1.0 ;esp8266/SPI@1.0
;esp8266/Ticker@^1.0 ;esp8266/Ticker@^1.0
[env:node_mcu_v2] [env:node_mcu_v2]
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
board = nodemcuv2 board = nodemcuv2
monitor_speed = 115200
board_build.f_cpu = 80000000L board_build.f_cpu = 80000000L
lib_deps = ; ;;;;; Possible Debug options ;;;;;;
nrf24/RF24@1.4.2 ; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level
;build_flags = -DDEBUG_ESP_PORT=Serial
;-DDEBUG_ESP_CORE
;-DDEBUG_ESP_WIFI
;-DDEBUG_ESP_HTTP_CLIENT
;-DDEBUG_ESP_HTTP_SERVER
;-DDEBUG_ESP_OOM
monitor_speed = 115200
monitor_filters =
;default ; Remove typical terminal control codes from input
time ; Add timestamp with milliseconds for each new line
;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory
upload_port = /dev/ttyUSB0
lib_deps =
nrf24/RF24@1.4.2
paulstoffregen/Time@^1.6.1 paulstoffregen/Time@^1.6.1
knolleary/PubSubClient@^2.8 knolleary/PubSubClient@^2.8
bblanchon/ArduinoJson@^6.19.4 bblanchon/ArduinoJson@^6.19.4
;esp8266/DNSServer@1.1.0
;esp8266/EEPROM@^1.0
;esp8266/ESP8266HTTPUpdateServer@^1.0
;esp8266/ESP8266WebServer@^1.0
;esp8266/ESP8266WiFi@^1.0
;esp8266/SPI@1.0
;esp8266/Ticker@^1.0

138
tools/rpi/hoymiles/decoders/__init__.py

@ -217,74 +217,76 @@ class EventsResponse(UnknownResponse):
""" Hoymiles micro-inverter event log decode helper """ """ Hoymiles micro-inverter event log decode helper """
alarm_codes = { alarm_codes = {
1: 'Inverter start', // HM Error Codes
2: 'DTU command failed', 1: 'Inverter start', // 0x01
121: 'Over temperature protection', 2: 'DTU command failed', // 0x02
125: 'Grid configuration parameter error', 121: 'Over temperature protection', // 0x79
126: 'Software error code 126', 125: 'Grid configuration parameter error', // 0x7D
127: 'Firmware error', 126: 'Software error code 126', // 0x7E
128: 'Software error code 128', 127: 'Firmware error', // 0x7F
129: 'Software error code 129', 128: 'Software error code 128', // 0x80
130: 'Offline', 129: 'Software error code 129', // 0x81
141: 'Grid overvoltage', 130: 'Offline', // 0x82
142: 'Average grid overvoltage', 141: 'Grid overvoltage', // 0x8D
143: 'Grid undervoltage', 142: 'Average grid overvoltage', // 0x8E
144: 'Grid overfrequency', 143: 'Grid undervoltage', // 0x8F
145: 'Grid underfrequency', 144: 'Grid overfrequency', // 0x90
146: 'Rapid grid frequency change', 145: 'Grid underfrequency', // 0x91
147: 'Power grid outage', 146: 'Rapid grid frequency change', // 0x92
148: 'Grid disconnection', 147: 'Power grid outage', // 0x93
149: 'Island detected', 148: 'Grid disconnection', // 0x94
205: 'Input port 1 & 2 overvoltage', 149: 'Island detected', // 0x95
206: 'Input port 3 & 4 overvoltage', 205: 'Input port 1 & 2 overvoltage', // 0xCD
207: 'Input port 1 & 2 undervoltage', 206: 'Input port 3 & 4 overvoltage', // 0xCE
208: 'Input port 3 & 4 undervoltage', 207: 'Input port 1 & 2 undervoltage', // 0xCF
209: 'Port 1 no input', 208: 'Input port 3 & 4 undervoltage', // 0xD0
210: 'Port 2 no input', 209: 'Port 1 no input', // 0xD1
211: 'Port 3 no input', 210: 'Port 2 no input', // 0xD2
212: 'Port 4 no input', 211: 'Port 3 no input', // 0xD3
213: 'PV-1 & PV-2 abnormal wiring', 212: 'Port 4 no input', // 0xD4
214: 'PV-3 & PV-4 abnormal wiring', 213: 'PV-1 & PV-2 abnormal wiring', // 0xD5
215: 'PV-1 Input overvoltage', 214: 'PV-3 & PV-4 abnormal wiring', // 0xD6
216: 'PV-1 Input undervoltage', 215: 'PV-1 Input overvoltage', // 0xD7
217: 'PV-2 Input overvoltage', 216: 'PV-1 Input undervoltage', // 0xD8
218: 'PV-2 Input undervoltage', 217: 'PV-2 Input overvoltage', // 0xD9
219: 'PV-3 Input overvoltage', 218: 'PV-2 Input undervoltage', // 0xDA
220: 'PV-3 Input undervoltage', 219: 'PV-3 Input overvoltage', // 0xDB
221: 'PV-4 Input overvoltage', 220: 'PV-3 Input undervoltage', // 0xDC
222: 'PV-4 Input undervoltage', 221: 'PV-4 Input overvoltage', // 0xDD
301: 'Hardware error code 301', 222: 'PV-4 Input undervoltage', // 0xDE
302: 'Hardware error code 302', 301: 'Hardware error code 301', // 0x012D
303: 'Hardware error code 303', 302: 'Hardware error code 302', // 0x012E
304: 'Hardware error code 304', 303: 'Hardware error code 303', // 0x012F
305: 'Hardware error code 305', 304: 'Hardware error code 304', // 0x0130
306: 'Hardware error code 306', 305: 'Hardware error code 305', // 0x0131
307: 'Hardware error code 307', 306: 'Hardware error code 306', // 0x0132
308: 'Hardware error code 308', 307: 'Hardware error code 307', // 0x0133
309: 'Hardware error code 309', 308: 'Hardware error code 308', // 0x0134
310: 'Hardware error code 310', 309: 'Hardware error code 309', // 0x0135
311: 'Hardware error code 311', 310: 'Hardware error code 310', // 0x0136
312: 'Hardware error code 312', 311: 'Hardware error code 311', // 0x0137
313: 'Hardware error code 313', 312: 'Hardware error code 312', // 0x0138
314: 'Hardware error code 314', 313: 'Hardware error code 313', // 0x0139
5041: 'Error code-04 Port 1', 314: 'Hardware error code 314', // 0x013A
5042: 'Error code-04 Port 2', // MI Error Codes
5043: 'Error code-04 Port 3', 5041: 'Error code-04 Port 1', // 0x13B1
5044: 'Error code-04 Port 4', 5042: 'Error code-04 Port 2', // 0x13B2
5051: 'PV Input 1 Overvoltage/Undervoltage', 5043: 'Error code-04 Port 3', // 0x13B3
5052: 'PV Input 2 Overvoltage/Undervoltage', 5044: 'Error code-04 Port 4', // 0x13B4
5053: 'PV Input 3 Overvoltage/Undervoltage', 5051: 'PV Input 1 Overvoltage/Undervoltage', // 0x13BB
5054: 'PV Input 4 Overvoltage/Undervoltage', 5052: 'PV Input 2 Overvoltage/Undervoltage', // 0x13BC
5060: 'Abnormal bias', 5053: 'PV Input 3 Overvoltage/Undervoltage', // 0x13BD
5070: 'Over temperature protection', 5054: 'PV Input 4 Overvoltage/Undervoltage', // 0x13BE
5080: 'Grid Overvoltage/Undervoltage', 5060: 'Abnormal bias', // 0x13C4
5090: 'Grid Overfrequency/Underfrequency', 5070: 'Over temperature protection', // 0x13CE
5100: 'Island detected', 5080: 'Grid Overvoltage/Undervoltage', // 0x13D8
5120: 'EEPROM reading and writing error', 5090: 'Grid Overfrequency/Underfrequency', // 0x13E2
5150: '10 min value grid overvoltage', 5100: 'Island detected', // 0x13EC
5200: 'Firmware error', 5120: 'EEPROM reading and writing error', // 0x1400
8310: 'Shut down', 5150: '10 min value grid overvoltage', // 0x141E
9000: 'Microinverter is suspected of being stolen' 5200: 'Firmware error', // 0x1450
8310: 'Shut down', // 0x2076
9000: 'Microinverter is suspected of being stolen' // 0x2328
} }
def __init__(self, *args, **params): def __init__(self, *args, **params):

Loading…
Cancel
Save