From f861e8330a8ee314573cb0e1a5c01063f35ee54d Mon Sep 17 00:00:00 2001 From: barbudor Date: Sat, 29 Oct 2022 21:38:22 +0200 Subject: [PATCH] dingtian driver take 1 --- tasmota/include/tasmota_template.h | 11 + tasmota/language/af_AF.h | 5 + tasmota/language/bg_BG.h | 5 + tasmota/language/ca_AD.h | 5 + tasmota/language/cs_CZ.h | 5 + tasmota/language/de_DE.h | 5 + tasmota/language/el_GR.h | 5 + tasmota/language/en_GB.h | 5 + tasmota/language/es_ES.h | 5 + tasmota/language/fr_FR.h | 5 + tasmota/language/fy_NL.h | 5 + tasmota/language/he_HE.h | 5 + tasmota/language/hu_HU.h | 5 + tasmota/language/it_IT.h | 5 + tasmota/language/ko_KO.h | 5 + tasmota/language/nl_NL.h | 5 + tasmota/language/pl_PL.h | 5 + tasmota/language/pt_BR.h | 5 + tasmota/language/pt_PT.h | 5 + tasmota/language/ro_RO.h | 5 + tasmota/language/ru_RU.h | 5 + tasmota/language/sk_SK.h | 5 + tasmota/language/sv_SE.h | 5 + tasmota/language/tr_TR.h | 5 + tasmota/language/uk_UA.h | 5 + tasmota/language/vi_VN.h | 5 + tasmota/language/zh_CN.h | 5 + tasmota/language/zh_TW.h | 5 + .../xdrv_90_dingtian_relay.ino | 208 ++++++++++++++++++ 29 files changed, 354 insertions(+) create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_90_dingtian_relay.ino diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h index 869e92a8c..64da087d2 100644 --- a/tasmota/include/tasmota_template.h +++ b/tasmota/include/tasmota_template.h @@ -198,6 +198,7 @@ enum UserSelectablePins { GPIO_ADE7953_RST, // ADE7953 Reset GPIO_NRG_MBS_TX, GPIO_NRG_MBS_RX, // Generic Energy Modbus device GPIO_ADE7953_CS, // ADE7953 SPI Chip Select + GPIO_DINGTIAN_CLK, GPIO_DINGTIAN_SDI, GPIO_DINGTIAN_Q7, GPIO_DINGTIAN_PL, GPIO_DINGTIAN_RCK, // Dingtian relay board - 595's & 165's pins GPIO_SENSOR_END }; // Error as warning to rethink GPIO usage with max 2045 @@ -443,6 +444,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_ADE7953_RST "|" D_SENSOR_NRG_MBS_TX "|" D_SENSOR_NRG_MBS_RX "|" D_SENSOR_ADE7953_CS "|" + D_GPIO_DINGTIAN_CLK "|" D_GPIO_DINGTIAN_SDI "|" D_GPIO_DINGTIAN_Q7 "|" D_GPIO_DINGTIAN_PL "|" D_GPIO_DINGTIAN_RCK "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -457,6 +459,7 @@ const char kSensorNamesFixed[] PROGMEM = #define MAX_SM2135_DAT 10 #define MAX_SM2335_DAT 16 #define MAX_DSB 4 +#define MAX_DINGTIAN_SHIFT 4 const uint16_t kGpioNiceList[] PROGMEM = { GPIO_NONE, // Not used @@ -1097,6 +1100,14 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_SHIFT595_OE), AGPIO(GPIO_SHIFT595_SER), #endif + +#if defined (ESP32) && defined(USE_DINGTIAN_RELAY) + AGPIO(GPIO_DINGTIAN_CLK) + MAX_DINGTIAN_SHIFT, // Dingtian Relay board - 8,16,24 or 32 relays & inputs + AGPIO(GPIO_DINGTIAN_SDI), + AGPIO(GPIO_DINGTIAN_Q7), + AGPIO(GPIO_DINGTIAN_PL), + AGPIO(GPIO_DINGTIAN_RCK), +#endif }; /*-------------------------------------------------------------------------------------------*\ diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 58b48a17a..3f1be7cb8 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 968746cd4..906634768 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Дебитомер" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 26bafafd8..298302d63 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Cabal" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 2d32dcc9a..9c610b11c 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 05f940706..7d17dc86a 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index d7cdbfe65..d08787942 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index ea85e0861..48e822ae2 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index fa8dd2b67..741a7a03f 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 3364ff482..f5882312e 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 1e1a25927..fe2966aad 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 4db4cc9ff..369ce1d51 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index d90312b00..03afbab60 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 99301cc0e..5a510d64f 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 - RCLK" #define D_GPIO_SHIFT595_OE "74x595 - OE" #define D_GPIO_SHIFT595_SER "74x595 - SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x - TX" #define D_SENSOR_CM11_RX "CM110x - RX" #define D_SENSOR_FLOWRATEMETER "Portata" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 5554f07a0..7a2e508f3 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 960a8fcf2..3853c69b7 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 1157da535..9eb7e64bf 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index fe96b16b8..8ea175cca 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 3607f8252..c9bc5153b 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index f51f0d07a..0d8cca5bc 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index d45530605..2354947c0 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 945bd72c1..1afb86018 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index ffc3e2764..3b80797ad 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index a19995a43..7f5ffac7e 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 8e832b9d8..510a975fb 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index f87ba1029..8e0837bd0 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 348718091..26b7aa758 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 50c8c5dfb..2ecde2dce 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -893,6 +893,11 @@ #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" +#define D_GPIO_DINGTIAN_CLK "Dingtian CLK" +#define D_GPIO_DINGTIAN_SDI "Dingtian SDI" +#define D_GPIO_DINGTIAN_Q7 "Dingtian Q7" +#define D_GPIO_DINGTIAN_PL "Dingtian PL" +#define D_GPIO_DINGTIAN_RCK "Dingtian RCK" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" #define D_SENSOR_FLOWRATEMETER "Flowrate" diff --git a/tasmota/tasmota_xdrv_driver/xdrv_90_dingtian_relay.ino b/tasmota/tasmota_xdrv_driver/xdrv_90_dingtian_relay.ino new file mode 100644 index 000000000..d198f2cc5 --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_90_dingtian_relay.ino @@ -0,0 +1,208 @@ +/* + xdrv_90_dingtian_relay.ino - Dingtian 8, 16, 24 and 32 relays board based on 74x595+74x165 + + Copyright (C) 2021 Barbudor + + 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 ESP32 +#ifdef USE_DINGTIAN_RELAY + +#define XDRV_90 90 + +/******************************************************************************************************** + * Global private data + */ + +struct DINGTIAN_DATA { + uint32_t outputs; // keep ouputs state + uint32_t last_inputs; // previous inputs state + uint8_t count; // number of relay and input (8 * numver of shift registers) + uint8_t first; // index of 1st Tasmota relay assigned to 1st Dingtian relays + // pins + uint8_t pin_clk, pin_sdi, pin_q7, pin_pl, pin_rck; +} *Dingtian = nullptr; + + +/******************************************************************************************************** + * Low level operations + */ + +uint32_t DingtianReadWrite(uint32_t outputs) +{ + uint32_t inputs = 0; + uint32_t in_bit = 1; + + // setup + digitalWrite(Dingtian->pin_rck, 0); // rclk and clkinh to 0 + digitalWrite(Dingtian->pin_pl, 1); // load inputs in '165, ready for shift-in (side effect '595 in tri-state) + for ( int i = Dingtian->count ; i > 0 ; i-- ) { + // relay out to '595 + digitalWrite(Dingtian->pin_sdi, outputs & 1); + outputs >>= 1; + // input from '165 + inputs |= digitalRead(Dingtian->pin_q7) ? in_bit : 0; + in_bit <<= 1; + // generate CLK pulse + digitalWrite(Dingtian->pin_clk, 1); + digitalWrite(Dingtian->pin_clk, 0); + } + // ending + digitalWrite(Dingtian->pin_rck, 1); // rclk pulse to load '595 into output registers + digitalWrite(Dingtian->pin_pl, 0); // re-enable '595 ouputs + + return inputs; +} + +/******************************************************************************************************** + * Driver initialisation + */ + +#define DINGTIAN_SET_OUTPUT(pin,value) { pinMode((pin), OUTPUT); digitalWrite((pin), (value)); } +#define DINGTIAN_SET_INPUT(pin) { pinMode((pin), INPUT); } + +void DingtianInit(void) { + if (PinUsed(GPIO_DINGTIAN_CLK, GPIO_ANY) && PinUsed(GPIO_DINGTIAN_SDI) && PinUsed(GPIO_DINGTIAN_Q7) + && PinUsed(GPIO_DINGTIAN_PL) && PinUsed(GPIO_DINGTIAN_RCK)) { + // allocate Dingtian data structure + Dingtian = (struct DINGTIAN_DATA*)calloc(1, sizeof(struct DINGTIAN_DATA)); + if (Dingtian) { + // get pins + Dingtian->pin_clk = Pin(GPIO_DINGTIAN_CLK, GPIO_ANY); // shift clock : 595's SCLK & 165's CLK + Dingtian->pin_sdi = Pin(GPIO_DINGTIAN_SDI); // Serial out : 595's SER + Dingtian->pin_q7 = Pin(GPIO_DINGTIAN_Q7); // Serial in : 165's Q7 + Dingtian->pin_pl = Pin(GPIO_DINGTIAN_PL); // Input load : 595's nOE & 165's PL (or SH/LD on some datasheet) + Dingtian->pin_rck = Pin(GPIO_DINGTIAN_RCK); // Output load : 595's RCLK & 165's CLKINH + // number of shift registers is the CLK index + Dingtian->count = ((GetPin(Dingtian->pin_clk) - AGPIO(GPIO_DINGTIAN_CLK)) + 1) * 8; + + AddLog(LOG_LEVEL_DEBUG, PSTR("DNGT: clk:%d, sdi:%d, q7:%d, pl:%d, rck:%d, count:%d"), + Dingtian->pin_clk, Dingtian->pin_sdi, Dingtian->pin_q7, Dingtian->pin_pl, Dingtian->pin_rck, Dingtian->count); + + DINGTIAN_SET_OUTPUT(Dingtian->pin_clk, 0); + DINGTIAN_SET_OUTPUT(Dingtian->pin_sdi, 0); + DINGTIAN_SET_INPUT( Dingtian->pin_q7); + DINGTIAN_SET_OUTPUT(Dingtian->pin_pl, 0); + DINGTIAN_SET_OUTPUT(Dingtian->pin_rck, 0); + + Dingtian->first = TasmotaGlobal.devices_present; + TasmotaGlobal.devices_present += Dingtian->count; + AddLog(LOG_LEVEL_DEBUG, PSTR("DNGT: Dingtian relays: POWER%d to POWER%d"), Dingtian->first + 1, Dingtian->first + Dingtian->count); + } + } +} + +/******************************************************************************************************** + * Driver operations + */ + +void DingtianLoop() +{ + uint32_t inputs = DingtianReadWrite(Dingtian->outputs); + uint32_t last_inputs = Dingtian->last_inputs; + Dingtian->last_inputs = inputs; + if (inputs != last_inputs) { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DNGT: inputs=0x%08X, last=0x%08X"), inputs, last_inputs); + bool first_done = false; + ResponseTime_P(PSTR(",\"DINGTIAN_CHG\":{")); + for (int i = 0 ; i < Dingtian->count ; i++, last_inputs>>=1, inputs>>=1) { + if ((last_inputs & 1) != (inputs & 1)) { + if (first_done) ResponseAppend_P(PSTR(",")); + ResponseAppend_P(PSTR("\"IN%d\":%d"), i +1, (inputs & 1)); + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("\"IN%d\":%d"), i +1, (inputs & 1)); + first_done = true; + } + } + ResponseAppend_P(PSTR("}}")); + if (first_done) { + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR("DINGTIAN_CHG")); + } + } +} + +void DingtianSetPower(void) +{ + // store relay status in structure + Dingtian->outputs = (XdrvMailbox.index >> Dingtian->first) & ~(0xFFFF << Dingtian->count); + //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DNGT: outputs=0x%08X"), Dingtian->outputs); + //DingtianLoop(); +} + +/******************************************************************************************************** + * Driver Results + */ + +const char HTTP_DINGTIAN_INPUTS[] PROGMEM = "{s}DINGTIAN " D_SENSOR_INPUT "%d.." D_SENSOR_INPUT "%d{m}%s{e}"; + +void DingtianShow(bool json) +{ + if (json) { + bool first_done = false; + ResponseAppend_P(PSTR(",\"DINGTIAN\":{")); + for (int i = 0 ; i < Dingtian->count ; i++) { + if (first_done) ResponseAppend_P(PSTR(",")); + ResponseAppend_P(PSTR("\"IN%d\":%d"), i +1, bitRead(Dingtian->last_inputs, i)); + first_done = true; + } + ResponseAppend_P(PSTR("}")); + } +#ifdef USE_WEBSERVER + else { + char input_str[9]; + for (int block_input = 0 ; block_input < Dingtian->count ; block_input += 8 ) { + for (int i = 0 ; i < 8 ; i++ ) + input_str[i] = '0' + bitRead(Dingtian->last_inputs, block_input +i); + input_str[8] = '\0'; + WSContentSend_P(HTTP_DINGTIAN_INPUTS, block_input, block_input +7, input_str); + } + } +#endif +} + + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv90(uint8_t function) { + bool result = false; + + if (FUNC_PRE_INIT == function) { + DingtianInit(); + } else if (Dingtian) { + switch (function) { + case FUNC_SET_POWER: + DingtianSetPower(); + break; + //case FUNC_EVERY_50_MSECOND: + case FUNC_EVERY_250_MSECOND: + DingtianLoop(); + break; + case FUNC_JSON_APPEND: + DingtianShow(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + DingtianShow(0); + break; +#endif // USE_WEBSERVER + + } + } + return result; +} + +#endif // USE_DINGTIAN_RELAY +#endif // ESP32