From 1bf69fd3108a0ca10d4271375d759c78c191b14f Mon Sep 17 00:00:00 2001
From: eeak
Date: Fri, 28 Oct 2022 17:08:02 +0300
Subject: [PATCH 1/7] dali
---
tasmota/include/tasmota_template.h | 11 +
tasmota/language/af_AF.h | 7 +
tasmota/language/bg_BG.h | 7 +
tasmota/language/ca_AD.h | 7 +
tasmota/language/cs_CZ.h | 7 +
tasmota/language/de_DE.h | 7 +
tasmota/language/el_GR.h | 7 +
tasmota/language/en_GB.h | 7 +
tasmota/language/es_ES.h | 7 +
tasmota/language/fr_FR.h | 7 +
tasmota/language/fy_NL.h | 7 +
tasmota/language/he_HE.h | 7 +
tasmota/language/hu_HU.h | 7 +
tasmota/language/it_IT.h | 7 +
tasmota/language/ko_KO.h | 7 +
tasmota/language/nl_NL.h | 7 +
tasmota/language/pl_PL.h | 7 +
tasmota/language/pt_BR.h | 7 +
tasmota/language/pt_PT.h | 7 +
tasmota/language/ro_RO.h | 7 +
tasmota/language/ru_RU.h | 7 +
tasmota/language/sk_SK.h | 7 +
tasmota/language/sv_SE.h | 7 +
tasmota/language/tr_TR.h | 7 +
tasmota/language/uk_UA.h | 7 +
tasmota/language/vi_VN.h | 7 +
tasmota/language/zh_CN.h | 7 +
tasmota/language/zh_TW.h | 7 +
.../xdrv_89_esp32_dali.ino | 643 ++++++++++++++++++
29 files changed, 843 insertions(+)
create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h
index 869e92a8c..76977bde0 100644
--- a/tasmota/include/tasmota_template.h
+++ b/tasmota/include/tasmota_template.h
@@ -198,6 +198,9 @@ 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
+#ifdef ESP32
+ GPIO_DALI_RX, GPIO_DALI_TX, // Dali
+#endif
GPIO_SENSOR_END };
// Error as warning to rethink GPIO usage with max 2045
@@ -443,6 +446,9 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_ADE7953_RST "|"
D_SENSOR_NRG_MBS_TX "|" D_SENSOR_NRG_MBS_RX "|"
D_SENSOR_ADE7953_CS "|"
+#ifdef ESP32
+ D_SENSOR_DALI_RX "|" D_SENSOR_DALI_TX "|"
+#endif
;
const char kSensorNamesFixed[] PROGMEM =
@@ -527,6 +533,11 @@ const uint16_t kGpioNiceList[] PROGMEM = {
* Protocol specifics
\*-------------------------------------------------------------------------------------------*/
+#if defined(USE_DALI) && defined(ESP32)
+ AGPIO(GPIO_DALI_RX), // DALI RX
+ AGPIO(GPIO_DALI_TX), // DALI TX
+#endif // USE_DALI
+
#ifdef USE_I2C
AGPIO(GPIO_I2C_SCL) + MAX_I2C, // I2C SCL
AGPIO(GPIO_I2C_SDA) + MAX_I2C, // I2C SDA
diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h
index 58b48a17a..39dc3126b 100644
--- a/tasmota/language/af_AF.h
+++ b/tasmota/language/af_AF.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM gevind by adres"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Ewekansige Zigbee parameters, kyk asseblief met 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energie Vandag"
#define D_ENERGY_YESTERDAY "Energie Gister"
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 968746cd4..21ecbce73 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Консумация за днес"
#define D_ENERGY_YESTERDAY "Консумация за вчера"
diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h
index 26bafafd8..01cf177b1 100644
--- a/tasmota/language/ca_AD.h
+++ b/tasmota/language/ca_AD.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energy Today"
#define D_ENERGY_YESTERDAY "Energy Yesterday"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index 2d32dcc9a..f1fea69ec 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Spotřeba Dnes"
#define D_ENERGY_YESTERDAY "Spotřeba Včera"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index 05f940706..df8a827b1 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM gefunden an Adresse"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Zufällige Zigbee Parameter erstellt, Überprüfung mit 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energie heute"
#define D_ENERGY_YESTERDAY "Energie gestern"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index d7cdbfe65..0d7500450 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Ενέργεια σήμερα"
#define D_ENERGY_YESTERDAY "Ενέργεια χθες"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index ea85e0861..d59a97f01 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energy Today"
#define D_ENERGY_YESTERDAY "Energy Yesterday"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index fa8dd2b67..b75beec9a 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "Encontrada EEPROM de ZBBridge en"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Configurando parámetros Zigbee de forma aleatoria. Usar 'ZbConfig' para revisarlos."
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energía Hoy"
#define D_ENERGY_YESTERDAY "Energía Ayer"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index 3364ff482..5f3eac5a3 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "EEPROM ZBBridge trouvée à l'adresse"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomisation des paramètres ZigBee, veuillez vérifier avec 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xsns_03_energy.ino
#define D_ENERGY_TODAY "Énergie aujourd'hui"
#define D_ENERGY_YESTERDAY "Énergie hier"
diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h
index 1e1a25927..a5f22689a 100644
--- a/tasmota/language/fy_NL.h
+++ b/tasmota/language/fy_NL.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM fûn op adres"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, kontrolearje asjebleaft mei 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Konsumpsje hjoed"
#define D_ENERGY_YESTERDAY "Konsumpsje juster"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index 4db4cc9ff..31d969f78 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "צריכה יומית"
#define D_ENERGY_YESTERDAY "צריכה בעבר"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index d90312b00..c2204ea65 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM található a címen"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Zigbee paramétereknek véletlennek kell lenniük, ellenőrizd a 'ZbConfig'-gal"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Mai energia"
#define D_ENERGY_YESTERDAY "Tegnapi energia"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 99301cc0e..5db1e1220 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "Trovata EEPROM ZBBridge all'indirizzo"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizzazione parametri Zigbee, controlla con \"ZbConfig\""
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energia - oggi"
#define D_ENERGY_YESTERDAY "Energia - ieri"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index 5554f07a0..7e85879cc 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "금일 전력 사용량"
#define D_ENERGY_YESTERDAY "어제 전력 사용량"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index 960a8fcf2..f2355a709 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM aanwezig op adres"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Willekeurige Zigbee parameters gemaakt, controleer met 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Verbruik vandaag"
#define D_ENERGY_YESTERDAY "Verbruik gisteren"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index 1157da535..c523cec6f 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "Znaleziono ZBBridge EEPROM na adresie"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Losowanie parametrów Zigbee, proszę sprawdzić 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energia dzisiaj"
#define D_ENERGY_YESTERDAY "Energia wczoraj"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index fe96b16b8..b87b1a618 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "EEPROM ZBBridge encontrada no endereço" // "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizando parametros Zigbee, por favor congira em 'ZbConfig'" // "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Consumo energético de hoje"
#define D_ENERGY_YESTERDAY "Consumo energético de ontem"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index 3607f8252..c050785fa 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM encontrada no edereço"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomização de parâmetros Zigbee, por-favor verifique a 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Consumo energético de hoje"
#define D_ENERGY_YESTERDAY "Consumo energético de ontem"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index f51f0d07a..77ca813dc 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energia de Azi"
#define D_ENERGY_YESTERDAY "Energia de Ieri"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index d45530605..fd9c3a7ee 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Конфигурация DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Энергия Сегодня"
#define D_ENERGY_YESTERDAY "Энергия Вчера"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index 945bd72c1..8b1f107df 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Spotreba dnes"
#define D_ENERGY_YESTERDAY "Spotreba včera"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index ffc3e2764..a603635c3 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energi idag"
#define D_ENERGY_YESTERDAY "Energi igår"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index a19995a43..4c6d46b49 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energy Today"
#define D_ENERGY_YESTERDAY "Energy Yesterday"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index 8e832b9d8..1a6f34161 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Енергія Сьогодні"
#define D_ENERGY_YESTERDAY "Енергія Вчора"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index f87ba1029..7416d1dae 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Năng lượng tiêu thụ hôm nay"
#define D_ENERGY_YESTERDAY "Năng lượng tiêu thụ hôm qua"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index 348718091..4f93019fc 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "找到 ZBBridge EEPROM, 地址:"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "正在随机化 Zigbee 参数, 请通过 'ZbConfig' 检查"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "今日用电量"
#define D_ENERGY_YESTERDAY "昨日用电量"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 50c8c5dfb..641f8192c 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -511,6 +511,13 @@
#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM found at address"
#define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Randomizing Zigbee parameters, please check with 'ZbConfig'"
+// xdrv_89_dali.ino
+#define D_SENSOR_DALI_RX "Dali RX"
+#define D_SENSOR_DALI_TX "Dali TX"
+#define D_CONFIGURE_DALI "Config DALI"
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "今日用電量"
#define D_ENERGY_YESTERDAY "昨日用電量"
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
new file mode 100644
index 000000000..222f91bac
--- /dev/null
+++ b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
@@ -0,0 +1,643 @@
+/*
+ xdrv_89_esp32_dali.ino - DALI support for Tasmota
+
+ Copyright (C) 2022 Andrei Kazmirtsuk aka eeak
+
+ 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 .
+
+ --------------------------------------------------------------------------------------------
+ Version yyyymmdd Action Description
+ --------------------------------------------------------------------------------------------
+ 0.0.0.1 20221027 publish - initial version
+*/
+
+#ifdef ESP32
+#ifdef USE_DALI
+
+/*********************************************************************************************\
+ * DALI support for Tasmota
+\*********************************************************************************************/
+
+#define XDRV_89 89
+
+#define BROADCAST_DP 0b11111110 // 0xFE
+
+enum
+{
+ DALI_NO_ACTION,
+ DALI_SENDING_DATA,
+ DALI_RECEIVING_DATA,
+ DALI_ERROR
+};
+
+struct DALI {
+ bool present = false;
+} Dali;
+
+// http and json defines
+#define D_NAME_DALI "DALI"
+
+const char S_JSON_DALI_COMMAND_NVALUE[] PROGMEM = "{\"" D_NAME_DALI "\":{\"%s\":%d}}";
+const char kDALI_Commands[] PROGMEM = D_CMND_DALI_POWER "|" D_CMND_DALI_DIMMER;
+
+enum DALI_Commands { // commands for Console
+ CMND_DALI_PWR,
+ CMND_DALI_DIM,
+};
+
+/* Private variables ---------------------------------------------------------*/
+// Communication ports and pins
+bool DALIOUT_invert = false;
+bool DALIIN_invert = false;
+// Data variables
+uint16_t send_dali_data; // data to send to DALI bus
+uint16_t received_dali_data; // data received from DALI bus
+// Processing variables
+uint8_t flag; // DALI status flag
+uint8_t bit_count; // nr of rec/send bits
+uint16_t tick_count; // nr of ticks of the timer
+
+bool bit_value; // value of actual bit
+bool actual_val; // bit value in this tick of timer
+bool former_val; // bit value in previous tick of timer
+
+hw_timer_t *DALI_timer = NULL;
+
+/*********************************************************************************************\
+ * DALI low level
+\*********************************************************************************************/
+
+/**
+* @brief This function handles hardware timer Handler.
+* @param None
+* @retval None
+*/
+void IRAM_ATTR DALI_Tick_Handler(void)
+{
+ if (get_flag() == DALI_RECEIVING_DATA)
+ {
+ receive_tick();
+ }
+ else if (get_flag() == DALI_SENDING_DATA)
+ {
+ send_tick();
+ }
+}
+
+/**
+* @brief This function enable data transfer start interrupt.
+* @param None
+* @retval None
+*/
+void enableDaliRxInterrupt() {
+ flag = DALI_NO_ACTION;
+ timerAlarmDisable(DALI_timer);
+ attachInterrupt(Pin(GPIO_DALI_RX), receiveDaliData, FALLING);
+}
+
+/**
+* @brief This function disable data transfer start interrupt.
+* @param None
+* @retval None
+*/
+void disableRxInterrupt() {
+ timerAlarmEnable(DALI_timer);
+ detachInterrupt(Pin(GPIO_DALI_RX));
+}
+
+/**
+* @brief receiving flag status
+* @param None
+* @retval uint8_t flag
+*/
+uint8_t get_flag(void)
+{
+ return flag;
+}
+
+/**
+* @brief DALI data received callback
+* @param None
+* @retval uint8_t flag
+*/
+void DataReceivedCallback() {
+ AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: Received: %d %d"), received_dali_data>>9, received_dali_data&0xff);
+}
+
+/*************** R E C E I V E * P R O C E D U R E S *******/
+
+/**
+* @brief receive data from DALI bus
+* @param None
+* @retval None
+*/
+void receiveDaliData()
+{
+ // null variables
+ received_dali_data = 0;
+ bit_count = 0;
+ tick_count = 0;
+ former_val = true;
+
+ flag = DALI_RECEIVING_DATA;
+
+ disableRxInterrupt();
+}
+
+/**
+* @brief Get state of DALIIN pin
+* @param None
+* @retval bool status
+*/
+bool get_DALIIN(void)
+{
+ bool dali_read = digitalRead(Pin(GPIO_DALI_RX));
+ return (false == DALIIN_invert) ? dali_read : !dali_read;
+}
+
+/**
+* @brief receiving data from DALI bus
+* @param None
+* @retval None
+*
+* |--------|----|---------------------------|----|
+* 0 24 32 160 176
+* wait start data stop
+*/
+void receive_tick(void)
+{
+ // four ticks per bit
+ actual_val = get_DALIIN();
+ tick_count++;
+
+ // edge detected
+ if(actual_val != former_val)
+ {
+ switch(bit_count)
+ {
+ case 0:
+ if (tick_count > 2)
+ {
+ tick_count = 0;
+ bit_count = 1; // start bit
+ }
+ break;
+ case 17: // 1st stop bit
+ if(tick_count > 6) { // stop bit error, no edge should exist
+ flag = DALI_ERROR;
+ }
+ break;
+ default: // other bits
+ if(tick_count > 6)
+ {
+ received_dali_data |= (actual_val << (16-bit_count));
+ bit_count++;
+ tick_count = 0;
+ }
+ break;
+ }
+ }else // voltage level stable
+ {
+ switch(bit_count)
+ {
+ case 0:
+ if(tick_count==8) { // too long start bit
+ flag = DALI_ERROR;
+ Serial.println("Too long start bit.");
+ }
+ break;
+ case 17:
+ // First stop bit
+ if (tick_count==8)
+ {
+ if (actual_val==0) // wrong level of stop bit
+ {
+ flag = DALI_ERROR;
+ }
+ else
+ {
+ bit_count++;
+ tick_count = 0;
+ }
+ }
+ break;
+ case 18:
+ // Second stop bit
+ if (tick_count==8)
+ {
+ enableDaliRxInterrupt();
+ DataReceivedCallback();
+
+ }
+ break;
+ default: // normal bits
+ if(tick_count==10)
+ { // too long delay before edge
+ flag = DALI_ERROR;
+ }
+ break;
+ }
+ }
+ former_val = actual_val;
+ if(flag==DALI_ERROR)
+ {
+ enableDaliRxInterrupt();
+ }
+}
+
+
+/*************** S E N D * P R O C E D U R E S *************/
+
+/**
+* @brief Set value to the DALIOUT pin
+* @param bool
+* @retval None
+*/
+void set_DALIOUT(bool pin_value)
+{
+ digitalWrite(Pin(GPIO_DALI_TX), pin_value == DALIOUT_invert ? LOW : HIGH);
+}
+
+/**
+* @brief gets state of the DALIOUT pin
+* @param None
+* @retval bool state of the DALIOUT pin
+*/
+bool get_DALIOUT(void)
+{
+ bool dali_read = digitalRead(Pin(GPIO_DALI_TX));
+ return (false == DALIOUT_invert) ? dali_read : !dali_read;
+}
+
+/**
+* @brief Send data to DALI bus
+* @param byteToSend
+* @retval None
+*/
+void sendDaliData(uint8_t firstByte, uint8_t secondByte)
+{
+ send_dali_data = firstByte << 8;
+ send_dali_data += secondByte & 0xff;
+ bit_count = 0;
+ tick_count = 0;
+
+ flag = DALI_SENDING_DATA;
+
+ disableRxInterrupt();
+}
+
+/**
+* @brief DALI protocol physical layer for slave device
+* @param None
+* @retval None
+*
+* |--------|----|---------------------------|----|
+* 0 24 32 160 176
+* wait start data stop
+*/
+void send_tick(void)
+{
+ // access to the routine just every 4 ticks = every half bit
+ if ((tick_count & 0x03) == 0)
+ {
+ if (tick_count < 160)
+ {
+ // settling time between forward and backward frame
+ if (tick_count < 24)
+ {
+ tick_count++;
+ return;
+ }
+
+ // start of the start bit
+ if (tick_count == 24)
+ {
+ // GPIOB->ODR ^= GPIO_ODR_7;
+ set_DALIOUT(false);
+ tick_count++;
+ return;
+ }
+
+ // edge of the start bit
+ // 28 ticks = 28/9600 = 2,92ms = delay between forward and backward message frame
+ if (tick_count == 28)
+ {
+ set_DALIOUT(true);
+ tick_count++;
+ return;
+ }
+
+ // bit value (edge) selection
+ bit_value = (bool)((send_dali_data >> (15 - bit_count)) & 0x01);
+
+ // Every half bit -> Manchester coding
+ if (!((tick_count - 24) & 0x0007))
+ { // div by 8
+ if (get_DALIOUT() == bit_value) // former value of bit = new value of bit
+ set_DALIOUT((bool)(1 - bit_value));
+ }
+
+ // Generate edge for actual bit
+ if (!((tick_count - 28) & 0x0007))
+ {
+ set_DALIOUT(bit_value);
+ bit_count++;
+ }
+ }
+ else
+ { // end of data byte, start of stop bits
+ if (tick_count == 160)
+ {
+ set_DALIOUT(true); // start of stop bit
+ }
+
+ // end of stop bits, no settling time
+ if (tick_count == 176)
+ {
+ enableDaliRxInterrupt();
+ }
+ }
+ }
+ tick_count++;
+
+ return;
+}
+
+/***********************************************************/
+
+void DaliPreInit() {
+ if (!PinUsed(GPIO_DALI_TX) || !PinUsed(GPIO_DALI_RX)) { return; }
+ AddLog(LOG_LEVEL_INFO, PSTR("DLI: Init - RX-pin: %d, TX-pin: %d"), Pin(GPIO_DALI_RX), Pin(GPIO_DALI_TX));
+ // pinMode(LED, OUTPUT);
+ pinMode(Pin(GPIO_DALI_TX), OUTPUT);
+ digitalWrite(Pin(GPIO_DALI_TX), HIGH);
+ pinMode(Pin(GPIO_DALI_RX), INPUT);
+
+ DALI_timer = timerBegin(0, 13, true);
+ timerAttachInterrupt(DALI_timer, &DALI_Tick_Handler, true);
+ timerAlarmWrite(DALI_timer, 641, true);
+
+ attachInterrupt(Pin(GPIO_DALI_RX), receiveDaliData, FALLING);
+ enableDaliRxInterrupt();
+ Dali.present = true;
+}
+
+void DaliPwr(uint8_t val){
+ // AddLog(LOG_LEVEL_INFO, PSTR("DLI: Send to address %d value %d"), 0, val);
+ sendDaliData(BROADCAST_DP, val);
+}
+
+bool DaliCmd(void)
+{
+ char command[CMDSZ];
+ uint8_t name_len = strlen(D_NAME_DALI);
+ if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_NAME_DALI), name_len))
+ {
+ uint32_t command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic + name_len, kDALI_Commands);
+ switch (command_code)
+ {
+ case CMND_DALI_PWR:
+ if (XdrvMailbox.data_len)
+ {
+ // AddLog(LOG_LEVEL_INFO, PSTR("DLI: XdrvMailbox.data_len %d"), XdrvMailbox.data_len);
+ // AddLog(LOG_LEVEL_INFO, PSTR("DLI: XdrvMailbox.payload %d"), XdrvMailbox.payload);
+ if (254 >= XdrvMailbox.payload)
+ {
+ DaliPwr(XdrvMailbox.payload);
+ }
+ }
+ // Response_P(S_JSON_DALI_COMMAND_NVALUE, command, DaliGetPwr());
+ Response_P(S_JSON_DALI_COMMAND_NVALUE, command, XdrvMailbox.payload);
+ break;
+ default:
+ return false;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+/*********************************************************************************************\
+ * Presentation
+\*********************************************************************************************/
+
+#ifdef USE_WEBSERVER
+
+#define WEB_HANDLE_DALI "dali"
+
+const char HTTP_BTN_MENU_DALI[] PROGMEM =
+ "
";
+
+#endif // USE_WEBSERVER
+
+
+
+#define DALI_TOPIC "DALI"
+static char tmp[120];
+
+bool DaliMqtt()
+{
+ char stopic[TOPSZ];
+ strncpy(stopic, XdrvMailbox.topic, TOPSZ);
+ XdrvMailbox.topic[TOPSZ - 1] = 0;
+
+ // AddLog(LOG_LEVEL_DEBUG, PSTR("DALI mqtt: %s:%s"), stopic, XdrvMailbox.data);
+
+ // Разберем топик на слова по "/"
+ char *items[10];
+ char *p = stopic;
+ int cnt = 0;
+ do
+ {
+ items[cnt] = strtok(p, "/");
+ cnt++;
+ p = nullptr;
+ } while (items[cnt - 1]);
+ cnt--; // repreents the number of items
+
+ if (cnt < 3)
+ { // not for us?
+ AddLog(LOG_LEVEL_INFO,PSTR("cnt: %d < 3"), cnt);
+ return false;
+ }
+
+ // cnt-4 cnt -3 cnt-2 cnt-1
+ // cmnd/tasmota_078480/DALI/power :70
+ // cnt-5 cnt -4 cnt-3 cnt-2 cnt-1
+ // cmnd/tasmota_078480/DALI/power/0 :70
+ int DALIindex = 0;
+ int ADRindex = 0;
+ int CMDindex = 0;
+ uint8_t DALIaddr = BROADCAST_DP;
+ if (strcasecmp_P(items[cnt - 3], PSTR(DALI_TOPIC)) != 0)
+ {
+ // AddLog(LOG_LEVEL_INFO,PSTR("cnt-3 not %s"), PSTR(DALI_TOPIC));
+ if (strcasecmp_P(items[cnt - 2], PSTR(DALI_TOPIC)) != 0)
+ {
+ // AddLog(LOG_LEVEL_INFO,PSTR("cnt-2 not %s"), PSTR(DALI_TOPIC));
+ if (strcasecmp_P(items[cnt - 1], PSTR(DALI_TOPIC)) != 0)
+ {
+ return false; // not for us
+ }
+ else
+ {
+ // AddLog(LOG_LEVEL_INFO,PSTR("DLI: handle json"));
+ if (true == DaliJsonParse()) { return true; }
+ }
+ }
+ else
+ {
+ DALIindex = cnt - 2;
+ CMDindex = cnt - 1;
+ }
+ }
+ else
+ {
+ DALIindex = cnt - 3;
+ CMDindex = cnt - 2;
+ ADRindex = cnt - 1;
+ DALIaddr = ((int)CharToFloat(items[ADRindex])) << 1; // !!! ВАЖНО !!! Номер лампы должен быть сдвинут << 1
+
+ }
+
+ // AddLog(LOG_LEVEL_INFO,PSTR("DLI: handle topic + data"));
+ uint8_t level;
+ uint8_t value = (uint8_t)CharToFloat(XdrvMailbox.data);
+ if (strcasecmp_P(items[CMDindex], PSTR("percent")) == 0) {
+ float percent = (float)(254 * value * 0.01);
+ level = (uint8_t)percent;
+ }
+ else if (strcasecmp_P(items[CMDindex], PSTR("level")) == 0) {
+ level = value;
+ }
+ else {
+ AddLog(LOG_LEVEL_INFO,PSTR("command not recognized: %s"), items[CMDindex]);
+ return false; // not for us
+ }
+
+ AddLog(LOG_LEVEL_INFO,PSTR("Dali value %d on address %d"), value, DALIaddr);
+ sendDaliData(DALIaddr, level);
+
+ return true;
+}
+
+bool DaliJsonParse()
+{
+ bool served = false;
+
+ // if (strlen(XdrvMailbox.data) > 8) { // Workaround exception if empty JSON like {} - Needs checks
+ JsonParser parser((char *)XdrvMailbox.data);
+ JsonParserObject root = parser.getRootObject();
+ if (root)
+ {
+ int DALIindex = 0;
+ int ADRindex = 0;
+ int8_t DALIdim = -1;
+ uint8_t DALIaddr = BROADCAST_DP;
+
+ JsonParserToken val = root[PSTR("cmd")]; // Команда
+ if (val)
+ {
+ uint8_t cmd = val.getUInt();
+ val = root[PSTR("addr")];
+ if (val)
+ {
+ uint8_t addr = val.getUInt();
+ AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: cmd = %d, addr = %d"), cmd, addr);
+ sendDaliData(addr, cmd);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ val = root[PSTR("addr")];
+ if (val)
+ {
+ uint8_t addr = val.getUInt();
+ if ((addr >= 0) && (addr < 64))
+ DALIaddr = addr << 1; // !!! ВАЖНО !!! Номер лампы должен быть сдвинут << 1
+ // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json addr = %d"), val.getUInt());
+ }
+ val = root[PSTR("dim")];
+ if (val)
+ {
+ uint8_t dim = val.getUInt();
+ if ((dim >= 0) && (dim < 255))
+ DALIdim = dim;
+ // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json dimmer = %d"), val.getUInt());
+ }
+ // val = root[PSTR("power")];
+ // if (val)
+ // {
+ // // FMqtt.file_type = val.getUInt();
+ // // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json power = %d"), val.getUInt());
+ // }
+ sendDaliData(DALIaddr, DALIdim);
+ served = true;
+ }
+ // else {
+ // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json ERROR - not json"));
+ // }
+ // }
+
+ return served;
+}
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+bool Xdrv89(uint8_t function)
+{
+ bool result = false;
+
+ if (FUNC_INIT == function)
+ {
+ DaliPreInit();
+ }
+ else if (Dali.present)
+ {
+ switch (function)
+ {
+ case FUNC_MQTT_DATA:
+ result = DaliMqtt();
+ break;
+ case FUNC_COMMAND:
+ result = DaliCmd();
+ break;
+#ifdef USE_WEBSERVER
+ // case FUNC_WEB_ADD_BUTTON:
+ // WSContentSend_P(HTTP_BTN_MENU_DALI);
+ // break;
+ // case FUNC_WEB_ADD_HANDLER:
+ // WebServer_on(PSTR("/" WEB_HANDLE_DALI), HandleDali);
+ // break;
+#ifdef USE_DALI_DISPLAYINPUT
+ // case FUNC_WEB_SENSOR:
+ // DaliShow(0);
+ // break;
+#endif // #ifdef USE_DALI_DISPLAYINPUT
+#endif // USE_WEBSERVER
+ }
+ }
+ return result;
+}
+
+#endif // USE_DALI
+#endif // ESP32
\ No newline at end of file
From c1c0b25c174034adbb96578e228a77ed712fb7e0 Mon Sep 17 00:00:00 2001
From: eeak
Date: Fri, 28 Oct 2022 19:47:55 +0300
Subject: [PATCH 2/7] Clean up some comments and little refactor
---
tasmota/my_user_config.h | 4 +
.../xdrv_89_esp32_dali.ino | 138 +++++-------------
2 files changed, 43 insertions(+), 99 deletions(-)
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index 51ea0d677..8a4de54f0 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -1034,6 +1034,10 @@
#define USE_ESP32_SENSORS // Add support for ESP32 temperature and optional hall effect sensor
+#define USE_DALI // Add support for DALI
+ #define DALI_IN_INVERT 0 // DALI RX inverted ?
+ #define DALI_OUT_INVERT 0 // DALI TX inverted ?
+
//#define USE_SONOFF_SPM // Add support for ESP32 based Sonoff Smart Stackable Power Meter (+11k code)
//#define USE_DISPLAY_TM1621_SONOFF // Add support for TM1621 dsiplay driver used by Sonoff POWR3xxD and THR3xxD
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
index 222f91bac..844b71af6 100644
--- a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
+++ b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
@@ -32,6 +32,7 @@
#define XDRV_89 89
#define BROADCAST_DP 0b11111110 // 0xFE
+#define DALI_TOPIC "DALI"
enum
{
@@ -57,9 +58,6 @@ enum DALI_Commands { // commands for Console
};
/* Private variables ---------------------------------------------------------*/
-// Communication ports and pins
-bool DALIOUT_invert = false;
-bool DALIIN_invert = false;
// Data variables
uint16_t send_dali_data; // data to send to DALI bus
uint16_t received_dali_data; // data received from DALI bus
@@ -163,7 +161,7 @@ void receiveDaliData()
bool get_DALIIN(void)
{
bool dali_read = digitalRead(Pin(GPIO_DALI_RX));
- return (false == DALIIN_invert) ? dali_read : !dali_read;
+ return (false == DALI_IN_INVERT) ? dali_read : !dali_read;
}
/**
@@ -266,7 +264,7 @@ void receive_tick(void)
*/
void set_DALIOUT(bool pin_value)
{
- digitalWrite(Pin(GPIO_DALI_TX), pin_value == DALIOUT_invert ? LOW : HIGH);
+ digitalWrite(Pin(GPIO_DALI_TX), pin_value == DALI_OUT_INVERT ? LOW : HIGH);
}
/**
@@ -277,7 +275,7 @@ void set_DALIOUT(bool pin_value)
bool get_DALIOUT(void)
{
bool dali_read = digitalRead(Pin(GPIO_DALI_TX));
- return (false == DALIOUT_invert) ? dali_read : !dali_read;
+ return (false == DALI_OUT_INVERT) ? dali_read : !dali_read;
}
/**
@@ -394,7 +392,6 @@ void DaliPreInit() {
}
void DaliPwr(uint8_t val){
- // AddLog(LOG_LEVEL_INFO, PSTR("DLI: Send to address %d value %d"), 0, val);
sendDaliData(BROADCAST_DP, val);
}
@@ -410,14 +407,11 @@ bool DaliCmd(void)
case CMND_DALI_PWR:
if (XdrvMailbox.data_len)
{
- // AddLog(LOG_LEVEL_INFO, PSTR("DLI: XdrvMailbox.data_len %d"), XdrvMailbox.data_len);
- // AddLog(LOG_LEVEL_INFO, PSTR("DLI: XdrvMailbox.payload %d"), XdrvMailbox.payload);
if (254 >= XdrvMailbox.payload)
{
DaliPwr(XdrvMailbox.payload);
}
}
- // Response_P(S_JSON_DALI_COMMAND_NVALUE, command, DaliGetPwr());
Response_P(S_JSON_DALI_COMMAND_NVALUE, command, XdrvMailbox.payload);
break;
default:
@@ -431,23 +425,6 @@ bool DaliCmd(void)
}
}
-/*********************************************************************************************\
- * Presentation
-\*********************************************************************************************/
-
-#ifdef USE_WEBSERVER
-
-#define WEB_HANDLE_DALI "dali"
-
-const char HTTP_BTN_MENU_DALI[] PROGMEM =
- "";
-
-#endif // USE_WEBSERVER
-
-
-
-#define DALI_TOPIC "DALI"
-static char tmp[120];
bool DaliMqtt()
{
@@ -455,9 +432,6 @@ bool DaliMqtt()
strncpy(stopic, XdrvMailbox.topic, TOPSZ);
XdrvMailbox.topic[TOPSZ - 1] = 0;
- // AddLog(LOG_LEVEL_DEBUG, PSTR("DALI mqtt: %s:%s"), stopic, XdrvMailbox.data);
-
- // Разберем топик на слова по "/"
char *items[10];
char *p = stopic;
int cnt = 0;
@@ -475,27 +449,20 @@ bool DaliMqtt()
return false;
}
- // cnt-4 cnt -3 cnt-2 cnt-1
- // cmnd/tasmota_078480/DALI/power :70
- // cnt-5 cnt -4 cnt-3 cnt-2 cnt-1
- // cmnd/tasmota_078480/DALI/power/0 :70
int DALIindex = 0;
int ADRindex = 0;
int CMDindex = 0;
uint8_t DALIaddr = BROADCAST_DP;
if (strcasecmp_P(items[cnt - 3], PSTR(DALI_TOPIC)) != 0)
{
- // AddLog(LOG_LEVEL_INFO,PSTR("cnt-3 not %s"), PSTR(DALI_TOPIC));
if (strcasecmp_P(items[cnt - 2], PSTR(DALI_TOPIC)) != 0)
{
- // AddLog(LOG_LEVEL_INFO,PSTR("cnt-2 not %s"), PSTR(DALI_TOPIC));
if (strcasecmp_P(items[cnt - 1], PSTR(DALI_TOPIC)) != 0)
{
return false; // not for us
}
else
{
- // AddLog(LOG_LEVEL_INFO,PSTR("DLI: handle json"));
if (true == DaliJsonParse()) { return true; }
}
}
@@ -510,11 +477,10 @@ bool DaliMqtt()
DALIindex = cnt - 3;
CMDindex = cnt - 2;
ADRindex = cnt - 1;
- DALIaddr = ((int)CharToFloat(items[ADRindex])) << 1; // !!! ВАЖНО !!! Номер лампы должен быть сдвинут << 1
+ DALIaddr = ((int)CharToFloat(items[ADRindex])) << 1;
}
- // AddLog(LOG_LEVEL_INFO,PSTR("DLI: handle topic + data"));
uint8_t level;
uint8_t value = (uint8_t)CharToFloat(XdrvMailbox.data);
if (strcasecmp_P(items[CMDindex], PSTR("percent")) == 0) {
@@ -538,63 +504,50 @@ bool DaliMqtt()
bool DaliJsonParse()
{
bool served = false;
+ JsonParser parser((char *)XdrvMailbox.data);
+ JsonParserObject root = parser.getRootObject();
+ if (root)
+ {
+ int DALIindex = 0;
+ int ADRindex = 0;
+ int8_t DALIdim = -1;
+ uint8_t DALIaddr = BROADCAST_DP;
- // if (strlen(XdrvMailbox.data) > 8) { // Workaround exception if empty JSON like {} - Needs checks
- JsonParser parser((char *)XdrvMailbox.data);
- JsonParserObject root = parser.getRootObject();
- if (root)
+ JsonParserToken val = root[PSTR("cmd")];
+ if (val)
{
- int DALIindex = 0;
- int ADRindex = 0;
- int8_t DALIdim = -1;
- uint8_t DALIaddr = BROADCAST_DP;
-
- JsonParserToken val = root[PSTR("cmd")]; // Команда
- if (val)
- {
- uint8_t cmd = val.getUInt();
- val = root[PSTR("addr")];
- if (val)
- {
- uint8_t addr = val.getUInt();
- AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: cmd = %d, addr = %d"), cmd, addr);
- sendDaliData(addr, cmd);
- return true;
- }
- else
- {
- return false;
- }
- }
+ uint8_t cmd = val.getUInt();
val = root[PSTR("addr")];
if (val)
{
uint8_t addr = val.getUInt();
- if ((addr >= 0) && (addr < 64))
- DALIaddr = addr << 1; // !!! ВАЖНО !!! Номер лампы должен быть сдвинут << 1
- // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json addr = %d"), val.getUInt());
+ AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: cmd = %d, addr = %d"), cmd, addr);
+ sendDaliData(addr, cmd);
+ return true;
}
- val = root[PSTR("dim")];
- if (val)
+ else
{
- uint8_t dim = val.getUInt();
- if ((dim >= 0) && (dim < 255))
- DALIdim = dim;
- // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json dimmer = %d"), val.getUInt());
+ return false;
}
- // val = root[PSTR("power")];
- // if (val)
- // {
- // // FMqtt.file_type = val.getUInt();
- // // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json power = %d"), val.getUInt());
- // }
- sendDaliData(DALIaddr, DALIdim);
- served = true;
}
- // else {
- // AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: mqtt->json ERROR - not json"));
- // }
- // }
+ val = root[PSTR("addr")];
+ if (val)
+ {
+ uint8_t addr = val.getUInt();
+ if ((addr >= 0) && (addr < 64))
+ DALIaddr = addr << 1;
+ }
+ val = root[PSTR("dim")];
+ if (val)
+ {
+ uint8_t dim = val.getUInt();
+ if (dim < 255)
+ DALIdim = dim;
+ }
+
+ sendDaliData(DALIaddr, DALIdim);
+ served = true;
+ }
return served;
}
@@ -621,19 +574,6 @@ bool Xdrv89(uint8_t function)
case FUNC_COMMAND:
result = DaliCmd();
break;
-#ifdef USE_WEBSERVER
- // case FUNC_WEB_ADD_BUTTON:
- // WSContentSend_P(HTTP_BTN_MENU_DALI);
- // break;
- // case FUNC_WEB_ADD_HANDLER:
- // WebServer_on(PSTR("/" WEB_HANDLE_DALI), HandleDali);
- // break;
-#ifdef USE_DALI_DISPLAYINPUT
- // case FUNC_WEB_SENSOR:
- // DaliShow(0);
- // break;
-#endif // #ifdef USE_DALI_DISPLAYINPUT
-#endif // USE_WEBSERVER
}
}
return result;
From 76c5be76346ef1fb85918b6e91a10963cd30d263 Mon Sep 17 00:00:00 2001
From: eeak
Date: Fri, 28 Oct 2022 20:16:45 +0300
Subject: [PATCH 3/7] Packed global variables into a struct
---
.../xdrv_89_esp32_dali.ino | 146 +++++++++---------
1 file changed, 77 insertions(+), 69 deletions(-)
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
index 844b71af6..39ac47a3f 100644
--- a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
+++ b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
@@ -42,10 +42,6 @@ enum
DALI_ERROR
};
-struct DALI {
- bool present = false;
-} Dali;
-
// http and json defines
#define D_NAME_DALI "DALI"
@@ -59,16 +55,29 @@ enum DALI_Commands { // commands for Console
/* Private variables ---------------------------------------------------------*/
// Data variables
-uint16_t send_dali_data; // data to send to DALI bus
-uint16_t received_dali_data; // data received from DALI bus
+// uint16_t send_dali_data; // data to send to DALI bus
+// uint16_t received_dali_data; // data received from DALI bus
// Processing variables
-uint8_t flag; // DALI status flag
-uint8_t bit_count; // nr of rec/send bits
-uint16_t tick_count; // nr of ticks of the timer
+// uint8_t flag; // DALI status flag
+// uint8_t bit_count; // nr of rec/send bits
+// uint16_t tick_count; // nr of ticks of the timer
-bool bit_value; // value of actual bit
-bool actual_val; // bit value in this tick of timer
-bool former_val; // bit value in previous tick of timer
+// bool bit_value; // value of actual bit
+// bool actual_val; // bit value in this tick of timer
+// bool former_val; // bit value in previous tick of timer
+
+struct DALI {
+ // Data variables
+ uint16_t send_dali_data; // data to send to DALI bus
+ uint16_t received_dali_data; // data received from DALI bus
+ // Processing variables
+ uint8_t flag; // DALI status flag
+ uint8_t bit_count; // nr of rec/send bits
+ uint16_t tick_count; // nr of ticks of the timer
+ bool former_val; // bit value in previous tick of timer
+
+ bool present = false;// DALI initialized
+} Dali;
hw_timer_t *DALI_timer = NULL;
@@ -83,11 +92,11 @@ hw_timer_t *DALI_timer = NULL;
*/
void IRAM_ATTR DALI_Tick_Handler(void)
{
- if (get_flag() == DALI_RECEIVING_DATA)
+ if (getDaliFlag() == DALI_RECEIVING_DATA)
{
receive_tick();
}
- else if (get_flag() == DALI_SENDING_DATA)
+ else if (getDaliFlag() == DALI_SENDING_DATA)
{
send_tick();
}
@@ -99,7 +108,7 @@ void IRAM_ATTR DALI_Tick_Handler(void)
* @retval None
*/
void enableDaliRxInterrupt() {
- flag = DALI_NO_ACTION;
+ Dali.flag = DALI_NO_ACTION;
timerAlarmDisable(DALI_timer);
attachInterrupt(Pin(GPIO_DALI_RX), receiveDaliData, FALLING);
}
@@ -119,9 +128,9 @@ void disableRxInterrupt() {
* @param None
* @retval uint8_t flag
*/
-uint8_t get_flag(void)
+uint8_t getDaliFlag(void)
{
- return flag;
+ return Dali.flag;
}
/**
@@ -130,7 +139,7 @@ uint8_t get_flag(void)
* @retval uint8_t flag
*/
void DataReceivedCallback() {
- AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: Received: %d %d"), received_dali_data>>9, received_dali_data&0xff);
+ AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: Received: %d %d"), Dali.received_dali_data>>9, Dali.received_dali_data&0xff);
}
/*************** R E C E I V E * P R O C E D U R E S *******/
@@ -143,12 +152,12 @@ void DataReceivedCallback() {
void receiveDaliData()
{
// null variables
- received_dali_data = 0;
- bit_count = 0;
- tick_count = 0;
- former_val = true;
+ Dali.received_dali_data = 0;
+ Dali.bit_count = 0;
+ Dali.tick_count = 0;
+ Dali.former_val = true;
- flag = DALI_RECEIVING_DATA;
+ Dali.flag = DALI_RECEIVING_DATA;
disableRxInterrupt();
}
@@ -176,63 +185,62 @@ bool get_DALIIN(void)
void receive_tick(void)
{
// four ticks per bit
- actual_val = get_DALIIN();
- tick_count++;
+ bool actual_val = get_DALIIN();
+ Dali.tick_count++;
// edge detected
- if(actual_val != former_val)
+ if(actual_val != Dali.former_val)
{
- switch(bit_count)
+ switch(Dali.bit_count)
{
case 0:
- if (tick_count > 2)
+ if (Dali.tick_count > 2)
{
- tick_count = 0;
- bit_count = 1; // start bit
+ Dali.tick_count = 0;
+ Dali.bit_count = 1; // start bit
}
break;
case 17: // 1st stop bit
- if(tick_count > 6) { // stop bit error, no edge should exist
- flag = DALI_ERROR;
+ if(Dali.tick_count > 6) { // stop bit error, no edge should exist
+ Dali.flag = DALI_ERROR;
}
break;
default: // other bits
- if(tick_count > 6)
+ if(Dali.tick_count > 6)
{
- received_dali_data |= (actual_val << (16-bit_count));
- bit_count++;
- tick_count = 0;
+ Dali.received_dali_data |= (actual_val << (16-Dali.bit_count));
+ Dali.bit_count++;
+ Dali.tick_count = 0;
}
break;
}
}else // voltage level stable
{
- switch(bit_count)
+ switch(Dali.bit_count)
{
case 0:
- if(tick_count==8) { // too long start bit
- flag = DALI_ERROR;
- Serial.println("Too long start bit.");
+ if(Dali.tick_count==8) { // too long start bit
+ Dali.flag = DALI_ERROR;
}
break;
case 17:
// First stop bit
- if (tick_count==8)
+ if (Dali.tick_count==8)
{
if (actual_val==0) // wrong level of stop bit
{
- flag = DALI_ERROR;
+ Dali.flag = DALI_ERROR;
}
else
{
- bit_count++;
- tick_count = 0;
+ Dali.bit_count++;
+ Dali.tick_count = 0;
}
}
break;
case 18:
// Second stop bit
- if (tick_count==8)
+ if (Dali.tick_count==8)
{
enableDaliRxInterrupt();
DataReceivedCallback();
@@ -240,15 +248,15 @@ void receive_tick(void)
}
break;
default: // normal bits
- if(tick_count==10)
+ if(Dali.tick_count==10)
{ // too long delay before edge
- flag = DALI_ERROR;
+ Dali.flag = DALI_ERROR;
}
break;
}
}
- former_val = actual_val;
- if(flag==DALI_ERROR)
+ Dali.former_val = actual_val;
+ if(getDaliFlag() == DALI_ERROR)
{
enableDaliRxInterrupt();
}
@@ -285,12 +293,12 @@ bool get_DALIOUT(void)
*/
void sendDaliData(uint8_t firstByte, uint8_t secondByte)
{
- send_dali_data = firstByte << 8;
- send_dali_data += secondByte & 0xff;
- bit_count = 0;
- tick_count = 0;
+ Dali.send_dali_data = firstByte << 8;
+ Dali.send_dali_data += secondByte & 0xff;
+ Dali.bit_count = 0;
+ Dali.tick_count = 0;
- flag = DALI_SENDING_DATA;
+ Dali.flag = DALI_SENDING_DATA;
disableRxInterrupt();
}
@@ -307,67 +315,67 @@ void sendDaliData(uint8_t firstByte, uint8_t secondByte)
void send_tick(void)
{
// access to the routine just every 4 ticks = every half bit
- if ((tick_count & 0x03) == 0)
+ if ((Dali.tick_count & 0x03) == 0)
{
- if (tick_count < 160)
+ if (Dali.tick_count < 160)
{
// settling time between forward and backward frame
- if (tick_count < 24)
+ if (Dali.tick_count < 24)
{
- tick_count++;
+ Dali.tick_count++;
return;
}
// start of the start bit
- if (tick_count == 24)
+ if (Dali.tick_count == 24)
{
// GPIOB->ODR ^= GPIO_ODR_7;
set_DALIOUT(false);
- tick_count++;
+ Dali.tick_count++;
return;
}
// edge of the start bit
// 28 ticks = 28/9600 = 2,92ms = delay between forward and backward message frame
- if (tick_count == 28)
+ if (Dali.tick_count == 28)
{
set_DALIOUT(true);
- tick_count++;
+ Dali.tick_count++;
return;
}
// bit value (edge) selection
- bit_value = (bool)((send_dali_data >> (15 - bit_count)) & 0x01);
+ bool bit_value = (bool)((Dali.send_dali_data >> (15 - Dali.bit_count)) & 0x01);
// Every half bit -> Manchester coding
- if (!((tick_count - 24) & 0x0007))
+ if (!((Dali.tick_count - 24) & 0x0007))
{ // div by 8
if (get_DALIOUT() == bit_value) // former value of bit = new value of bit
set_DALIOUT((bool)(1 - bit_value));
}
// Generate edge for actual bit
- if (!((tick_count - 28) & 0x0007))
+ if (!((Dali.tick_count - 28) & 0x0007))
{
set_DALIOUT(bit_value);
- bit_count++;
+ Dali.bit_count++;
}
}
else
{ // end of data byte, start of stop bits
- if (tick_count == 160)
+ if (Dali.tick_count == 160)
{
set_DALIOUT(true); // start of stop bit
}
// end of stop bits, no settling time
- if (tick_count == 176)
+ if (Dali.tick_count == 176)
{
enableDaliRxInterrupt();
}
}
}
- tick_count++;
+ Dali.tick_count++;
return;
}
From 404db7965e84421d6cb83e4b536fc2cd0142f49b Mon Sep 17 00:00:00 2001
From: eeak
Date: Fri, 28 Oct 2022 21:57:40 +0300
Subject: [PATCH 4/7] Timer number is now declared in my_user_config.h
---
tasmota/my_user_config.h | 1 +
.../xdrv_89_esp32_dali.ino | 19 +++++--------------
2 files changed, 6 insertions(+), 14 deletions(-)
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index 8a4de54f0..3e2d83a5b 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -1037,6 +1037,7 @@
#define USE_DALI // Add support for DALI
#define DALI_IN_INVERT 0 // DALI RX inverted ?
#define DALI_OUT_INVERT 0 // DALI TX inverted ?
+ #define DALI_TIMER 0 // ESP32 hardware timer number 0-3 !!! timer 3 used in xdrv_10_scripter.ino !!!
//#define USE_SONOFF_SPM // Add support for ESP32 based Sonoff Smart Stackable Power Meter (+11k code)
//#define USE_DISPLAY_TM1621_SONOFF // Add support for TM1621 dsiplay driver used by Sonoff POWR3xxD and THR3xxD
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
index 39ac47a3f..87523b6e0 100644
--- a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
+++ b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
@@ -31,6 +31,10 @@
#define XDRV_89 89
+#ifndef DALI_TIMER
+ #define DALI_TIMER 0 // Default timer
+#endif
+
#define BROADCAST_DP 0b11111110 // 0xFE
#define DALI_TOPIC "DALI"
@@ -53,19 +57,6 @@ enum DALI_Commands { // commands for Console
CMND_DALI_DIM,
};
-/* Private variables ---------------------------------------------------------*/
-// Data variables
-// uint16_t send_dali_data; // data to send to DALI bus
-// uint16_t received_dali_data; // data received from DALI bus
-// Processing variables
-// uint8_t flag; // DALI status flag
-// uint8_t bit_count; // nr of rec/send bits
-// uint16_t tick_count; // nr of ticks of the timer
-
-// bool bit_value; // value of actual bit
-// bool actual_val; // bit value in this tick of timer
-// bool former_val; // bit value in previous tick of timer
-
struct DALI {
// Data variables
uint16_t send_dali_data; // data to send to DALI bus
@@ -390,7 +381,7 @@ void DaliPreInit() {
digitalWrite(Pin(GPIO_DALI_TX), HIGH);
pinMode(Pin(GPIO_DALI_RX), INPUT);
- DALI_timer = timerBegin(0, 13, true);
+ DALI_timer = timerBegin(DALI_TIMER, 13, true);
timerAttachInterrupt(DALI_timer, &DALI_Tick_Handler, true);
timerAlarmWrite(DALI_timer, 641, true);
From 6c0e38e38d783646b0ed12d3485ceb244ff9d61b Mon Sep 17 00:00:00 2001
From: eeak
Date: Sat, 29 Oct 2022 12:50:41 +0300
Subject: [PATCH 5/7] Data struct rebuilded. Thanks barbudor for help
---
tasmota/my_user_config.h | 2 +-
.../xdrv_89_esp32_dali.ino | 135 +++++++++---------
2 files changed, 69 insertions(+), 68 deletions(-)
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index 3e2d83a5b..24077f12f 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -1034,7 +1034,7 @@
#define USE_ESP32_SENSORS // Add support for ESP32 temperature and optional hall effect sensor
-#define USE_DALI // Add support for DALI
+// #define USE_DALI // Add support for DALI
#define DALI_IN_INVERT 0 // DALI RX inverted ?
#define DALI_OUT_INVERT 0 // DALI TX inverted ?
#define DALI_TIMER 0 // ESP32 hardware timer number 0-3 !!! timer 3 used in xdrv_10_scripter.ino !!!
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
index 87523b6e0..0a247a2bd 100644
--- a/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
+++ b/tasmota/tasmota_xdrv_driver/xdrv_89_esp32_dali.ino
@@ -58,19 +58,16 @@ enum DALI_Commands { // commands for Console
};
struct DALI {
- // Data variables
uint16_t send_dali_data; // data to send to DALI bus
uint16_t received_dali_data; // data received from DALI bus
- // Processing variables
- uint8_t flag; // DALI status flag
- uint8_t bit_count; // nr of rec/send bits
- uint16_t tick_count; // nr of ticks of the timer
- bool former_val; // bit value in previous tick of timer
+ uint8_t flag; // DALI status flag
+ uint8_t bit_count; // nr of rec/send bits
+ uint16_t tick_count; // nr of ticks of the timer
+ bool former_val; // bit value in previous tick of timer
+ hw_timer_t *timer; // hardware timer
+} *Dali = nullptr;
- bool present = false;// DALI initialized
-} Dali;
-hw_timer_t *DALI_timer = NULL;
/*********************************************************************************************\
* DALI low level
@@ -99,8 +96,8 @@ void IRAM_ATTR DALI_Tick_Handler(void)
* @retval None
*/
void enableDaliRxInterrupt() {
- Dali.flag = DALI_NO_ACTION;
- timerAlarmDisable(DALI_timer);
+ Dali->flag = DALI_NO_ACTION;
+ timerAlarmDisable(Dali->timer);
attachInterrupt(Pin(GPIO_DALI_RX), receiveDaliData, FALLING);
}
@@ -110,7 +107,7 @@ void enableDaliRxInterrupt() {
* @retval None
*/
void disableRxInterrupt() {
- timerAlarmEnable(DALI_timer);
+ timerAlarmEnable(Dali->timer);
detachInterrupt(Pin(GPIO_DALI_RX));
}
@@ -121,7 +118,7 @@ void disableRxInterrupt() {
*/
uint8_t getDaliFlag(void)
{
- return Dali.flag;
+ return Dali->flag;
}
/**
@@ -130,7 +127,7 @@ uint8_t getDaliFlag(void)
* @retval uint8_t flag
*/
void DataReceivedCallback() {
- AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: Received: %d %d"), Dali.received_dali_data>>9, Dali.received_dali_data&0xff);
+ AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: Received: %d %d"), Dali->received_dali_data>>9, Dali->received_dali_data&0xff);
}
/*************** R E C E I V E * P R O C E D U R E S *******/
@@ -143,12 +140,12 @@ void DataReceivedCallback() {
void receiveDaliData()
{
// null variables
- Dali.received_dali_data = 0;
- Dali.bit_count = 0;
- Dali.tick_count = 0;
- Dali.former_val = true;
+ Dali->received_dali_data = 0;
+ Dali->bit_count = 0;
+ Dali->tick_count = 0;
+ Dali->former_val = true;
- Dali.flag = DALI_RECEIVING_DATA;
+ Dali->flag = DALI_RECEIVING_DATA;
disableRxInterrupt();
}
@@ -177,61 +174,61 @@ void receive_tick(void)
{
// four ticks per bit
bool actual_val = get_DALIIN();
- Dali.tick_count++;
+ Dali->tick_count++;
// edge detected
- if(actual_val != Dali.former_val)
+ if(actual_val != Dali->former_val)
{
- switch(Dali.bit_count)
+ switch(Dali->bit_count)
{
case 0:
- if (Dali.tick_count > 2)
+ if (Dali->tick_count > 2)
{
- Dali.tick_count = 0;
- Dali.bit_count = 1; // start bit
+ Dali->tick_count = 0;
+ Dali->bit_count = 1; // start bit
}
break;
case 17: // 1st stop bit
- if(Dali.tick_count > 6) { // stop bit error, no edge should exist
- Dali.flag = DALI_ERROR;
+ if(Dali->tick_count > 6) { // stop bit error, no edge should exist
+ Dali->flag = DALI_ERROR;
}
break;
default: // other bits
- if(Dali.tick_count > 6)
+ if(Dali->tick_count > 6)
{
- Dali.received_dali_data |= (actual_val << (16-Dali.bit_count));
- Dali.bit_count++;
- Dali.tick_count = 0;
+ Dali->received_dali_data |= (actual_val << (16-Dali->bit_count));
+ Dali->bit_count++;
+ Dali->tick_count = 0;
}
break;
}
}else // voltage level stable
{
- switch(Dali.bit_count)
+ switch(Dali->bit_count)
{
case 0:
- if(Dali.tick_count==8) { // too long start bit
- Dali.flag = DALI_ERROR;
+ if(Dali->tick_count==8) { // too long start bit
+ Dali->flag = DALI_ERROR;
}
break;
case 17:
// First stop bit
- if (Dali.tick_count==8)
+ if (Dali->tick_count==8)
{
if (actual_val==0) // wrong level of stop bit
{
- Dali.flag = DALI_ERROR;
+ Dali->flag = DALI_ERROR;
}
else
{
- Dali.bit_count++;
- Dali.tick_count = 0;
+ Dali->bit_count++;
+ Dali->tick_count = 0;
}
}
break;
case 18:
// Second stop bit
- if (Dali.tick_count==8)
+ if (Dali->tick_count==8)
{
enableDaliRxInterrupt();
DataReceivedCallback();
@@ -239,14 +236,14 @@ void receive_tick(void)
}
break;
default: // normal bits
- if(Dali.tick_count==10)
+ if(Dali->tick_count==10)
{ // too long delay before edge
- Dali.flag = DALI_ERROR;
+ Dali->flag = DALI_ERROR;
}
break;
}
}
- Dali.former_val = actual_val;
+ Dali->former_val = actual_val;
if(getDaliFlag() == DALI_ERROR)
{
enableDaliRxInterrupt();
@@ -284,12 +281,12 @@ bool get_DALIOUT(void)
*/
void sendDaliData(uint8_t firstByte, uint8_t secondByte)
{
- Dali.send_dali_data = firstByte << 8;
- Dali.send_dali_data += secondByte & 0xff;
- Dali.bit_count = 0;
- Dali.tick_count = 0;
+ Dali->send_dali_data = firstByte << 8;
+ Dali->send_dali_data += secondByte & 0xff;
+ Dali->bit_count = 0;
+ Dali->tick_count = 0;
- Dali.flag = DALI_SENDING_DATA;
+ Dali->flag = DALI_SENDING_DATA;
disableRxInterrupt();
}
@@ -306,67 +303,67 @@ void sendDaliData(uint8_t firstByte, uint8_t secondByte)
void send_tick(void)
{
// access to the routine just every 4 ticks = every half bit
- if ((Dali.tick_count & 0x03) == 0)
+ if ((Dali->tick_count & 0x03) == 0)
{
- if (Dali.tick_count < 160)
+ if (Dali->tick_count < 160)
{
// settling time between forward and backward frame
- if (Dali.tick_count < 24)
+ if (Dali->tick_count < 24)
{
- Dali.tick_count++;
+ Dali->tick_count++;
return;
}
// start of the start bit
- if (Dali.tick_count == 24)
+ if (Dali->tick_count == 24)
{
// GPIOB->ODR ^= GPIO_ODR_7;
set_DALIOUT(false);
- Dali.tick_count++;
+ Dali->tick_count++;
return;
}
// edge of the start bit
// 28 ticks = 28/9600 = 2,92ms = delay between forward and backward message frame
- if (Dali.tick_count == 28)
+ if (Dali->tick_count == 28)
{
set_DALIOUT(true);
- Dali.tick_count++;
+ Dali->tick_count++;
return;
}
// bit value (edge) selection
- bool bit_value = (bool)((Dali.send_dali_data >> (15 - Dali.bit_count)) & 0x01);
+ bool bit_value = (bool)((Dali->send_dali_data >> (15 - Dali->bit_count)) & 0x01);
// Every half bit -> Manchester coding
- if (!((Dali.tick_count - 24) & 0x0007))
+ if (!((Dali->tick_count - 24) & 0x0007))
{ // div by 8
if (get_DALIOUT() == bit_value) // former value of bit = new value of bit
set_DALIOUT((bool)(1 - bit_value));
}
// Generate edge for actual bit
- if (!((Dali.tick_count - 28) & 0x0007))
+ if (!((Dali->tick_count - 28) & 0x0007))
{
set_DALIOUT(bit_value);
- Dali.bit_count++;
+ Dali->bit_count++;
}
}
else
{ // end of data byte, start of stop bits
- if (Dali.tick_count == 160)
+ if (Dali->tick_count == 160)
{
set_DALIOUT(true); // start of stop bit
}
// end of stop bits, no settling time
- if (Dali.tick_count == 176)
+ if (Dali->tick_count == 176)
{
enableDaliRxInterrupt();
}
}
}
- Dali.tick_count++;
+ Dali->tick_count++;
return;
}
@@ -381,13 +378,17 @@ void DaliPreInit() {
digitalWrite(Pin(GPIO_DALI_TX), HIGH);
pinMode(Pin(GPIO_DALI_RX), INPUT);
- DALI_timer = timerBegin(DALI_TIMER, 13, true);
- timerAttachInterrupt(DALI_timer, &DALI_Tick_Handler, true);
- timerAlarmWrite(DALI_timer, 641, true);
+ Dali = (DALI*)calloc(1,sizeof(DALI));
+ if (!Dali) {
+ AddLog(LOG_LEVEL_INFO, PSTR("DLI: Memory allocation error"));
+ return;
+ }
+ Dali->timer = timerBegin(DALI_TIMER, 13, true);
+ timerAttachInterrupt(Dali->timer, &DALI_Tick_Handler, true);
+ timerAlarmWrite(Dali->timer, 641, true);
attachInterrupt(Pin(GPIO_DALI_RX), receiveDaliData, FALLING);
enableDaliRxInterrupt();
- Dali.present = true;
}
void DaliPwr(uint8_t val){
@@ -563,7 +564,7 @@ bool Xdrv89(uint8_t function)
{
DaliPreInit();
}
- else if (Dali.present)
+ else if (Dali)
{
switch (function)
{
From 4e98cbb387d619a2e4d93a785acecc81b680111a Mon Sep 17 00:00:00 2001
From: eeak
Date: Sat, 29 Oct 2022 16:09:09 +0300
Subject: [PATCH 6/7] moved D_CMND_xx to i18n.h
---
tasmota/include/i18n.h | 4 ++++
tasmota/language/af_AF.h | 2 --
tasmota/language/bg_BG.h | 2 --
tasmota/language/ca_AD.h | 2 --
tasmota/language/cs_CZ.h | 2 --
tasmota/language/de_DE.h | 2 --
tasmota/language/el_GR.h | 2 --
tasmota/language/en_GB.h | 2 --
tasmota/language/es_ES.h | 2 --
tasmota/language/fr_FR.h | 2 --
tasmota/language/fy_NL.h | 2 --
tasmota/language/he_HE.h | 2 --
tasmota/language/hu_HU.h | 2 --
tasmota/language/it_IT.h | 2 --
tasmota/language/ko_KO.h | 2 --
tasmota/language/nl_NL.h | 2 --
tasmota/language/pl_PL.h | 2 --
tasmota/language/pt_BR.h | 2 --
tasmota/language/pt_PT.h | 2 --
tasmota/language/ro_RO.h | 2 --
tasmota/language/ru_RU.h | 2 --
tasmota/language/sk_SK.h | 2 --
tasmota/language/sv_SE.h | 2 --
tasmota/language/tr_TR.h | 2 --
tasmota/language/uk_UA.h | 2 --
tasmota/language/vi_VN.h | 2 --
tasmota/language/zh_CN.h | 2 --
tasmota/language/zh_TW.h | 2 --
28 files changed, 4 insertions(+), 54 deletions(-)
diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h
index 84c0a78a6..1c46f3df4 100644
--- a/tasmota/include/i18n.h
+++ b/tasmota/include/i18n.h
@@ -753,6 +753,10 @@
// Commands xdrv_60_shift595.ino - 74x595 family shift register driver
#define D_CMND_SHIFT595_DEVICE_COUNT "Shift595DeviceCount"
+// Commands xdrv_89_dali.ino
+#define D_CMND_DALI_POWER "power"
+#define D_CMND_DALI_DIMMER "dim"
+
// Commands xsns_02_analog.ino
#define D_CMND_ADCPARAM "AdcParam"
diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h
index 39dc3126b..53f836a14 100644
--- a/tasmota/language/af_AF.h
+++ b/tasmota/language/af_AF.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energie Vandag"
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 21ecbce73..784a15f90 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Консумация за днес"
diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h
index 01cf177b1..c01ee0d66 100644
--- a/tasmota/language/ca_AD.h
+++ b/tasmota/language/ca_AD.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energy Today"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index f1fea69ec..eb3d4d797 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Spotřeba Dnes"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index df8a827b1..d4ba67d4a 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energie heute"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index 0d7500450..a7e79adf7 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Ενέργεια σήμερα"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index d59a97f01..392abdb0e 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energy Today"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index b75beec9a..62043d5c5 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energía Hoy"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index 5f3eac5a3..3a26c486f 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xsns_03_energy.ino
#define D_ENERGY_TODAY "Énergie aujourd'hui"
diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h
index a5f22689a..4e2bb00a1 100644
--- a/tasmota/language/fy_NL.h
+++ b/tasmota/language/fy_NL.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Konsumpsje hjoed"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index 31d969f78..afde4734d 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "צריכה יומית"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index c2204ea65..1d753de1b 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Mai energia"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 5db1e1220..15b933509 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energia - oggi"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index 7e85879cc..7fd6d1864 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "금일 전력 사용량"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index f2355a709..d0f96fe48 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Verbruik vandaag"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index c523cec6f..a4237e480 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energia dzisiaj"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index b87b1a618..ed31fc1f9 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Consumo energético de hoje"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index c050785fa..e1bde2d58 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Consumo energético de hoje"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index 77ca813dc..b9db344a1 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energia de Azi"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index fd9c3a7ee..5e38b74f9 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Конфигурация DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Энергия Сегодня"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index 8b1f107df..2565fd648 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Spotreba dnes"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index a603635c3..6c85c366f 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energi idag"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index 4c6d46b49..a32bd177a 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Energy Today"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index 1a6f34161..b786a6700 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Енергія Сьогодні"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index 7416d1dae..c054ed967 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "Năng lượng tiêu thụ hôm nay"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index 4f93019fc..63d885088 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "今日用电量"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 641f8192c..30db4a4f1 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -515,8 +515,6 @@
#define D_SENSOR_DALI_RX "Dali RX"
#define D_SENSOR_DALI_TX "Dali TX"
#define D_CONFIGURE_DALI "Config DALI"
-#define D_CMND_DALI_POWER "power"
-#define D_CMND_DALI_DIMMER "dim"
// xdrv_03_energy.ino
#define D_ENERGY_TODAY "今日用電量"
From 06350618b7a312be04fc90578880e9c00ca78577 Mon Sep 17 00:00:00 2001
From: eeak
Date: Sat, 29 Oct 2022 16:12:10 +0300
Subject: [PATCH 7/7] cleanup tasmota_template.h
---
tasmota/include/tasmota_template.h | 4 ----
1 file changed, 4 deletions(-)
diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h
index 76977bde0..831115456 100644
--- a/tasmota/include/tasmota_template.h
+++ b/tasmota/include/tasmota_template.h
@@ -198,9 +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
-#ifdef ESP32
GPIO_DALI_RX, GPIO_DALI_TX, // Dali
-#endif
GPIO_SENSOR_END };
// Error as warning to rethink GPIO usage with max 2045
@@ -446,9 +444,7 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_ADE7953_RST "|"
D_SENSOR_NRG_MBS_TX "|" D_SENSOR_NRG_MBS_RX "|"
D_SENSOR_ADE7953_CS "|"
-#ifdef ESP32
D_SENSOR_DALI_RX "|" D_SENSOR_DALI_TX "|"
-#endif
;
const char kSensorNamesFixed[] PROGMEM =