Skip to content

Commit e3018e4

Browse files
Merge remote-tracking branch 'Tasmota/development' into work
2 parents b2f82e0 + 017357e commit e3018e4

File tree

2 files changed

+58
-35
lines changed

2 files changed

+58
-35
lines changed

tasmota/include/tasmota_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ typedef union {
279279
uint32_t ex_serbridge_console : 1; // bit 11 (v11.1.0.4) - (v14.1.0.2) Replaced by CMND_SSERIALMODE
280280
uint32_t telegram_disable_af : 1; // bit 12 (v14.0.0.2) - CMND_TMSTATE 6/7 - Disable Telegram auto-fingerprint fix
281281
uint32_t dali_light : 1; // bit 13 (v14.2.0.6) - CMND_DALILIGHT - Enable Tasmota light controls for DALI
282-
uint32_t spare14 : 1; // bit 14
282+
uint32_t dali_no_broadcast_slider : 1; // bit 14 (v15.1.0.3) - CMND_DALIBROADCASTSLIDER - Disable display of broadcast slider
283283
uint32_t spare15 : 1; // bit 15
284284
uint32_t spare16 : 1; // bit 16
285285
uint32_t spare17 : 1; // bit 17

tasmota/tasmota_xdrv_driver/xdrv_75_dali.ino

Lines changed: 57 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
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
@@ -65,6 +67,8 @@
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
489494
uint32_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

10051009
const 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

10121016
void (* 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

10191023
bool 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-
11091097
void 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+
14981498
void 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+
15221541
void 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 =
15491568
void 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) {
15971618
void 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

Comments
 (0)