From 59164211a0fd80cf6297f4276f62319ae429200b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 28 Nov 2025 14:21:17 +0100 Subject: [PATCH] Refactored DALI using TasmotaDali library v1.0.0 adding frame receive buffer --- CHANGELOG.md | 2 ++ RELEASENOTES.md | 2 ++ lib/default/TasmotaDali/src/TasmotaDali.cpp | 31 ++++++++++---------- tasmota/tasmota_xdrv_driver/xdrv_75_dali.ino | 21 +++++++------ 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d22c55c6..927fe32b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,13 @@ All notable changes to this project will be documented in this file. ### Added - Support for ESP32-P4 rev.3 (#24146) - Support for Analog Gauges (#24153) +- Support for MakeSkyBlue Solar Charger Energy Monitor (#24151) ### Breaking Changed ### Changed - ESP32 Platform from 2025.11.30 to 2025.11.31, Framework (Arduino Core) from v3.1.5 to v3.1.6 and IDF from v5.3.4.251110 to v5.3.4.251110 (#24146) +- Refactored DALI using TasmotaDali library v1.0.0 adding frame receive buffer ### Fixed - ESP32-P4 Hosted MCU updated to v2.6.6 solving WiFi boot issues (#24146) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 241f98eb8..07dbb1c28 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,6 +116,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Added - Support for ESP32-P4 rev.3 [#24146](https://github.com/arendst/Tasmota/issues/24118) - Support for Analog Gauges [#24153](https://github.com/arendst/Tasmota/issues/24153) +- Support for MakeSkyBlue Solar Charger Energy Monitor [#24151](https://github.com/arendst/Tasmota/issues/24151) - Commands `DaliSend` and `DaliQuery` allow extended commands with prefix for DeviceType defaulting to DT6 - ESP8266 GPIOViewer memory map if enabled with `#define GV_USE_ESPINFO` - HostedMCU file update using command `HostedLoad |` @@ -137,6 +138,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - JPEGDEC library from v1.8.3 to v1.8.4 [#24120](https://github.com/arendst/Tasmota/issues/24120) - GPIOViewer from v1.6.3 to v1.7.0 - Refactored library UDisplay [#24007](https://github.com/arendst/Tasmota/issues/24007) +- Refactored DALI using TasmotaDali library v1.0.0 adding frame receive buffer - Increased filesystem file name size from 48 to 50 characters ### Fixed diff --git a/lib/default/TasmotaDali/src/TasmotaDali.cpp b/lib/default/TasmotaDali/src/TasmotaDali.cpp index 13eb495dc..b37147b95 100644 --- a/lib/default/TasmotaDali/src/TasmotaDali.cpp +++ b/lib/default/TasmotaDali/src/TasmotaDali.cpp @@ -226,10 +226,11 @@ void TasmotaDali::ReceiveData(void) { 1 2 3 4 5 6 7 */ uint32_t wait = ESP.getCycleCount() + (m_bit_time / 2); + DaliFrame frame; + frame.data = 0; // Received dali data + frame.meta = 0; // Bit count 0..32 bit int bit_state = 0; bool dali_read; - uint32_t bit_count = 0; - uint32_t received_dali_data = 0; uint32_t bit_number = 0; while (bit_number < 72) { while (ESP.getCycleCount() < wait); @@ -239,15 +240,17 @@ void TasmotaDali::ReceiveData(void) { bit_state += (dali_read) ? 1 : -1; if (0 == bit_state) { // Manchester encoding total 2 bits is always 0 if (bit_number > 2) { // Skip start bit - received_dali_data <<= 1; - received_dali_data |= dali_read; + frame.data <<= 1; + frame.data |= dali_read; } } else if (2 == bit_state) { // Invalid manchester data (might be stop bit) - // bn 19 -> 8, 35 -> 16, 51 -> 24, 67 -> 32 - bit_count = (bit_number - 3) / 2; // 0..32 bit - bit_state = 0; - bit_number = 69; // Continue receiving stop bits + // bn 19 -> 8, 35 -> 16, 51 -> 24, 67 -> 32 + if (bit_number > 4) { + frame.meta = (bit_number - 3) / 2; // 1..32 bit + } + bit_state = 0; + bit_number = 69; // Continue receiving stop bits } else if (abs(bit_state) > 1) { // Invalid manchester data (too many 0 or 1) break; @@ -257,7 +260,7 @@ void TasmotaDali::ReceiveData(void) { break; } else if (dali_read != 1) { // Invalid level of stop bit - bit_state = 1; + bit_state = 1; // Could be collision break; } } @@ -265,12 +268,10 @@ void TasmotaDali::ReceiveData(void) { } m_last_activity = millis(); // Start Forward Frame delay time (>22Te) - if ((0 == bit_state) && // Valid Manchester encoding including start and stop bits - (bit_count >= 8) && // Minimum 8-bits (backward frame) - (bit_count <= 32)) { // Maximum 32-bits (forward and event frame) - DaliFrame frame; - frame.meta = bit_count; // 8..32 bit - frame.data = received_dali_data; + if (frame.meta > 0) { // Any valid bit received + if (bit_state != 0) { // Invalid Manchester encoding including start and stop bits + frame.meta | TM_DALI_COLLISION; // Possible collision or invalid reply of repeated frame + } uint32_t prev = (0 == m_in_pos) ? m_buffer_size -1 : m_in_pos -1; if ((m_buffer[prev].data != frame.data) || (m_buffer[prev].meta != frame.meta)) { // Skip duplicates diff --git a/tasmota/tasmota_xdrv_driver/xdrv_75_dali.ino b/tasmota/tasmota_xdrv_driver/xdrv_75_dali.ino index 601054139..3d9552aba 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_75_dali.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_75_dali.ino @@ -384,11 +384,9 @@ void DaliSendData(uint32_t adr, uint32_t cmd) { } } -#ifdef DALI_DEBUG - AddLog(Dali->log_level, PSTR("DLI: Tx 0x%08X %2d DT%d%s"), + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DLI: Tx 0x%08X %2d DT%d%s"), frame.data, frame.meta & TM_DALI_BIT_COUNT_MASK, Dali->device_type, (frame.meta & TM_DALI_SEND_TWICE)?" twice":""); -#endif // DALI_DEBUG Dali->dali->write(frame); // Takes 14.7 ms @@ -412,17 +410,16 @@ int DaliSendWaitResponse(uint32_t adr, uint32_t cmd, uint32_t timeout) { frame.meta = 0; if (Dali->dali->available()) { frame = Dali->dali->read(); - if (frame.meta > 127) { + if ((frame.meta & TM_DALI_COLLISION) || + (frame.meta != 8)) { result = -2; // Collision } - else if (8 == frame.meta) { // Backward frame - result = (frame.data &0xFF); + else { + result = (frame.data &0xFF); // Backward frame } } -#ifdef DALI_DEBUG - AddLog(Dali->log_level, PSTR("DLI: Rx 0x%08X %2d response"), result, frame.meta); -#endif // DALI_DEBUG + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DLI: Rx 0x%08X %2d response"), result, frame.meta); return result; } @@ -718,8 +715,10 @@ void DaliLoop(void) { DaliFrame frame = Dali->dali->read(); - AddLog((1 == Dali->probe) ? LOG_LEVEL_DEBUG : LOG_LEVEL_DEBUG_MORE, PSTR("DLI: Rx 0x%08X %2d queue %d%s"), - frame.data, frame.meta, queue, (8 == frame.meta)?" backward":""); + uint32_t bit_count = frame.meta & TM_DALI_BIT_COUNT_MASK; + bool collision = frame.meta & TM_DALI_COLLISION; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DLI: Rx 0x%08X %2d queue %d%s%s"), + frame.data, bit_count, queue, (8 == bit_count)?" backward":"", (collision)?" collision":""); if ((frame.meta != 16) || // Skip backward frames (1 == Dali->probe)) { // Probe only