Update changelogs

This commit is contained in:
Theo Arends 2024-10-11 11:54:08 +02:00
parent f2c61c4496
commit a839144491
4 changed files with 57 additions and 27 deletions

View File

@ -9,7 +9,7 @@ All notable changes to this project will be documented in this file.
- LVGL port `colorwheel` from LVGL 8 (#22244) - LVGL port `colorwheel` from LVGL 8 (#22244)
- HASPmota `cpicker` and `msgbox` (#22244) - HASPmota `cpicker` and `msgbox` (#22244)
- Support for DALI 1 on ESP8266 - Support for DALI 1 on ESP8266
- Command ``DaliWeb 1`` to enable light control for broadcast address - Command ``DaliWeb 1`` to enable light control for Dali broadcast address
### Breaking Changed ### Breaking Changed
@ -26,10 +26,10 @@ All notable changes to this project will be documented in this file.
- ESP32 Dali compile error with core 3.x (#22214) - ESP32 Dali compile error with core 3.x (#22214)
- Dali received data decoding - Dali received data decoding
- ESP32 Ethernet using EthClockMode 3 (#22248) - ESP32 Ethernet using EthClockMode 3 (#22248)
- Temporarily disable SPI DMA for uDisplay (broken since esp-idf 5.3) - ESP32 disable SPI DMA for uDisplay (broken since esp-idf 5.3 (core 3.1.0)) (#22264)
### Removed ### Removed
- Berry Zigbee removed test code - Berry Zigbee removed test code (#22263)
## [14.2.0.5] 20240926 ## [14.2.0.5] 20240926
### Added ### Added

View File

@ -117,7 +117,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
## Changelog v14.2.0.6 ## Changelog v14.2.0.6
### Added ### Added
- Command ``SetOption69 1`` to enable Serial Bridge inverted Receive [#22000](https://github.com/arendst/Tasmota/issues/22000) - Command ``SetOption69 1`` to enable Serial Bridge inverted Receive [#22000](https://github.com/arendst/Tasmota/issues/22000)
- Command ``DaliWeb 1`` to enable light control for broadcast address - Command ``DaliWeb 1`` to enable light control for Dali broadcast address
- HX711 optional calibration precision option on command ``Sensor34 2 <weight in gram> <precision>`` where `<precision>` is 1 to 20 [#13983](https://github.com/arendst/Tasmota/issues/13983) - HX711 optional calibration precision option on command ``Sensor34 2 <weight in gram> <precision>`` where `<precision>` is 1 to 20 [#13983](https://github.com/arendst/Tasmota/issues/13983)
- ESP8266 support for one-wire M1601 temperature sensor on DS18x20 GPIO [#21376](https://github.com/arendst/Tasmota/issues/21376) - ESP8266 support for one-wire M1601 temperature sensor on DS18x20 GPIO [#21376](https://github.com/arendst/Tasmota/issues/21376)
- ESP8266 support for I2C CLK on GPIO16 [#22199](https://github.com/arendst/Tasmota/issues/22199) - ESP8266 support for I2C CLK on GPIO16 [#22199](https://github.com/arendst/Tasmota/issues/22199)
@ -179,6 +179,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
- ESP32 Range Extender compile error with core 3.x [#22205](https://github.com/arendst/Tasmota/issues/22205) - ESP32 Range Extender compile error with core 3.x [#22205](https://github.com/arendst/Tasmota/issues/22205)
- ESP32 Dali compile error with core 3.x [#22214](https://github.com/arendst/Tasmota/issues/22214) - ESP32 Dali compile error with core 3.x [#22214](https://github.com/arendst/Tasmota/issues/22214)
- ESP32 Ethernet using EthClockMode 3 [#22248](https://github.com/arendst/Tasmota/issues/22248) - ESP32 Ethernet using EthClockMode 3 [#22248](https://github.com/arendst/Tasmota/issues/22248)
- ESP32 disable SPI DMA for uDisplay (broken since esp-idf 5.3 (core 3.1.0)) [#22264](https://github.com/arendst/Tasmota/issues/22264)
- Berry avoid `readbytes()` from crashing when file is too large [#22057](https://github.com/arendst/Tasmota/issues/22057) - Berry avoid `readbytes()` from crashing when file is too large [#22057](https://github.com/arendst/Tasmota/issues/22057)
- Berry energy missing attributes [#22116](https://github.com/arendst/Tasmota/issues/22116) - Berry energy missing attributes [#22116](https://github.com/arendst/Tasmota/issues/22116)
- Berry I2C to prepare M5Stack I2C STM32 based devices [#22143](https://github.com/arendst/Tasmota/issues/22143) - Berry I2C to prepare M5Stack I2C STM32 based devices [#22143](https://github.com/arendst/Tasmota/issues/22143)
@ -196,3 +197,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
### Removed ### Removed
- ESP8266 Analog input support using energy driver as only one channel is available - ESP8266 Analog input support using energy driver as only one channel is available
- Berry remove reuse of methods for interface-like code reuse #21500 [#22055](https://github.com/arendst/Tasmota/issues/22055) - Berry remove reuse of methods for interface-like code reuse #21500 [#22055](https://github.com/arendst/Tasmota/issues/22055)
- Berry Zigbee removed test code [#22263](https://github.com/arendst/Tasmota/issues/22263)

View File

@ -18,9 +18,9 @@
#endif // ESP8266 #endif // ESP8266
#ifdef ESP32 #ifdef ESP32
#if CONFIG_SOC_HP_I2C_NUM > 1 #if SOC_HP_I2C_NUM > 1
#define USE_I2C_BUS2 #define USE_I2C_BUS2
#endif // CONFIG_SOC_HP_I2C_NUM #endif // SOC_HP_I2C_NUM
#endif // ESP32 #endif // ESP32
const uint8_t I2C_RETRY_COUNTER = 3; const uint8_t I2C_RETRY_COUNTER = 3;

View File

@ -55,16 +55,24 @@
#define DALI_DEBUG_PIN 4 #define DALI_DEBUG_PIN 4
#endif #endif
#define BROADCAST_DP 0b11111110 // 0xFE = 254 #define DALI_BROADCAST_DP 0b11111110 // 0xFE = 254
#define DALI_TOPIC "DALI" #define DALI_TOPIC "DALI"
#define D_PRFX_DALI "Dali" #define D_PRFX_DALI "Dali"
const char kDALICommands[] PROGMEM = D_PRFX_DALI "|" // Prefix const char kDALICommands[] PROGMEM = D_PRFX_DALI "|" // Prefix
"|" D_CMND_POWER "|" D_CMND_DIMMER "|Web"; "|" D_CMND_POWER
#ifdef USE_LIGHT
"|Web"
#endif // USE_LIGHT
"|" D_CMND_DIMMER ;
void (* const DALICommand[])(void) PROGMEM = { void (* const DALICommand[])(void) PROGMEM = {
&CmndDali, &CmndDaliPower, &CmndDaliDimmer, &CmndDaliWeb }; &CmndDali, &CmndDaliPower,
#ifdef USE_LIGHT
&CmndDaliWeb,
#endif // USE_LIGHT
&CmndDaliDimmer };
struct DALI { struct DALI {
uint32_t bit_time; uint32_t bit_time;
@ -75,8 +83,7 @@ struct DALI {
uint8_t command; uint8_t command;
uint8_t dimmer; uint8_t dimmer;
bool power; bool power;
bool input_ready; bool available;
bool set_power;
} *Dali = nullptr; } *Dali = nullptr;
/*********************************************************************************************\ /*********************************************************************************************\
@ -95,7 +102,7 @@ void DaliDisableRxInterrupt(void) {
void IRAM_ATTR DaliReceiveData(void); // Fix ESP8266 ISR not in IRAM! exception void IRAM_ATTR DaliReceiveData(void); // Fix ESP8266 ISR not in IRAM! exception
void DaliReceiveData(void) { void DaliReceiveData(void) {
if (Dali->input_ready) { return; } // Skip if last input is not yet handled if (Dali->available) { return; } // Skip if last input is not yet handled
uint32_t wait = ESP.getCycleCount() + (Dali->bit_time / 2); uint32_t wait = ESP.getCycleCount() + (Dali->bit_time / 2);
int bit_state = 0; int bit_state = 0;
bool dali_read; bool dali_read;
@ -120,7 +127,7 @@ void DaliReceiveData(void) {
if (abs(bit_state) <= 2) { // Valid Manchester encoding including start and stop bits if (abs(bit_state) <= 2) { // Valid Manchester encoding including start and stop bits
if (Dali->received_dali_data != received_dali_data) { // Skip duplicates if (Dali->received_dali_data != received_dali_data) { // Skip duplicates
Dali->received_dali_data = received_dali_data; Dali->received_dali_data = received_dali_data;
Dali->input_ready = true; // Valid data received Dali->available = true; // Valid data received
} }
} }
} }
@ -150,7 +157,7 @@ void DaliSendDataOnce(uint16_t send_dali_data) {
void DaliSendData(uint8_t firstByte, uint8_t secondByte) { void DaliSendData(uint8_t firstByte, uint8_t secondByte) {
Dali->address = firstByte; Dali->address = firstByte;
Dali->command = secondByte; Dali->command = secondByte;
if (BROADCAST_DP == firstByte) { if (DALI_BROADCAST_DP == firstByte) {
Dali->power = (secondByte); // State Dali->power = (secondByte); // State
if (Dali->power) { if (Dali->power) {
Dali->dimmer = secondByte; // Value Dali->dimmer = secondByte; // Value
@ -169,7 +176,7 @@ void DaliSendData(uint8_t firstByte, uint8_t secondByte) {
} }
void DaliPower(uint8_t val) { void DaliPower(uint8_t val) {
DaliSendData(BROADCAST_DP, val); DaliSendData(DALI_BROADCAST_DP, val);
} }
/***********************************************************/ /***********************************************************/
@ -187,35 +194,46 @@ void ResponseDali(void) {
} }
void DaliInput(void) { void DaliInput(void) {
if (Dali->input_ready) { if (Dali->available) {
Dali->address = Dali->received_dali_data >> 8; Dali->address = Dali->received_dali_data >> 8;
Dali->command = Dali->received_dali_data; Dali->command = Dali->received_dali_data;
if (BROADCAST_DP == Dali->address) { #ifdef USE_LIGHT
uint8_t dimmer = changeUIntScale(Dali->dimmer, 0, 254, 0, 100); if (DALI_BROADCAST_DP == Dali->address) {
uint8_t power = Dali->power; uint8_t dimmer_old = changeUIntScale(Dali->dimmer, 0, 254, 0, 100);
uint8_t power_old = Dali->power;
Dali->power = (Dali->command); // State Dali->power = (Dali->command); // State
if (Dali->power) { if (Dali->power) {
Dali->dimmer = Dali->command; // Value Dali->dimmer = Dali->command; // Value
} }
if (Settings->sbflag1.dali_web) { // DaliWeb 1 if (Settings->sbflag1.dali_web) { // DaliWeb 1
char scmnd[20];
uint8_t dimmer_new = changeUIntScale(Dali->dimmer, 0, 254, 0, 100); uint8_t dimmer_new = changeUIntScale(Dali->dimmer, 0, 254, 0, 100);
if (power != Dali->power) { if (power_old != Dali->power) {
ExecuteCommandPower(1, Dali->power, SRC_SWITCH); // send SRC_SWITCH? to use as flag to prevent loop from inbound states from faceplate interaction ExecuteCommandPower(LightDevice(), Dali->power, SRC_SWITCH);
} }
else if (dimmer != dimmer_new) { else if (dimmer_old != dimmer_new) {
char scmnd[20];
snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_DIMMER " %d"), dimmer_new); snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_DIMMER " %d"), dimmer_new);
ExecuteCommand(scmnd, SRC_SWITCH); ExecuteCommand(scmnd, SRC_SWITCH);
} }
} }
} }
// AddLog(LOG_LEVEL_DEBUG, PSTR("DLI: Received 0x%04X"), Dali->received_dali_data);
if (!Settings->sbflag1.dali_web) { // DaliWeb 0 if (!Settings->sbflag1.dali_web) { // DaliWeb 0
ResponseDali(); ResponseDali();
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_PRFX_DALI)); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_PRFX_DALI));
} }
Dali->input_ready = false; #else
if (DALI_BROADCAST_DP == Dali->address) {
Dali->power = (Dali->command); // State
if (Dali->power) {
Dali->dimmer = Dali->command; // Value
}
}
ResponseDali();
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_PRFX_DALI));
#endif // USE_LIGHT
Dali->available = false;
} }
} }
@ -243,6 +261,7 @@ bool DaliInit(void) {
DaliEnableRxInterrupt(); DaliEnableRxInterrupt();
#ifdef USE_LIGHT
if (!Settings->sbflag1.dali_web) { // DaliWeb 0 if (!Settings->sbflag1.dali_web) { // DaliWeb 0
return false; return false;
} }
@ -250,8 +269,12 @@ bool DaliInit(void) {
UpdateDevicesPresent(1); UpdateDevicesPresent(1);
TasmotaGlobal.light_type = LT_SERIAL1; // Single channel TasmotaGlobal.light_type = LT_SERIAL1; // Single channel
return true; return true;
#else
return false;
#endif // USE_LIGHT
} }
#ifdef USE_LIGHT
bool DaliSetChannels(void) { bool DaliSetChannels(void) {
if (Settings->sbflag1.dali_web) { // DaliWeb 1 if (Settings->sbflag1.dali_web) { // DaliWeb 1
uint8_t value = ((uint8_t*)XdrvMailbox.data)[0]; uint8_t value = ((uint8_t*)XdrvMailbox.data)[0];
@ -260,6 +283,7 @@ bool DaliSetChannels(void) {
} }
return true; return true;
} }
#endif // USE_LIGHT
/*********************************************************************************************\ /*********************************************************************************************\
* Experimental - Not functioning * Experimental - Not functioning
@ -298,7 +322,7 @@ bool DaliMqtt(void) {
int DALIindex = 0; int DALIindex = 0;
int ADRindex = 0; int ADRindex = 0;
int CMDindex = 0; int CMDindex = 0;
uint8_t DALIaddr = BROADCAST_DP; uint8_t DALIaddr = DALI_BROADCAST_DP;
if (strcasecmp_P(items[cnt - 3], PSTR(DALI_TOPIC)) != 0) { // dali if (strcasecmp_P(items[cnt - 3], PSTR(DALI_TOPIC)) != 0) { // dali
// cmnd // cmnd
@ -355,7 +379,7 @@ bool DaliJsonParse(void) {
int DALIindex = 0; int DALIindex = 0;
int ADRindex = 0; int ADRindex = 0;
int8_t DALIdim = -1; int8_t DALIdim = -1;
uint8_t DALIaddr = BROADCAST_DP; uint8_t DALIaddr = DALI_BROADCAST_DP;
JsonParserToken val = root[PSTR("cmd")]; JsonParserToken val = root[PSTR("cmd")];
if (val) { if (val) {
@ -426,6 +450,7 @@ void CmndDaliDimmer(void) {
ResponseDali(); ResponseDali();
} }
#ifdef USE_LIGHT
void CmndDaliWeb(void) { void CmndDaliWeb(void) {
// DaliWeb 0 - Disable GUI light controls // DaliWeb 0 - Disable GUI light controls
// DaliWeb 1 - Enable GUI light controls // DaliWeb 1 - Enable GUI light controls
@ -435,6 +460,7 @@ void CmndDaliWeb(void) {
} }
ResponseCmndStateText(Settings->sbflag1.dali_web); ResponseCmndStateText(Settings->sbflag1.dali_web);
} }
#endif // USE_LIGHT
/*********************************************************************************************\ /*********************************************************************************************\
* Presentation * Presentation
@ -465,9 +491,11 @@ bool Xdrv75(uint32_t function) {
case FUNC_MQTT_DATA: case FUNC_MQTT_DATA:
result = DaliMqtt(); result = DaliMqtt();
break; break;
#ifdef USE_LIGHT
case FUNC_SET_CHANNELS: case FUNC_SET_CHANNELS:
result = DaliSetChannels(); result = DaliSetChannels();
break; break;
#endif // USE_LIGHT
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:
DaliShow(true); DaliShow(true);
break; break;