diff --git a/sonoff/language/bg-BG.h b/sonoff/language/bg-BG.h
index b7080f2ca..43792cdb3 100644
--- a/sonoff/language/bg-BG.h
+++ b/sonoff/language/bg-BG.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/cs-CZ.h b/sonoff/language/cs-CZ.h
index d413910b3..1067a6f02 100644
--- a/sonoff/language/cs-CZ.h
+++ b/sonoff/language/cs-CZ.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h
index 71c4a1de1..fe6067153 100644
--- a/sonoff/language/de-DE.h
+++ b/sonoff/language/de-DE.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/el-GR.h b/sonoff/language/el-GR.h
index 3b6f5edcc..3c43b65c6 100644
--- a/sonoff/language/el-GR.h
+++ b/sonoff/language/el-GR.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h
index af4ba7b64..27ef1e342 100644
--- a/sonoff/language/en-GB.h
+++ b/sonoff/language/en-GB.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/es-ES.h b/sonoff/language/es-ES.h
index 239542068..252f72ce3 100644
--- a/sonoff/language/es-ES.h
+++ b/sonoff/language/es-ES.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h
index 3216932ee..1c8eb4eec 100644
--- a/sonoff/language/fr-FR.h
+++ b/sonoff/language/fr-FR.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/he-HE.h b/sonoff/language/he-HE.h
index 5fdcc93e3..b551de296 100644
--- a/sonoff/language/he-HE.h
+++ b/sonoff/language/he-HE.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/hu-HU.h b/sonoff/language/hu-HU.h
index 0bcb1da05..81f1d080a 100644
--- a/sonoff/language/hu-HU.h
+++ b/sonoff/language/hu-HU.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h
index f1183d090..1c6390cc2 100644
--- a/sonoff/language/it-IT.h
+++ b/sonoff/language/it-IT.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/ko-KO.h b/sonoff/language/ko-KO.h
index 5b99924bb..0f628e04e 100644
--- a/sonoff/language/ko-KO.h
+++ b/sonoff/language/ko-KO.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h
index b8b0c1e88..d79a419b2 100644
--- a/sonoff/language/nl-NL.h
+++ b/sonoff/language/nl-NL.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h
index d3a7712b9..8e374437f 100644
--- a/sonoff/language/pl-PL.h
+++ b/sonoff/language/pl-PL.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/pt-BR.h b/sonoff/language/pt-BR.h
index 209738d81..831d79d03 100644
--- a/sonoff/language/pt-BR.h
+++ b/sonoff/language/pt-BR.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/pt-PT.h b/sonoff/language/pt-PT.h
index f9debe83b..970fb2b8a 100644
--- a/sonoff/language/pt-PT.h
+++ b/sonoff/language/pt-PT.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/ru-RU.h b/sonoff/language/ru-RU.h
index 7306b1820..474d7f254 100644
--- a/sonoff/language/ru-RU.h
+++ b/sonoff/language/ru-RU.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "А"
diff --git a/sonoff/language/sk-SK.h b/sonoff/language/sk-SK.h
index d462ecfac..092661890 100644
--- a/sonoff/language/sk-SK.h
+++ b/sonoff/language/sk-SK.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/sv-SE.h b/sonoff/language/sv-SE.h
index a903db1f9..16d5110be 100644
--- a/sonoff/language/sv-SE.h
+++ b/sonoff/language/sv-SE.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/tr-TR.h b/sonoff/language/tr-TR.h
index 7e23b9d4d..e17623637 100755
--- a/sonoff/language/tr-TR.h
+++ b/sonoff/language/tr-TR.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/sonoff/language/uk-UK.h b/sonoff/language/uk-UK.h
index dd694ff85..92b3711fd 100644
--- a/sonoff/language/uk-UK.h
+++ b/sonoff/language/uk-UK.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "А"
diff --git a/sonoff/language/zh-CN.h b/sonoff/language/zh-CN.h
index 8b1464b33..872c13563 100644
--- a/sonoff/language/zh-CN.h
+++ b/sonoff/language/zh-CN.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "安"
diff --git a/sonoff/language/zh-TW.h b/sonoff/language/zh-TW.h
index 8fa61ed9e..4d26109fa 100644
--- a/sonoff/language/zh-TW.h
+++ b/sonoff/language/zh-TW.h
@@ -617,6 +617,8 @@
#define D_SENSOR_A4988_MS3 "A4988 MS3"
#define D_SENSOR_DDS2382_TX "DDS238-2 Tx"
#define D_SENSOR_DDS2382_RX "DDS238-2 Rx"
+#define D_SENSOR_DDSU666_TX "DDSU666 Tx"
+#define D_SENSOR_DDSU666_RX "DDSU666 Rx"
// Units
#define D_UNIT_AMPERE "安"
diff --git a/sonoff/my_user_config.h b/sonoff/my_user_config.h
index 2310df0d2..e13a666e5 100644
--- a/sonoff/my_user_config.h
+++ b/sonoff/my_user_config.h
@@ -447,6 +447,8 @@
//#define USE_SOLAX_X1 // Add support for Solax X1 series Modbus log info (+4k1 code)
#define SOLAXX1_SPEED 9600 // Solax X1 Modbus RS485 serial speed (default: 9600 baud)
#define SOLAXX1_PV2 // Solax X1 using second PV
+//#define USE_DDSU666 // Add support for Chint DDSU666 Modbus energy monitor (+0k6 code)
+ #define DDSU666_SPEED 9600 // Chint DDSU666 Modbus RS485 serial speed (default: 9600 baud)
// -- Low level interface devices -----------------
#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor (1k6 code)
diff --git a/sonoff/sonoff_post.h b/sonoff/sonoff_post.h
index 3a792f569..eceb972a0 100644
--- a/sonoff/sonoff_post.h
+++ b/sonoff/sonoff_post.h
@@ -165,6 +165,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c
#define USE_SDM120_2 // Add support for Eastron SDM120-Modbus energy monitor (+1k1 code)
#define USE_SDM630_2 // Add support for Eastron SDM630-Modbus energy monitor (+0k6 code)
#define USE_DDS2382 // Add support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
+#define USE_DDSU666 // Add support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#define USE_MAX31855 // Add support for MAX31855 K-Type thermocouple sensor using softSPI
@@ -251,6 +252,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c
#undef USE_SDM120_2 // Disable support for Eastron SDM120-Modbus energy meter
#undef USE_SDM630_2 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code)
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
+#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
@@ -305,6 +307,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c
#undef USE_SDM120_2 // Disable support for Eastron SDM120-Modbus energy meter
#undef USE_SDM630_2 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code)
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
+ #undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_EMULATION // Disable Belkin WeMo and Hue Bridge emulation for Alexa (-16k code, -2k mem)
#undef USE_DOMOTICZ // Disable Domoticz
#undef USE_HOME_ASSISTANT // Disable Home Assistant
@@ -388,6 +391,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c
#undef USE_SDM120_2 // Disable support for Eastron SDM120-Modbus energy meter
#undef USE_SDM630_2 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code)
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
+#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
//#define USE_DHT // Add support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
@@ -484,6 +488,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c
#undef USE_SDM120_2 // Disable support for Eastron SDM120-Modbus energy meter
#undef USE_SDM630_2 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code)
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
+#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
@@ -568,6 +573,7 @@ char* ToHex_P(const unsigned char * in, size_t insz, char * out, size_t outsz, c
#undef USE_SDM120_2 // Disable support for Eastron SDM120-Modbus energy meter
#undef USE_SDM630_2 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code)
#undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code)
+#undef USE_DDSU666 // Disable support for Chint DDSU666 Modbus energy monitor (+0k6 code)
#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor
#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI
diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h
index e0f3c6e06..6781e607f 100644
--- a/sonoff/sonoff_template.h
+++ b/sonoff/sonoff_template.h
@@ -202,6 +202,8 @@ enum UserSelectablePins {
GPIO_A4988_MS3, // A4988 microstep pin3
GPIO_DDS2382_TX, // DDS2382 Serial interface
GPIO_DDS2382_RX, // DDS2382 Serial interface
+ GPIO_DDSU666_TX, // DDSU666 Serial interface
+ GPIO_DDSU666_RX, // DDSU666 Serial interface
GPIO_SENSOR_END };
// Programmer selectable GPIO functionality
@@ -277,6 +279,7 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_IBEACON_TX "|" D_SENSOR_IBEACON_RX "|"
D_SENSOR_A4988_DIR "|" D_SENSOR_A4988_STP "|" D_SENSOR_A4988_ENA "|" D_SENSOR_A4988_MS1 "|" D_SENSOR_A4988_MS2 "|" D_SENSOR_A4988_MS3 "|"
D_SENSOR_DDS2382_TX "|" D_SENSOR_DDS2382_RX "|"
+ D_SENSOR_DDSU666_TX "|" D_SENSOR_DDSU666_RX "|"
;
// User selectable ADC0 functionality
@@ -645,6 +648,10 @@ const uint8_t kGpioNiceList[] PROGMEM = {
GPIO_SOLAXX1_TX, // Solax Inverter tx pin
GPIO_SOLAXX1_RX, // Solax Inverter rx pin
#endif
+#ifdef USE_DDSU666
+ GPIO_DDSU666_TX, // DDSU666 Serial interface
+ GPIO_DDSU666_RX, // DDSU666 Serial interface
+#endif // USE_DDSU666
#ifdef USE_SERIAL_BRIDGE
GPIO_SBR_TX, // Serial Bridge Serial interface
diff --git a/sonoff/support_features.ino b/sonoff/support_features.ino
index 999850db3..30403e6c3 100644
--- a/sonoff/support_features.ino
+++ b/sonoff/support_features.ino
@@ -459,7 +459,9 @@ void GetFeatures(void)
#ifdef USE_PCF8574
feature5 |= 0x00000200; // Xdrv_028_pcf8574.ino
#endif
-// feature5 |= 0x00000400;
+#ifdef USE_DDSU666
+ feature5 |= 0x00000400; // Xnrg_11_ddsu666.ino
+#endif
// feature5 |= 0x00000800;
// feature5 |= 0x00001000;
diff --git a/sonoff/xnrg_11_ddsu666.ino b/sonoff/xnrg_11_ddsu666.ino
new file mode 100644
index 000000000..2f6dfbf36
--- /dev/null
+++ b/sonoff/xnrg_11_ddsu666.ino
@@ -0,0 +1,175 @@
+/*
+ xnrg_11_ddsu666.ino - Chint DDSU666-Modbus energy meter support for Sonoff-Tasmota
+
+ Copyright (C) 2019 Pablo Zerón and Theo Arends
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifdef USE_ENERGY_SENSOR
+#ifdef USE_DDSU666
+/*********************************************************************************************\
+ * Chint DDSU666 Modbus energy meter
+\*********************************************************************************************/
+
+#define XNRG_11 11
+
+// can be user defined in my_user_config.h
+#ifndef DDSU666_SPEED
+ #define DDSU666_SPEED 9600 // default DDSU66 Modbus address
+#endif
+// can be user defined in my_user_config.h
+#ifndef DDSU666_ADDR
+ #define DDSU666_ADDR 1 // default DDSU66 Modbus address
+#endif
+
+#include
+TasmotaModbus *Ddsu666Modbus;
+
+const uint16_t Ddsu666_start_addresses[] {
+ 0x2000, // DDSU666_VOLTAGE [V]
+ 0x2002, // DDSU666_CURRENT [A]
+ 0x2004, // DDSU666_POWER [KW]
+ 0x2006, // DDSU666_REACTIVE_POWER [KVAR]
+ 0x200A, // DDSU666_POWER_FACTOR
+ 0x200E, // DDSU666_FREQUENCY [Hz]
+ 0X4000, // DDSU666_IMPORT_ACTIVE [kWh]
+ 0X400A, // DDSU666_EXPORT_ACTIVE [kWh]
+};
+
+struct DDSU666 {
+ float import_active = NAN;
+ uint8_t read_state = 0;
+ uint8_t send_retry = 0;
+} Ddsu666;
+
+/*********************************************************************************************/
+
+void DDSU666Every250ms(void)
+{
+ bool data_ready = Ddsu666Modbus->ReceiveReady();
+
+ if (data_ready) {
+ uint8_t buffer[14]; // At least 5 + (2 * 2) = 9
+
+ uint32_t error = Ddsu666Modbus->ReceiveBuffer(buffer, 2);
+ AddLogBuffer(LOG_LEVEL_DEBUG_MORE, buffer, Ddsu666Modbus->ReceiveCount());
+
+ if (error) {
+ AddLog_P2(LOG_LEVEL_DEBUG, PSTR("SDM: Ddsu666 error %d"), error);
+ } else {
+ Energy.data_valid[0] = 0;
+
+ // 0 1 2 3 4 5 6 7 8
+ // SA FC BC Fh Fl Sh Sl Cl Ch
+ // 01 04 04 43 66 33 34 1B 38 = 230.2 Volt
+ float value;
+ ((uint8_t*)&value)[3] = buffer[3]; // Get float values
+ ((uint8_t*)&value)[2] = buffer[4];
+ ((uint8_t*)&value)[1] = buffer[5];
+ ((uint8_t*)&value)[0] = buffer[6];
+
+ switch(Ddsu666.read_state) {
+ case 0:
+ Energy.voltage[0] = value; // 230.2 V
+ break;
+
+ case 1:
+ Energy.current[0] = value; // 1.260 A
+ break;
+
+ case 2:
+ Energy.active_power[0] = value * 1000; // -196.3 W
+ break;
+
+ case 3:
+ Energy.reactive_power[0] = value * 1000; // 92.2
+ break;
+
+ case 4:
+ Energy.power_factor[0] = value; // 0.91
+ break;
+
+ case 5:
+ Energy.frequency[0] = value; // 50.0 Hz
+ break;
+
+ case 6:
+ Ddsu666.import_active = value; // 478.492 kWh
+ break;
+
+ case 7:
+ Energy.export_active = value; // 6.216 kWh
+ break;
+ }
+
+ Ddsu666.read_state++;
+
+ if (Ddsu666.read_state == 8) {
+ Ddsu666.read_state = 0;
+ EnergyUpdateTotal(Ddsu666.import_active, true); // 484.708 kWh
+ }
+ }
+ } // end data ready
+
+ if (0 == Ddsu666.send_retry || data_ready) {
+ Ddsu666.send_retry = 5;
+ Ddsu666Modbus->Send(DDSU666_ADDR, 0x04, Ddsu666_start_addresses[Ddsu666.read_state], 2);
+ } else {
+ Ddsu666.send_retry--;
+ }
+}
+
+void Ddsu666SnsInit(void)
+{
+ Ddsu666Modbus = new TasmotaModbus(pin[GPIO_DDSU666_RX], pin[GPIO_DDSU666_TX]);
+ uint8_t result = Ddsu666Modbus->Begin(DDSU666_SPEED);
+ if (result) {
+ if (2 == result) { ClaimSerial(); }
+ } else {
+ energy_flg = ENERGY_NONE;
+ }
+}
+
+void Ddsu666DrvInit(void)
+{
+ if ((pin[GPIO_DDSU666_RX] < 99) && (pin[GPIO_DDSU666_TX] < 99)) {
+ energy_flg = XNRG_11;
+ }
+}
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+bool Xnrg11(uint8_t function)
+{
+ bool result = false;
+
+ switch (function) {
+ case FUNC_EVERY_250_MSECOND:
+ if (uptime > 4) { DDSU666Every250ms(); }
+ break;
+ case FUNC_INIT:
+ Ddsu666SnsInit();
+ break;
+ case FUNC_PRE_INIT:
+ Ddsu666DrvInit();
+ break;
+ }
+ return result;
+}
+
+#endif // USE_DDSU666
+#endif // USE_ENERGY_SENSOR
diff --git a/tools/decode-status.py b/tools/decode-status.py
index a08689306..3d35f1147 100755
--- a/tools/decode-status.py
+++ b/tools/decode-status.py
@@ -171,7 +171,7 @@ a_features = [[
],[
"USE_BUZZER","USE_RDM6300","USE_IBEACON","USE_SML_M",
"USE_INA226","USE_A4988_Stepper","USE_DDS2382","USE_SM2135",
- "USE_SHUTTER","USE_PCF8574","","",
+ "USE_SHUTTER","USE_PCF8574","USE_DDSU666","",
"","","","",
"","","","",
"","","","",