3737 * DaliGroup<1..16> [+]|-<device>,<device>... - Add(+) or Remove(-) devices to/from group
3838 * DaliPower<broadcast>|<device>|<group> 0..254 - Control power (0 = Off, 1 = Last dimmer, 2 = Toggle, 3..254 = absolute light brightness)
3939 * DaliDimmer<broadcast>|<device>|<group> 0..100 - Control dimmer (0 = Off, 1..100 = precentage of brightness)
40+ * DaliBS 0|1 - Set display of GUI broadcast slider - default 1 (ON)
41+ * DaliGroupSliders 0..16 - Set display number of GUI group sliders - default 2
4042 * DaliLight 0|1 - Enable Tasmota light control for DaliTarget device - default 1
4143 * DaliTarget <broadcast>|<device>|<group> - Set Tasmota light control device (0, 1..64, 101..116) - default 0
4244 * DaliChannels 1..5 - Set Tasmota light type (1 = R/C = DT6, 2 = RG/CW, 3 = RGB, 4 = RGBW, 5 = RGBWC) for DaliTarget
6567 --------------------------------------------------------------------------------------------
6668 Version yyyymmdd Action Description
6769 --------------------------------------------------------------------------------------------
70+ 1.5.1.0 20251207 update - Display GUI broadcast slider even if Tasmota Light Control is active
71+ - Add command `DaliNoBS 0|1` to disable display of GUI broadcast slider
6872 1.5.0.0 20251206 update - Fix WAF GUI sync
6973 - Refactor GUI sync
7074 1.4.1.0 20251130 update - Add options to `DaliGear` and DaliGroup` to toggle specific outputs
@@ -486,6 +490,7 @@ int DaliQueryExtendedVersionNumber(uint32_t adr, uint32_t device_type) {
486490 return DaliSendWaitResponse (adr | DALI_SELECTOR_BIT, 255 ); // DALI_xxx_QUERY_EXTENDED_VERSION_NUMBER
487491}
488492
493+ #ifdef USE_LIGHT
489494uint32_t DaliQueryRGBWAF (uint32_t adr) {
490495 // https://www.dali-alliance.org/tech-notes/device-type-discovery.html
491496 uint32_t rgbwaf_channels = 0 ;
@@ -527,6 +532,7 @@ uint32_t DaliQueryRGBWAF(uint32_t adr) {
527532 }
528533 return rgbwaf_channels;
529534}
535+ #endif // USE_LIGHT
530536
531537/* -------------------------------------------------------------------------------------------*/
532538
@@ -746,11 +752,12 @@ bool DaliLoopSync(uint32_t channels) {
746752 }
747753 }
748754 Dali->light_sync = millis (); // Block local loop
749- light_controller.changeChannels (color);
755+ light_controller.changeChannels (color, 1 );
756+ LightSetScheme (LS_POWER);
750757 }
751758 Dali->light_sync = millis (); // Block local loop
752759 ExecuteCommandPower (LightDevice (), (2 == rgb) ? 9 : 8 , SRC_SWITCH);
753- if (waf) {
760+ if (waf && (Settings-> param [P_RGB_REMAP] & 128 )) { // SetOption37 128)
754761 Dali->light_sync = millis (); // Block local loop
755762 ExecuteCommandPower (LightDevice () +1 , (2 == waf) ? 9 : 8 , SRC_SWITCH);
756763 }
@@ -837,17 +844,14 @@ bool DaliSetChannels(void) {
837844 if (Settings->sbflag1 .dali_light ) { // DaliLight 1
838845 Settings->light_fade = 0 ; // Use Dali fading
839846 Settings->light_correction = 0 ; // Use Dali light correction
840-
841- uint8_t *cur_col = (uint8_t *)XdrvMailbox.data ;
842- AddLog (LOG_LEVEL_DEBUG, PSTR (" DBG: SetChannels Sync %d cur_col %02X %02X %02X %02X %02X" ), Dali->light_sync , cur_col[0 ], cur_col[1 ], cur_col[2 ], cur_col[3 ], cur_col[4 ]);
843-
844847 if (Dali->light_sync ) { // Block local loop
845848 uint32_t light_sync = Dali->light_sync ;
846849 Dali->light_sync = 0 ;
847850 if (TimePassedSince (light_sync) < 200 ) { // Time it can take to call DaliSetChannels() from Dali received data
848851 return true ;
849852 }
850853 }
854+ uint8_t *cur_col = (uint8_t *)XdrvMailbox.data ;
851855 // cur_col[0] = Red, cur_col[1] = Green, cur_col[2] = Blue, cur_col[3] = Cold = White, cur_col[4] = Warm = Amber
852856 for (uint32_t i = 0 ; i < 5 ; i++) {
853857 if (255 == cur_col[i]) { cur_col[i] = 254 ; } // Max Dali value
@@ -979,15 +983,15 @@ bool DaliInit(uint32_t function) {
979983
980984 Settings->light_fade = 0 ; // Use Dali fading instead
981985 Settings->light_correction = 0 ; // Use Dali light correction
986+ Settings->flag3 .pwm_multi_channels = 0 ; // SetOption68 0 - Enable multi-channels PWM instead of Color PWM
982987 UpdateDevicesPresent (1 );
983988
984989 TasmotaGlobal.light_type = LT_W; // Single channel
985990 Dali->target_rgbwaf = DaliQueryRGBWAF (DaliTarget2Address (Dali->Settings .target ));
986991 if (Dali->target_rgbwaf > 1 ) {
987992 TasmotaGlobal.light_type = Dali->Settings .light_type ;
988- if (!Settings->flag3 .pwm_multi_channels && // SetOption68 0 - Enable multi-channels PWM instead of Color PWM
989- (TasmotaGlobal.light_type >= LT_RGBW) && // RGBW or RGBCW
990- (Settings->param [P_RGB_REMAP] & 128 )) { // SetOption37 128
993+ if ((TasmotaGlobal.light_type >= LT_RGBW) && // RGBW or RGBCW
994+ (Settings->param [P_RGB_REMAP] & 128 )) { // SetOption37 128
991995 UpdateDevicesPresent (1 ); // We manage RGB and W separately, hence adding a device
992996 }
993997 }
@@ -1003,18 +1007,18 @@ bool DaliInit(uint32_t function) {
10031007\*********************************************************************************************/
10041008
10051009const char kDALICommands [] PROGMEM = D_PRFX_DALI " |" // Prefix
1006- " |" D_CMND_POWER " |" D_CMND_DIMMER " |Target "
1010+ " |" D_CMND_POWER " |" D_CMND_DIMMER
10071011#ifdef USE_LIGHT
1008- " |Light|Channels"
1012+ " |Light|Target| Channels"
10091013#endif // USE_LIGHT
1010- " |Send|Query|Scan|Group|GroupSliders|Gear" ;
1014+ " |Send|Query|Scan|Group|GroupSliders|BS| Gear" ;
10111015
10121016void (* const DALICommand[])(void ) PROGMEM = {
1013- &CmndDali, &CmndDaliPower, &CmndDaliDimmer, &CmndDaliTarget,
1017+ &CmndDali, &CmndDaliPower, &CmndDaliDimmer,
10141018#ifdef USE_LIGHT
1015- &CmndDaliLight, &CmndDaliChannels,
1019+ &CmndDaliLight, &CmndDaliTarget, & CmndDaliChannels,
10161020#endif // USE_LIGHT
1017- &CmndDaliSend, &CmndDaliQuery, &CmndDaliScan, &CmndDaliGroup, &CmndDaliGroupSliders, &CmndDaliGear };
1021+ &CmndDaliSend, &CmndDaliQuery, &CmndDaliScan, &CmndDaliGroup, &CmndDaliGroupSliders, &CmndDaliBroadcastSlider, & CmndDaliGear };
10181022
10191023bool DaliJsonParse (void ) {
10201024 // {"addr":254,"cmd":100}
@@ -1090,22 +1094,6 @@ void CmndDali(void) {
10901094
10911095/* -------------------------------------------------------------------------------------------*/
10921096
1093- void CmndDaliTarget (void ) {
1094- // DaliTarget - Set transmit target
1095- // DaliTarget 0 - Set target to broadcast address
1096- // DaliTarget 1..64 - Set target to short address
1097- // DaliTarget 101..116 - Set target to group address
1098- if (((XdrvMailbox.payload >= 1 ) && (XdrvMailbox.payload <= 64 )) ||
1099- ((XdrvMailbox.payload >= 101 ) && (XdrvMailbox.payload <= 116 )) ||
1100- (XdrvMailbox.payload == 0 )) {
1101- Dali->Settings .target = XdrvMailbox.payload ;
1102- }
1103- Dali->target_rgbwaf = DaliQueryRGBWAF (DaliTarget2Address (Dali->Settings .target ));
1104- ResponseCmndNumber (Dali->Settings .target );
1105- }
1106-
1107- /* -------------------------------------------------------------------------------------------*/
1108-
11091097void CmndDaliPower (void ) {
11101098 // DaliPower 0 - Broadcast power off
11111099 // DaliPower 1 - Broadcast power on to last dimmer state
@@ -1495,6 +1483,18 @@ void CmndDaliScan(void) {
14951483
14961484/* -------------------------------------------------------------------------------------------*/
14971485
1486+ void CmndDaliBroadcastSlider (void ) {
1487+ // DaliBS 1 - Show broadcast slider
1488+ // DaliBS 0 - Hide broadcast slider
1489+ if ((XdrvMailbox.payload >= 0 ) && (XdrvMailbox.payload <= 1 )) {
1490+ Settings->sbflag1 .dali_no_broadcast_slider = !XdrvMailbox.payload ;
1491+ TasmotaGlobal.restart_flag = 2 ; // Restart to update GUI
1492+ }
1493+ ResponseCmndStateText (!Settings->sbflag1 .dali_no_broadcast_slider ); // DaliNoBS 0/1
1494+ }
1495+
1496+ /* -------------------------------------------------------------------------------------------*/
1497+
14981498void CmndDaliGroupSliders (void ) {
14991499 // DaliGroupSliders 0..16 - Add group sliders
15001500 if ((XdrvMailbox.payload >= 0 ) && (XdrvMailbox.payload <= 16 )) {
@@ -1519,6 +1519,25 @@ void CmndDaliLight(void) {
15191519
15201520/* -------------------------------------------------------------------------------------------*/
15211521
1522+ void CmndDaliTarget (void ) {
1523+ // DaliTarget - Set transmit target
1524+ // DaliTarget 0 - Set target to broadcast address
1525+ // DaliTarget 1..64 - Set target to short address
1526+ // DaliTarget 101..116 - Set target to group address
1527+ if (Dali->allow_light ) {
1528+ if (((XdrvMailbox.payload >= 1 ) && (XdrvMailbox.payload <= 64 )) ||
1529+ ((XdrvMailbox.payload >= 101 ) && (XdrvMailbox.payload <= 116 )) ||
1530+ (XdrvMailbox.payload == 0 )) {
1531+ Dali->Settings .target = XdrvMailbox.payload ;
1532+ TasmotaGlobal.restart_flag = 2 ; // Restart to update GUI
1533+ }
1534+ Dali->target_rgbwaf = DaliQueryRGBWAF (DaliTarget2Address (Dali->Settings .target ));
1535+ }
1536+ ResponseCmndNumber (Dali->Settings .target );
1537+ }
1538+
1539+ /* -------------------------------------------------------------------------------------------*/
1540+
15221541void CmndDaliChannels (void ) {
15231542 // DaliChannels - Show amount of color channels
15241543 // DaliChannels 1 - Set amount of color channels to R
@@ -1549,7 +1568,8 @@ const char HTTP_MSG_SLIDER_DALI[] PROGMEM =
15491568void DaliWebAddMainSlider (void ) {
15501569 WSContentSend_P (HTTP_TABLE100);
15511570 char number[12 ];
1552- for (uint32_t i = Settings->sbflag1 .dali_light ; i <= Settings->mbflag2 .dali_group_sliders ; i++) { // DaliLight 0/1, DaliGroupSliders
1571+ for (uint32_t i = Settings->sbflag1 .dali_no_broadcast_slider ; // DaliBS 0/1
1572+ i <= Settings->mbflag2 .dali_group_sliders ; i++) { // DaliGroupSliders
15531573 Dali->web_dimmer [i] = Dali->dimmer [i];
15541574 WSContentSend_P (HTTP_MSG_SLIDER_DALI, // Brightness - Black to White
15551575 i, // k75<i>
@@ -1573,7 +1593,8 @@ void DaliWebGetArg(void) {
15731593 char webindex[8 ]; // WebGetArg name
15741594
15751595 uint32_t index;
1576- for (uint32_t i = Settings->sbflag1 .dali_light ; i <= Settings->mbflag2 .dali_group_sliders ; i++) { // DaliLight 0/1, DaliGroupSliders
1596+ for (uint32_t i = Settings->sbflag1 .dali_no_broadcast_slider ; // DaliBS 0/1
1597+ i <= Settings->mbflag2 .dali_group_sliders ; i++) { // DaliGroupSliders
15771598 snprintf_P (webindex, sizeof (webindex), PSTR (" i75%d" ), i);
15781599 WebGetArg (webindex, tmp, sizeof (tmp)); // 0 - 100 percent
15791600 if (strlen (tmp)) {
@@ -1597,7 +1618,8 @@ void DaliWebGetArg(void) {
15971618void DaliWebShow (void ) {
15981619 WSContentSend_P (PSTR (" </table>" )); // Terminate current {t}
15991620 WSContentSend_P (HTTP_MSG_EXEC_JAVASCRIPT); // "<img style='display:none;' src onerror=\""
1600- for (uint32_t i = Settings->sbflag1 .dali_light ; i <= Settings->mbflag2 .dali_group_sliders ; i++) { // DaliLight 0/1, DaliGroupSliders
1621+ for (uint32_t i = Settings->sbflag1 .dali_no_broadcast_slider ; // DaliBS 0/1
1622+ i <= Settings->mbflag2 .dali_group_sliders ; i++) { // DaliGroupSliders
16011623 WSContentSend_P (PSTR (" eb('k75%d').style='background:#%06x';" ),
16021624 i, WebColor ((Dali->power [i]) ? COL_BUTTON : COL_BUTTON_OFF));
16031625 if (Dali->dimmer [i] != Dali->web_dimmer [i]) {
@@ -1630,6 +1652,7 @@ bool Xdrv75(uint32_t function) {
16301652 else if (Dali) {
16311653 switch (function) {
16321654 case FUNC_LOOP:
1655+ case FUNC_SLEEP_LOOP:
16331656 DaliLoop ();
16341657 break ;
16351658 case FUNC_EVERY_SECOND:
0 commit comments