From 0707a9648b0a3da6f9cf6571c94fa9c88566fbe4 Mon Sep 17 00:00:00 2001 From: Thomas A Date: Mon, 8 Feb 2021 18:52:03 +0100 Subject: [PATCH 01/19] Enable higher PWM frequencies for ESP32 LEDC peripheral of ESP32 allows higher PWM frequencies than the ESP8266. Higher frequencies come with reduced available bit depth (as by https://esphome.io/components/output/ledc.html). New max value of 50 kHz to include at least the frequency for 4-pin pwm fans and a bit more. --- tasmota/tasmota.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index b7a3c60ae..784dec7d3 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -126,7 +126,11 @@ const uint32_t PWM_RANGE = 1023; // 255..1023 needs to be devisible b //const uint16_t PWM_FREQ = 1000; // 100..1000 Hz led refresh //const uint16_t PWM_FREQ = 910; // 100..1000 Hz led refresh (iTead value) const uint16_t PWM_FREQ = 977; // 100..4000 Hz led refresh +#ifdef ESP32 +const uint16_t PWM_MAX = 50000; // [PWM_MAX] Maximum frequency for ESP32 - Default: 4000 +#else const uint16_t PWM_MAX = 4000; // [PWM_MAX] Maximum frequency - Default: 4000 +#endif const uint16_t PWM_MIN = 40; // [PWM_MIN] Minimum frequency - Default: 40 // For Dimmers use double of your mains AC frequecy (100 for 50Hz and 120 for 60Hz) // For Controlling Servos use 50 and also set PWM_FREQ as 50 (DO NOT USE THESE VALUES FOR DIMMERS) From 707e9702500fb43bc7c9be9ee6c6d4bd25d003fa Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Mon, 8 Feb 2021 21:28:59 -0600 Subject: [PATCH 02/19] Add no_share_mask support, DevGroupSend channels in hex, AND/OR operators, Use dynamic log buffer --- tasmota/support_device_groups.ino | 232 ++++++++++++++++++++---------- tasmota/support_tasmota.ino | 5 +- tasmota/tasmota.h | 4 +- tasmota/xdrv_04_light.ino | 41 +++--- 4 files changed, 181 insertions(+), 101 deletions(-) diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index dc79de635..cef0dd3af 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -42,6 +42,7 @@ struct device_group { uint32_t next_announcement_time; uint32_t next_ack_check_time; uint32_t member_timeout_time; + uint32_t no_status_share; uint16_t outgoing_sequence; uint16_t last_full_status_sequence; uint16_t message_length; @@ -84,10 +85,9 @@ uint8_t * BeginDeviceGroupMessage(struct device_group * device_group, uint16_t f return message_ptr; } -// Return true if we're configured to share the specified item. -bool DeviceGroupItemShared(bool incoming, uint8_t item) +uint32_t DeviceGroupSharedMask(uint8_t item) { - uint32_t mask; + uint32_t mask = 0; if (item == DGR_ITEM_LIGHT_BRI || item == DGR_ITEM_BRI_POWER_ON) mask = DGR_SHARE_LIGHT_BRI; else if (item == DGR_ITEM_POWER) @@ -102,9 +102,7 @@ bool DeviceGroupItemShared(bool incoming, uint8_t item) mask = DGR_SHARE_DIMMER_SETTINGS; else if (item == DGR_ITEM_EVENT) mask = DGR_SHARE_EVENT; - else - return true; - return mask & (incoming ? Settings.device_group_share_in : Settings.device_group_share_out); + return mask; } void DeviceGroupsInit(void) @@ -153,6 +151,7 @@ void DeviceGroupsInit(void) } } device_group->message_header_length = sprintf_P((char *)device_group->message, PSTR("%s%s"), kDeviceGroupMessage, device_group->group_name) + 1; + device_group->no_status_share = 0; device_group->last_full_status_sequence = -1; } @@ -204,7 +203,6 @@ void DeviceGroupsStop() void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct device_group_member * device_group_member, uint8_t * message, int message_length, bool received) { - char log_buffer[512]; bool item_processed = false; uint16_t message_sequence; uint16_t flags; @@ -218,16 +216,17 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de uint8_t * message_ptr = message + strlen((char *)message) + 1; // Get the message sequence and flags. - if (message_ptr + 4 > message_end_ptr) goto badmsg; // Malformed message - must be at least 16-bit sequence, 16-bit flags left + if (message_ptr + 4 > message_end_ptr) return; // Malformed message - must be at least 16-bit sequence, 16-bit flags left message_sequence = *message_ptr++; message_sequence |= *message_ptr++ << 8; flags = *message_ptr++; flags |= *message_ptr++ << 8; // Initialize the log buffer. + char * log_buffer = (char *)malloc(512); log_length = sprintf(log_buffer, PSTR("DGR: %s %s message %s %s: seq=%u, flags=%u"), (received ? PSTR("Received") : PSTR("Sending")), device_group->group_name, (received ? PSTR("from") : PSTR("to")), (device_group_member ? IPAddressToString(device_group_member->ip_address) : received ? PSTR("local") : PSTR("network")), message_sequence, flags); log_ptr = log_buffer + log_length; - log_remaining = sizeof(log_buffer) - log_length; + log_remaining = 512 - log_length; // If this is an announcement, just log it. if (flags == DGR_FLAG_ANNOUNCEMENT) goto write_log; @@ -303,7 +302,10 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de } uint8_t item; + uint8_t item_flags; int32_t value; + uint32_t mask; + item_flags = 0; for (;;) { if (message_ptr >= message_end_ptr) goto badmsg; // Malformed message item = *message_ptr++; @@ -321,6 +323,7 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de case DGR_ITEM_BRI_PRESET_HIGH: case DGR_ITEM_BRI_POWER_ON: case DGR_ITEM_POWER: + case DGR_ITEM_NO_STATUS_SHARE: case DGR_ITEM_EVENT: case DGR_ITEM_LIGHT_CHANNELS: break; @@ -376,45 +379,60 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de log_ptr += log_length; log_remaining -= log_length; - if (received && DeviceGroupItemShared(true, item)) { - item_processed = true; - XdrvMailbox.command_code = item; - XdrvMailbox.payload = value; - XdrvMailbox.data_len = value; - *log_ptr++ = '*'; - log_remaining--; - switch (item) { - case DGR_ITEM_POWER: - if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups - if (device_group_index < TasmotaGlobal.devices_present) { - bool on = (value & 1); - if (on != (TasmotaGlobal.power & (1 << device_group_index))) ExecuteCommandPower(device_group_index + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); - } - } - else if (XdrvMailbox.index & DGR_FLAG_LOCAL) { - uint8_t mask_devices = value >> 24; - if (mask_devices > TasmotaGlobal.devices_present) mask_devices = TasmotaGlobal.devices_present; - for (uint32_t i = 0; i < mask_devices; i++) { - uint32_t mask = 1 << i; - bool on = (value & mask); - if (on != (TasmotaGlobal.power & mask)) ExecuteCommandPower(i + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); - } - } - break; -#ifdef USE_RULES - case DGR_ITEM_EVENT: - CmndEvent(); - break; -#endif - case DGR_ITEM_COMMAND: - ExecuteCommand(XdrvMailbox.data, SRC_REMOTE); - break; + if (received) { + if (item == DGR_ITEM_FLAGS) { + item_flags = value; + continue; } - XdrvCall(FUNC_DEVICE_GROUP_ITEM); - } - } - if (received) { + mask = DeviceGroupSharedMask(item); + if (item_flags & DGR_ITEM_FLAG_NO_SHARE) + device_group->no_status_share |= mask; + else + device_group->no_status_share &= ~mask; + + if ((!(device_group->no_status_share & mask) || device_group_member == nullptr) && (!mask || (mask & Settings.device_group_share_in))) { + item_processed = true; + XdrvMailbox.command_code = item; + XdrvMailbox.payload = value; + XdrvMailbox.data_len = value; + *log_ptr++ = '*'; + log_remaining--; + switch (item) { + case DGR_ITEM_POWER: + if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups + if (device_group_index < TasmotaGlobal.devices_present) { + bool on = (value & 1); + if (on != (TasmotaGlobal.power & (1 << device_group_index))) ExecuteCommandPower(device_group_index + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); + } + } + else if (XdrvMailbox.index & DGR_FLAG_LOCAL) { + uint8_t mask_devices = value >> 24; + if (mask_devices > TasmotaGlobal.devices_present) mask_devices = TasmotaGlobal.devices_present; + for (uint32_t i = 0; i < mask_devices; i++) { + uint32_t mask = 1 << i; + bool on = (value & mask); + if (on != (TasmotaGlobal.power & mask)) ExecuteCommandPower(i + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); + } + } + break; + case DGR_ITEM_NO_STATUS_SHARE: + device_group->no_status_share = value; + break; +#ifdef USE_RULES + case DGR_ITEM_EVENT: + CmndEvent(); + break; +#endif + case DGR_ITEM_COMMAND: + ExecuteCommand(XdrvMailbox.data, SRC_REMOTE); + break; + } + XdrvCall(FUNC_DEVICE_GROUP_ITEM); + } + item_flags = 0; + } + if (item_processed) { XdrvMailbox.command_code = DGR_ITEM_EOL; XdrvCall(FUNC_DEVICE_GROUP_ITEM); @@ -454,6 +472,7 @@ badmsg: AddLog(LOG_LEVEL_ERROR, PSTR("%s ** incorrect length"), log_buffer); cleanup: + free(log_buffer); if (received) { TasmotaGlobal.skip_light_fade = false; ignore_dgr_sends = false; @@ -465,9 +484,6 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes // If device groups is not up, ignore this request. if (!device_groups_up) return 1; - // If the device group index is higher then the number of device groups, ignore this request. - if (device_group_index >= device_group_count) return 0; - // Extract the flags from the message type. bool with_local = ((message_type & DGR_MSGTYPFLAG_WITH_LOCAL) != 0); message_type = (DevGroupMessageType)(message_type & 0x7F); @@ -475,6 +491,14 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes // If we're currently processing a remote device message, ignore this request. if (ignore_dgr_sends && message_type != DGR_MSGTYPE_UPDATE_COMMAND) return 0; + // If device is < 0, the device group index is the device negated. If not, get the device group + // index from the device group maps. +// uint8_t device_group_index = -device; +// if (device > 0) device_group_index = (Settings.device_group_maps >> (device - 1) * 3 & 0x7 - 1; + + // If the device group index is higher then the number of device groups, ignore this request. + if (device_group_index >= device_group_count) return 0; + // Get a pointer to the device information for this device. struct device_group * device_group = &device_groups[device_group_index]; @@ -510,7 +534,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes power >>= device_group_index; power &= 1; } - SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_POWER, power); + SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_NO_STATUS_SHARE, device_group->no_status_share, DGR_ITEM_POWER, power); XdrvMailbox.index = 0; if (device_group_index == 0 && first_device_group_is_local) XdrvMailbox.index = DGR_FLAG_LOCAL; XdrvMailbox.command_code = DGR_ITEM_STATUS; @@ -539,11 +563,13 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes #endif // USE_DEVICE_GROUPS_SEND struct item { uint8_t item; + uint8_t flags; uint32_t value; void * value_ptr; } item_array[32]; bool shared; uint8_t item; + uint32_t mask; uint32_t value; uint8_t * value_ptr; uint8_t * first_item_ptr = message_ptr; @@ -559,6 +585,14 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes item_ptr->item = item; if (*value_ptr != '=') return 1; value_ptr++; + + // If flags were specified for this item, save them. + item_ptr->flags = 0; + if (toupper(*value_ptr) == 'N') { + value_ptr++; + item_ptr->flags = DGR_ITEM_FLAG_NO_SHARE; + } + if (item <= DGR_ITEM_MAX_32BIT) { oper = 0; if (*value_ptr == '@') { @@ -568,7 +602,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes value = (isdigit(*value_ptr) ? strtoul((char *)value_ptr, (char **)&value_ptr, 0) : 1); if (oper) { old_value = (item <= DGR_ITEM_MAX_8BIT ? device_group->values_8bit[item] : (item <= DGR_ITEM_MAX_16BIT ? device_group->values_16bit[item - DGR_ITEM_MAX_8BIT - 1] : device_group->values_32bit[item - DGR_ITEM_MAX_16BIT - 1])); - value = (oper == '+' ? old_value + value : (oper == '-' ? old_value - value : (oper == '^' ? old_value ^ (value ? value : 0xffffffff) : old_value))); + value = (oper == '+' ? old_value + value : oper == '-' ? old_value - value : oper == '^' ? old_value ^ (value ? value : 0xffffffff) : oper == '|' ? old_value | value : old_value == '&' ? old_value & value : old_value); } item_ptr->value = value; } @@ -580,14 +614,29 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes if (chr == ' ' && !escaped) break; if (!(escaped = (chr == '\\' && !escaped))) *out_ptr++ = chr; } - *out_ptr = 0; + *out_ptr++ = 0; } else { switch (item) { case DGR_ITEM_LIGHT_CHANNELS: - for (int i = 0; i < 6; i++) { - *out_ptr++ = strtoul((char *)value_ptr, (char **)&value_ptr, 0); - if (*value_ptr == ',') value_ptr++; + { + int i = 0; + char * endptr; + value = strtoul((char *)value_ptr, &endptr, 10); + if ((*endptr && *endptr != ',' && *endptr != ' ') || value > 255) { + for (; i < 6; i++) { + if (!*value_ptr || *value_ptr == ' ') break; + uint8_t * next_value_ptr = value_ptr + 2; + uint8_t save_char = *next_value_ptr; + *next_value_ptr = 'X'; + *out_ptr++ = strtoul((char *)value_ptr, (char **)&value_ptr, 16); + *next_value_ptr = save_char; + } + } + for (; i < 6; i++) { + *out_ptr++ = (*value_ptr == ' ' ? 0 : strtoul((char *)value_ptr, (char **)&value_ptr, 10)); + if (*value_ptr == ',') value_ptr++; + } } break; } @@ -601,6 +650,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes va_start(ap, message_type); while ((item = va_arg(ap, int))) { item_ptr->item = item; + item_ptr->flags = 0; if (item <= DGR_ITEM_MAX_32BIT) item_ptr->value = va_arg(ap, int); else if (item <= DGR_ITEM_MAX_STRING) @@ -621,6 +671,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes // previous update message to remove any items and their values that are included in this new // update. if (device_group->message_length) { + uint8_t item_flags = 0; int kept_item_count = 0; // Rebuild the previous update message, removing any items whose values are included in this @@ -628,31 +679,44 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes uint8_t * previous_message_ptr = message_ptr; while (item = *previous_message_ptr++) { - // Determine the length of this item's value. - if (item <= DGR_ITEM_MAX_32BIT) { - value = 1; - if (item > DGR_ITEM_MAX_8BIT) { - value = 2; - if (item > DGR_ITEM_MAX_16BIT) { - value = 4; + // If this is the flags item, save the flags. + if (item == DGR_ITEM_FLAGS) { + item_flags = *previous_message_ptr++; + } + + // Otherwise, determine the length of this item's value. + else { + if (item <= DGR_ITEM_MAX_32BIT) { + value = 1; + if (item > DGR_ITEM_MAX_8BIT) { + value = 2; + if (item > DGR_ITEM_MAX_16BIT) { + value = 4; + } } } - } - else { - value = *previous_message_ptr + 1; - } + else { + value = *previous_message_ptr + 1; + } - // Search for this item in the new update. - for (item_ptr = item_array; item_ptr->item; item_ptr++) { - if (item_ptr->item == item) break; - } + // Search for this item in the new update. + for (item_ptr = item_array; item_ptr->item; item_ptr++) { + if (item_ptr->item == item) break; + } - // If this item was not found in the new update, copy it to the new update message. - if (!item_ptr->item) { - kept_item_count++; - *message_ptr++ = item; - memmove(message_ptr, previous_message_ptr, value); - message_ptr += value; + // If this item was not found in the new update, copy it to the new update message. If the + // item has flags, first copy the flags item to the new update message. + if (!item_ptr->item) { + kept_item_count++; + if (item_flags) { + *message_ptr++ = DGR_ITEM_FLAGS; + *message_ptr++ = item_flags; + } + *message_ptr++ = item; + memmove(message_ptr, previous_message_ptr, value); + message_ptr += value; + } + item_flags = 0; } // Advance past the item value. @@ -668,8 +732,20 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes // If this item is shared with the group add it to the message. shared = true; - if (!device_group_index && message_type != DGR_MSGTYPE_UPDATE_COMMAND) shared = DeviceGroupItemShared(false, item); + if ((mask = DeviceGroupSharedMask(item))) { + if (item_ptr->flags & DGR_ITEM_FLAG_NO_SHARE) + device_group->no_status_share |= mask; + else if (!building_status_message) + device_group->no_status_share &= ~mask; + if (message_type != DGR_MSGTYPE_UPDATE_COMMAND) { + shared = (!(mask & device_group->no_status_share) && (device_group_index || (mask & Settings.device_group_share_out))); + } + } if (shared) { + if (item_ptr->flags) { + *message_ptr++ = DGR_ITEM_FLAGS; + *message_ptr++ = item_ptr->flags; + } *message_ptr++ = item; // For integer items, add the value to the message. @@ -684,7 +760,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes *message_ptr++ = value & 0xff; value >>= 8; // For the power item, the device count is overlayed onto the highest 8 bits. - if (item == DGR_ITEM_POWER && !value) value = (device_group_index == 0 && first_device_group_is_local ? TasmotaGlobal.devices_present : 1); + if (item == DGR_ITEM_POWER && !value) value = (!Settings.flag4.multiple_device_groups && device_group_index == 0 && first_device_group_is_local ? TasmotaGlobal.devices_present : 1); *message_ptr++ = value; } } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 23de8a3d9..f7c859ee7 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -571,6 +571,9 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source) interlock_mutex = false; } +#ifdef USE_DEVICE_GROUPS + power_t old_power = TasmotaGlobal.power; +#endif // USE_DEVICE_GROUPS switch (state) { case POWER_OFF: { TasmotaGlobal.power &= (POWER_MASK ^ mask); @@ -582,7 +585,7 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source) TasmotaGlobal.power ^= mask; } #ifdef USE_DEVICE_GROUPS - if (SRC_REMOTE != source && SRC_RETRY != source) { + if (TasmotaGlobal.power != old_power && SRC_REMOTE != source && SRC_RETRY != source) { if (Settings.flag4.multiple_device_groups) // SetOption88 - Enable relays in separate device groups SendDeviceGroupMessage(device - 1, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, (TasmotaGlobal.power >> (device - 1)) & 1 | 0x01000000); // Explicitly set number of relays to one else diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index b7a3c60ae..83dacbb51 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -347,7 +347,7 @@ enum DevGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS, DGR_ITEM_FLAGS, //DGR_ITEM_ANALOG1, DGR_ITEM_ANALOG2, DGR_ITEM_ANALOG3, DGR_ITEM_ANALOG4, DGR_ITEM_ANALOG5, // Add new 16-bit items before this line DGR_ITEM_LAST_16BIT, DGR_ITEM_MAX_16BIT = 127, - DGR_ITEM_POWER, + DGR_ITEM_POWER, DGR_ITEM_NO_STATUS_SHARE, // Add new 32-bit items before this line DGR_ITEM_LAST_32BIT, DGR_ITEM_MAX_32BIT = 191, DGR_ITEM_EVENT, DGR_ITEM_COMMAND, @@ -355,6 +355,8 @@ enum DevGroupItem { DGR_ITEM_EOL, DGR_ITEM_STATUS, DGR_ITEM_FLAGS, DGR_ITEM_LAST_STRING, DGR_ITEM_MAX_STRING = 223, DGR_ITEM_LIGHT_CHANNELS }; +enum DevGroupItemFlag { DGR_ITEM_FLAG_NO_SHARE = 1 }; + enum DevGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE_LIGHT_FADE = 4, DGR_SHARE_LIGHT_SCHEME = 8, DGR_SHARE_LIGHT_COLOR = 16, DGR_SHARE_DIMMER_SETTINGS = 32, DGR_SHARE_EVENT = 64 }; diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index bdc334d0e..102d36fa8 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -1730,7 +1730,7 @@ void LightAnimate(void) } if (Light.update) { #ifdef USE_DEVICE_GROUPS - if (Light.power && !Light.devgrp_no_channels_out) LightSendDeviceGroupStatus(false); + if (Light.power && !Light.devgrp_no_channels_out) LightSendDeviceGroupStatus(); #endif // USE_DEVICE_GROUPS uint16_t cur_col_10[LST_MAX]; // 10 bits resolution @@ -2172,21 +2172,24 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) { } #ifdef USE_DEVICE_GROUPS -void LightSendDeviceGroupStatus(bool status) +void LightSendDeviceGroupStatus() { static uint8_t last_bri; uint8_t bri = light_state.getBri(); - bool send_bri_update = (status || bri != last_bri); + bool send_bri_update = (building_status_message || bri != last_bri); if (Light.subtype > LST_SINGLE) { - static uint8_t channels[LST_MAX + 1] = { 0, 0, 0, 0, 0, 0 }; - if (status) { - light_state.getChannels(channels); + static uint8_t last_channels[LST_MAX + 1] = { 0, 0, 0, 0, 0, 0 }; + uint8_t channels[LST_MAX]; + + light_state.getChannelsRaw(channels); + uint8_t color_mode = light_state.getColorMode(); + if (!(color_mode & LCM_RGB)) channels[0] = channels[1] = channels[2] = 0; + if (!(color_mode & LCM_CT)) channels[3] = channels[4] = 0; + if (building_status_message || memcmp(channels, last_channels, LST_MAX)) { + memcpy(last_channels, channels, LST_MAX); + last_channels[LST_MAX]++; + SendDeviceGroupMessage(Light.device_group_index, (send_bri_update ? DGR_MSGTYP_PARTIAL_UPDATE : DGR_MSGTYP_UPDATE), DGR_ITEM_LIGHT_CHANNELS, last_channels); } - else { - memcpy(channels, Light.new_color, LST_MAX); - channels[LST_MAX]++; - } - SendDeviceGroupMessage(Light.device_group_index, (send_bri_update ? DGR_MSGTYP_PARTIAL_UPDATE : DGR_MSGTYP_UPDATE), DGR_ITEM_LIGHT_CHANNELS, channels); } if (send_bri_update) { last_bri = bri; @@ -2199,9 +2202,6 @@ void LightHandleDevGroupItem(void) static bool send_state = false; static bool restore_power = false; -//#ifdef USE_PWM_DIMMER_REMOTE -// if (!(XdrvMailbox.index & DGR_FLAG_LOCAL)) return; -//#endif // USE_PWM_DIMMER_REMOTE if (*XdrvMailbox.topic != Light.device_group_index) return; bool more_to_come; uint32_t value = XdrvMailbox.payload; @@ -2218,7 +2218,7 @@ void LightHandleDevGroupItem(void) LightAnimate(); - TasmotaGlobal.skip_light_fade = true; + TasmotaGlobal.skip_light_fade = false; if (send_state && !more_to_come) { light_controller.saveSettings(); if (Settings.flag3.hass_tele_on_power) { // SetOption59 - Send tele/%topic%/STATE in addition to stat/%topic%/RESULT @@ -2242,8 +2242,9 @@ void LightHandleDevGroupItem(void) } break; case DGR_ITEM_LIGHT_CHANNELS: -#ifdef USE_DGR_LIGHT_SEQUENCE { + uint8_t bri = light_state.getBri(); +#ifdef USE_DGR_LIGHT_SEQUENCE static uint8_t last_sequence = 0; // If a sequence offset is set, set the channels to the ones we received @@ -2259,13 +2260,11 @@ void LightHandleDevGroupItem(void) memcpy(&Light.channels_fifo[last_entry], XdrvMailbox.data, LST_MAX); } } - else { + else #endif // USE_DGR_LIGHT_SEQUENCE light_controller.changeChannels((uint8_t *)XdrvMailbox.data); -#ifdef USE_DGR_LIGHT_SEQUENCE - } + light_controller.changeBri(bri); } -#endif // USE_DGR_LIGHT_SEQUENCE send_state = true; break; case DGR_ITEM_LIGHT_FIXED_COLOR: @@ -2321,7 +2320,7 @@ void LightHandleDevGroupItem(void) case DGR_ITEM_STATUS: SendLocalDeviceGroupMessage(DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade, DGR_ITEM_LIGHT_SPEED, Settings.light_speed, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme); - LightSendDeviceGroupStatus(true); + LightSendDeviceGroupStatus(); break; } } From a91beeb0cf79084e159890ac25044a00003ceb5a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 9 Feb 2021 15:47:20 +0100 Subject: [PATCH 03/19] Add support for transistor-based output without DAC Add support for transistor-based output without DAC (#10875) --- tasmota/tasmota_configurations_ESP32.h | 4 +- tasmota/xdrv_42_i2s_audio.ino | 134 +++++++++++++++---------- 2 files changed, 83 insertions(+), 55 deletions(-) diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index af6d0418f..f4dc57b82 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -79,8 +79,8 @@ #define FALLBACK_MODULE M5STACK_CORE2 // [Module2] Select default module on fast reboot where USER_MODULE is user template #define USE_M5STACK_CORE2 // Add support for M5Stack Core2 - #define SAY_TIME - #define USE_WEBRADIO + #define USE_I2S_SAY_TIME + #define USE_I2S_WEBRADIO #define USE_MPU6886 #define USE_UFILESYS #define USE_SDCARD diff --git a/tasmota/xdrv_42_i2s_audio.ino b/tasmota/xdrv_42_i2s_audio.ino index 359308cba..a63918206 100644 --- a/tasmota/xdrv_42_i2s_audio.ino +++ b/tasmota/xdrv_42_i2s_audio.ino @@ -1,5 +1,5 @@ /* - xdrv_42_i2s_audio.ino - audio dac support for Tasmota + xdrv_42_i2s_audio.ino - Audio dac support for Tasmota Copyright (C) 2021 Gerhard Mutz and Theo Arends @@ -17,16 +17,39 @@ along with this program. If not, see . */ -#if (defined(USE_I2S_AUDIO) || defined(USE_TTGO_WATCH) || defined(USE_M5STACK_CORE2)) +#if (defined(USE_I2S_AUDIO) || defined(USE_TTGO_WATCH) || defined(USE_M5STACK_CORE2)) +/*********************************************************************************************\ + * I2S support using an external DAC or a speaker connected to GPIO03 using a transistor + * + * Uses fixed GPIOs for ESP8266: + * I2S Out Data GPIO03 (Rx) + * I2S Out Bit Clock GPIO15 + * I2S Out Word Select GPIO02 + * I2S In Data GPIO12 + * I2S In Bit Clock GPIO13 + * I2S In Word Select GPIO14 +\*********************************************************************************************/ + +#define XDRV_42 42 + +#define USE_I2S_EXTERNAL_DAC 1 +//#define USE_I2S_NO_DAC // Add support for transistor-based output without DAC +//#define USE_I2S_WEBRADIO // Add support for web radio +//#define USE_I2S_SAY_TIME // Add support for english speaking clock + #include "AudioFileSourcePROGMEM.h" #include "AudioFileSourceID3.h" #include "AudioGeneratorMP3.h" -#include "AudioOutputI2S.h" +#ifdef USE_I2S_NO_DAC + #include "AudioOutputI2SNoDAC.h" // Transistor-driven lower quality connected to RX pin +#else + #include "AudioOutputI2S.h" // External I2S DAC IC +#endif // USE_I2S_NO_DAC #include #include "AudioFileSourceFS.h" -#ifdef SAY_TIME -#include "AudioGeneratorTalkie.h" -#endif +#ifdef USE_I2S_SAY_TIME + #include "AudioGeneratorTalkie.h" +#endif // USE_I2S_SAY_TIME #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorAAC.h" @@ -41,7 +64,7 @@ #undef AUDIO_PWR_OFF #define AUDIO_PWR_ON TTGO_audio_power(true); #define AUDIO_PWR_OFF TTGO_audio_power(false); -#endif // USE_TTGO_WATCH +#endif // USE_TTGO_WATCH #ifdef USE_M5STACK_CORE2 #undef AUDIO_PWR_ON @@ -54,21 +77,19 @@ #define DAC_IIS_BCK 12 #define DAC_IIS_WS 0 #define DAC_IIS_DOUT 2 -#endif // USE_M5STACK_CORE2 - - -#define EXTERNAL_DAC_PLAY 1 - -#define XDRV_42 42 +#endif // USE_M5STACK_CORE2 AudioGeneratorMP3 *mp3 = nullptr; AudioFileSourceFS *file; -AudioOutputI2S *out; +#ifdef USE_I2S_NO_DAC + AudioOutputI2SNoDAC *out; +#else + AudioOutputI2S *out; +#endif // USE_I2S_NO_DAC AudioFileSourceID3 *id3; AudioGeneratorMP3 *decoder = NULL; void *mp3ram = NULL; - extern FS *ufsp; #ifdef ESP8266 @@ -81,7 +102,7 @@ const int preallocateCodecSize = 29192; // MP3 codec max mem needed //const int preallocateCodecSize = 85332; // AAC+SBR codec max mem needed #endif // ESP32 -#ifdef USE_WEBRADIO +#ifdef USE_I2S_WEBRADIO AudioFileSourceICYStream *ifile = NULL; AudioFileSourceBuffer *buff = NULL; char wr_title[64]; @@ -90,11 +111,11 @@ char wr_title[64]; void *preallocateBuffer = NULL; void *preallocateCodec = NULL; uint32_t retryms = 0; -#endif // USE_WEBRADIO +#endif // USE_I2S_WEBRADIO -#ifdef SAY_TIME +#ifdef USE_I2S_SAY_TIME AudioGeneratorTalkie *talkie = nullptr; -#endif // SAY_TIME +#endif // USE_I2S_SAY_TIME //! MAX98357A + INMP441 DOUBLE I2S BOARD #ifdef ESP8266 @@ -111,26 +132,26 @@ AudioGeneratorTalkie *talkie = nullptr; #ifndef DAC_IIS_BCK #undef DAC_IIS_BCK #define DAC_IIS_BCK 26 -#endif // DAC_IIS_BCK +#endif // DAC_IIS_BCK #ifndef DAC_IIS_WS #undef DAC_IIS_WS #define DAC_IIS_WS 25 -#endif // DAC_IIS_WS +#endif // DAC_IIS_WS #ifndef DAC_IIS_DOUT #undef DAC_IIS_DOUT #define DAC_IIS_DOUT 33 -#endif // DAC_IIS_DOUT +#endif // DAC_IIS_DOUT #ifndef DAC_IIS_DIN #undef DAC_IIS_DIN -#define DAC_IIS_DIN 34 -#endif // DAC_IIS_DIN +#define DAC_IIS_DIN 34 +#endif // DAC_IIS_DIN #endif // ESP32 -#ifdef SAY_TIME +#ifdef USE_I2S_SAY_TIME long timezone = 2; byte daysavetime = 1; @@ -229,21 +250,29 @@ void sayTime(int hour, int minutes, AudioGeneratorTalkie *talkie) { out->stop(); AUDIO_PWR_OFF } -#endif // SAY_TIME +#endif // USE_I2S_SAY_TIME // should be in settings uint8_t is2_volume; void I2S_Init(void) { -#if EXTERNAL_DAC_PLAY - out = new AudioOutputI2S(); +#if USE_I2S_EXTERNAL_DAC + #ifdef USE_I2S_NO_DAC + out = new AudioOutputI2SNoDAC(); + #else + out = new AudioOutputI2S(); + #endif // USE_I2S_NO_DAC #ifdef ESP32 - out->SetPinout(DAC_IIS_BCK, DAC_IIS_WS, DAC_IIS_DOUT); + out->SetPinout(DAC_IIS_BCK, DAC_IIS_WS, DAC_IIS_DOUT); #endif // ESP32 #else - out = new AudioOutputI2S(0, 1); -#endif // EXTERNAL_DAC_PLAY + #ifdef USE_I2S_NO_DAC + out = new AudioOutputI2SNoDAC(); + #else + out = new AudioOutputI2S(0, 1); // Internal DAC port 0 + #endif // USE_I2S_NO_DAC +#endif // USE_I2S_EXTERNAL_DAC is2_volume=10; out->SetGain(((float)is2_volume/100.0)*4.0); @@ -255,7 +284,7 @@ void I2S_Init(void) { mp3ram = heap_caps_malloc(preallocateCodecSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); } -#ifdef USE_WEBRADIO +#ifdef USE_I2S_WEBRADIO if (psramFound()) { preallocateBuffer = heap_caps_malloc(preallocateBufferSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); preallocateCodec = heap_caps_malloc(preallocateCodecSize, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); @@ -266,12 +295,11 @@ void I2S_Init(void) { if (!preallocateBuffer || !preallocateCodec) { //Serial.printf_P(PSTR("FATAL ERROR: Unable to preallocate %d bytes for app\n"), preallocateBufferSize+preallocateCodecSize); } -#endif // USE_WEBRADIO -#endif // ESP32 +#endif // USE_I2S_WEBRADIO +#endif // ESP32 } - #ifdef ESP32 #define MODE_MIC 0 #define MODE_SPK 1 @@ -426,7 +454,7 @@ bool SaveWav(char *path, uint8_t *buff, uint32_t size) { return true; } -#endif // ESP32 +#endif // ESP32 #ifdef ESP32 TaskHandle_t mp3_task_h; @@ -447,9 +475,9 @@ void mp3_task(void *arg) { } } } -#endif // ESP32 +#endif // ESP32 -#ifdef USE_WEBRADIO +#ifdef USE_I2S_WEBRADIO void MDCallback(void *cbData, const char *type, bool isUnicode, const char *str) { const char *ptr = reinterpret_cast(cbData); (void) isUnicode; // Punt this ball for now @@ -557,7 +585,7 @@ void Cmd_MicRec(void) { ResponseCmndChar(XdrvMailbox.data); } } -#endif // USE_M5STACK_CORE2 +#endif // USE_M5STACK_CORE2 const char HTTP_WEBRADIO[] PROGMEM = "{s}" "I2S_WR-Title" "{m}%s{e}"; @@ -568,7 +596,7 @@ void I2S_WR_Show(void) { } } -#endif +#endif // USE_I2S_WEBRADIO #ifdef ESP32 void Play_mp3(const char *path) { @@ -610,7 +638,7 @@ void Play_mp3(const char *path) { mp3_delete(); } -#endif // USE_SCRIPT +#endif // USE_SCRIPT } void mp3_delete(void) { @@ -620,7 +648,7 @@ void mp3_delete(void) { mp3=nullptr; AUDIO_PWR_OFF } -#endif // ESP32 +#endif // ESP32 void Say(char *text) { @@ -642,22 +670,22 @@ const char kI2SAudio_Commands[] PROGMEM = "I2S|" "Say|Gain|Time" #ifdef ESP32 "|Play" -#ifdef USE_WEBRADIO +#ifdef USE_I2S_WEBRADIO "|WR" -#endif // USE_WEBRADIO +#endif // USE_I2S_WEBRADIO #ifdef USE_M5STACK_CORE2 "|REC" -#endif // USE_M5STACK_CORE2 -#endif // ESP32 +#endif // USE_M5STACK_CORE2 +#endif // ESP32 ; void (* const I2SAudio_Command[])(void) PROGMEM = { &Cmd_Say, &Cmd_Gain, &Cmd_Time #ifdef ESP32 ,&Cmd_Play -#ifdef USE_WEBRADIO +#ifdef USE_I2S_WEBRADIO ,&Cmd_WebRadio -#endif // USE_WEBRADIO +#endif // USE_I2S_WEBRADIO #ifdef USE_M5STACK_CORE2 ,&Cmd_MicRec #endif // USE_M5STACK_CORE2 @@ -691,9 +719,9 @@ void Cmd_Say(void) { } void Cmd_Time(void) { -#ifdef SAY_TIME +#ifdef USE_I2S_SAY_TIME sayTime(RtcTime.hour, RtcTime.minute, talkie); -#endif // SAY_TIME +#endif // USE_I2S_SAY_TIME ResponseCmndDone(); } @@ -712,12 +740,12 @@ bool Xdrv42(uint8_t function) { I2S_Init(); break; #ifdef USE_WEBSERVER -#ifdef USE_WEBRADIO +#ifdef USE_I2S_WEBRADIO case FUNC_WEB_SENSOR: I2S_WR_Show(); break; -#endif // USE_WEBRADIO -#endif // USE_WEBSERVER +#endif // USE_I2S_WEBRADIO +#endif // USE_WEBSERVER } return result; } From 435be84ff3ed1e5186da312d73ed072a7465b5fa Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Tue, 9 Feb 2021 16:13:40 +0100 Subject: [PATCH 04/19] Add SDM72 Modbus energy meter --- BUILDS.md | 1 + CHANGELOG.md | 3 + tasmota/i18n.h | 2 + tasmota/language/af_AF.h | 6 +- tasmota/language/bg_BG.h | 6 +- tasmota/language/cs_CZ.h | 6 +- tasmota/language/de_DE.h | 6 +- tasmota/language/el_GR.h | 6 +- tasmota/language/en_GB.h | 6 +- tasmota/language/es_ES.h | 6 +- tasmota/language/fr_FR.h | 6 +- tasmota/language/fy_NL.h | 6 +- tasmota/language/he_HE.h | 6 +- tasmota/language/hu_HU.h | 6 +- tasmota/language/it_IT.h | 6 +- tasmota/language/ko_KO.h | 6 +- tasmota/language/nl_NL.h | 6 +- tasmota/language/pl_PL.h | 6 +- tasmota/language/pt_BR.h | 6 +- tasmota/language/pt_PT.h | 6 +- tasmota/language/ro_RO.h | 6 +- tasmota/language/ru_RU.h | 6 +- tasmota/language/sk_SK.h | 6 +- tasmota/language/sv_SE.h | 6 +- tasmota/language/tr_TR.h | 6 +- tasmota/language/uk_UA.h | 6 +- tasmota/language/vi_VN.h | 6 +- tasmota/language/zh_CN.h | 6 +- tasmota/language/zh_TW.h | 6 +- tasmota/my_user_config.h | 3 + tasmota/support_features.ino | 4 +- tasmota/tasmota_configurations.h | 6 + tasmota/tasmota_template.h | 6 + tasmota/xdrv_03_energy.ino | 24 ++-- tasmota/xnrg_18_sdm72.ino | 210 +++++++++++++++++++++++++++++++ tools/decode-status.py | 2 +- 36 files changed, 377 insertions(+), 40 deletions(-) create mode 100644 tasmota/xnrg_18_sdm72.ino diff --git a/BUILDS.md b/BUILDS.md index e882329d9..9cf437df2 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -67,6 +67,7 @@ | USE_PZEM_AC | - | - | x | x | x | - | - | | USE_PZEM_DC | - | - | x | x | x | - | - | | USE_MCP39F501 | - | x | x | x | x | - | - | +| USE_SDM72 | - | - | - | - | x | - | - | | USE_SDM120 | - | - | - | - | x | - | - | | USE_SDM630 | - | - | - | - | x | - | - | | USE_DDS2382 | - | - | - | - | x | - | - | diff --git a/CHANGELOG.md b/CHANGELOG.md index fc723c450..30671cf0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development ## [9.2.0.6] +### Added +- Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862) + ### Changed - Removed migration support for versions before v8.1.0 (Doris) - ESP32 Increase number of switch GPIOs from 8 to 28 diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 0eb558bbe..30b479fc6 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -73,6 +73,7 @@ #define D_JSON_EXPORT "Export" #define D_JSON_EXPORT_ACTIVE "ExportActive" #define D_JSON_EXPORT_REACTIVE "ExportReactive" +#define D_JSON_EXPORT_POWER "ExportPower" #define D_JSON_FAILED "Failed" #define D_JSON_FALLBACKTOPIC "FallbackTopic" #define D_JSON_FEATURES "Features" @@ -99,6 +100,7 @@ #define D_JSON_ID "Id" #define D_JSON_ILLUMINANCE "Illuminance" #define D_JSON_IMPORT_ACTIVE "ImportActive" +#define D_JSON_IMPORT_POWER "ImportPower" #define D_JSON_IMPORT_REACTIVE "ImportReactive" #define D_JSON_INFRARED "Infrared" #define D_JSON_UNKNOWN "Unknown" diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 2a6acd73d..05f4c7154 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Uitvoer krag" +#define D_IMPORT_POWER "Invoer krag" #define D_PHASE_ANGLE "Fasehoek" #define D_IMPORT_ACTIVE "Invoer aktief" #define D_EXPORT_ACTIVE "Uitvoer aktief" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index b5a450bd7..1e6a0d5ef 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -629,6 +629,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -833,7 +835,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Фазов ъгъл" #define D_IMPORT_ACTIVE "Входна активна мощност" #define D_EXPORT_ACTIVE "Изходна активна мощност" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 6449196c5..1f1e4f156 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 1af8a09ac..7817531a5 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Exportiere Leistung" +#define D_IMPORT_POWER "Importiere Leistung" #define D_PHASE_ANGLE "Phasenwinkel" #define D_IMPORT_ACTIVE "Importiere Wirk" #define D_EXPORT_ACTIVE "Exportiere Wirk" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 0409a9696..4fbf89dd9 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 2cde1ccdf..af7cef8d6 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 0147a88f5..8f99d5fb1 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Ángulo de Fase" #define D_IMPORT_ACTIVE "P. Activa Entrante" #define D_EXPORT_ACTIVE "P. Activa Saliente" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 2d2a8aaba..958dca519 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -626,6 +626,8 @@ #define D_SENSOR_SBR_TX "SerBr TX" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 TX" #define D_SENSOR_SDM120_RX "SDMx20 RX" #define D_SENSOR_SDM630_TX "SDM630 TX" @@ -829,7 +831,9 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Angle de phase" #define D_IMPORT_ACTIVE "Énergie act conso" #define D_EXPORT_ACTIVE "Énergie act fournie" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 29167a6c6..1460d1d99 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Eksportearje krêft" +#define D_IMPORT_POWER "Ymportearje krêft" #define D_PHASE_ANGLE "Faze hoeke" #define D_IMPORT_ACTIVE "Ymportearje echt" #define D_EXPORT_ACTIVE "Eksportearje echt" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 11b2e385e..b90029ede 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index f7b862d96..2c74d5134 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Fázisszög" #define D_IMPORT_ACTIVE "Bejövő aktív" #define D_EXPORT_ACTIVE "Kimenő aktív" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index b4f8a0bb4..0543032f3 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr - TX" #define D_SENSOR_SR04_TRIG "SR04 Tri - TX" #define D_SENSOR_SR04_ECHO "SR04 Ech - RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 - TX" #define D_SENSOR_SDM120_RX "SDMx20 - RX" #define D_SENSOR_SDM630_TX "SDM630 - TX" @@ -833,7 +835,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Potenza esportata" +#define D_IMPORT_POWER "Potenza importata" #define D_PHASE_ANGLE "Angolo Fase" #define D_IMPORT_ACTIVE "Potenza attiva importata" #define D_EXPORT_ACTIVE "Potenza attiva esportata" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 22d0b17e1..d96b76f76 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 908e8c576..3c9a0773c 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export vermogen" +#define D_IMPORT_POWER "Import vermogen" #define D_PHASE_ANGLE "Fase hoek" #define D_IMPORT_ACTIVE "Import werkelijk" #define D_EXPORT_ACTIVE "Export werkelijk" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 9a7c2cd03..d477cccd3 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Przesunięcie faz" #define D_IMPORT_ACTIVE "Czynna pobrana" #define D_EXPORT_ACTIVE "Czynna oddana" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 84aef8ede..3660bdaa1 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "W/h" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Ângulo de Fase" #define D_IMPORT_ACTIVE "Importar Ativo" #define D_EXPORT_ACTIVE "Exportar Ativo" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index a02bb9a67..3b4ea2614 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Ângulo de fase" #define D_IMPORT_ACTIVE "Ativo importado" #define D_EXPORT_ACTIVE "Ativo exportado" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 9a1ed142a..c6810406d 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Unghi de fază" #define D_IMPORT_ACTIVE "Import Activ" #define D_EXPORT_ACTIVE "Export Activ" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index a2029c118..8941a770d 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "ВтЧ" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Угол фазы" #define D_IMPORT_ACTIVE "Импорт активной мощности" #define D_EXPORT_ACTIVE "Экспорт активной мощности" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index a7e2f2f9a..e30692e58 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 32708fe6a..dad72de28 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Fasvinkel" #define D_IMPORT_ACTIVE "Import aktiv" #define D_EXPORT_ACTIVE "Export aktiv" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index b45a886e3..ab7d00a31 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Phase Angle" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 8fb58deed..c2c1cbd72 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Вт/г" #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Кут фази" #define D_IMPORT_ACTIVE "Активна вхід" #define D_EXPORT_ACTIVE "Активна вихід" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 1bc4ffe71..e71874381 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "Góc pha" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index bc929c300..186a013eb 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "瓦时" #define D_UNIT_WATT_METER_QUADRAT "瓦/平米" -//SDM220, SDM120, LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "相位角" #define D_IMPORT_ACTIVE "有功输入" #define D_EXPORT_ACTIVE "有功输出" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 51c8d50f8..5a8e3591f 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -630,6 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr Tx" #define D_SENSOR_SR04_TRIG "SR04 Tri/TX" #define D_SENSOR_SR04_ECHO "SR04 Ech/RX" +#define D_SENSOR_SDM72_TX "SDM72 Tx" +#define D_SENSOR_SDM72_RX "SDM72 Rx" #define D_SENSOR_SDM120_TX "SDMx20 Tx" #define D_SENSOR_SDM120_RX "SDMx20 Rx" #define D_SENSOR_SDM630_TX "SDM630 Tx" @@ -834,7 +836,9 @@ #define D_UNIT_WATTHOUR "瓦小時" #define D_UNIT_WATT_METER_QUADRAT "W/m²" -//SDM220、 SDM120、 LE01MR +//SDM220, SDM120, SDM72, LE01MR +#define D_EXPORT_POWER "Export Power" +#define D_IMPORT_POWER "Import Power" #define D_PHASE_ANGLE "相量(Phase Angle)" #define D_IMPORT_ACTIVE "Import Active" #define D_EXPORT_ACTIVE "Export Active" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 25a629c05..fc4becb48 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -682,6 +682,9 @@ #define USE_PZEM_AC // Add support for PZEM014,016 Energy monitor (+1k1 code) #define USE_PZEM_DC // Add support for PZEM003,017 Energy monitor (+1k1 code) #define USE_MCP39F501 // Add support for MCP39F501 Energy monitor as used in Shelly 2 (+3k1 code) +//#define USE_SDM72 // Add support for Eastron SDM72-Modbus energy monitor (+0k3 code) + #define SDM72_SPEED 9600 // SDM72-Modbus RS485 serial speed (default: 9600 baud) + // #define SDM72_IMPEXP // Show additonal import/export active energy and power in MQTT and Web (+0k5 code) //#define USE_SDM120 // Add support for Eastron SDM120-Modbus energy monitor (+1k1 code) #define SDM120_SPEED 2400 // SDM120-Modbus RS485 serial speed (default: 2400 baud) //#define USE_SDM630 // Add support for Eastron SDM630-Modbus energy monitor (+0k6 code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 1d17193e5..8e1766439 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -712,7 +712,9 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_TOF10120) feature7 |= 0x10000000; // xsns_84_tof10120 #endif -// feature7 |= 0x20000000; +#if defined(USE_ENERGY_SENSOR) && defined(USE_SDM72) + feature7 |= 0x20000000; // xnrg_18_sdm72.ino +#endif // feature7 |= 0x40000000; // feature7 |= 0x80000000; } diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index de60b84e1..6d7664f8b 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -185,6 +185,7 @@ #define USE_PZEM_AC // Add support for PZEM014,016 Energy monitor (+1k1 code) #define USE_PZEM_DC // Add support for PZEM003,017 Energy monitor (+1k1 code) #define USE_MCP39F501 // Add support for MCP39F501 Energy monitor as used in Shelly 2 (+3k1 code) +#define USE_SDM72 // Add support for Eastron SDM72-Modbus energy monitor (+0k3 code) #define USE_SDM120 // Add support for Eastron SDM120-Modbus energy monitor (+1k1 code) #define USE_SDM630 // Add support for Eastron SDM630-Modbus energy monitor (+0k6 code) #define USE_DDS2382 // Add support for Hiking DDS2382 Modbus energy monitor (+0k6 code) @@ -287,6 +288,7 @@ #undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor #undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor #undef USE_MCP39F501 // Disable MCP39F501 Energy monitor as used in Shelly 2 + #undef USE_SDM72 // Disable support for Eastron SDM72-Modbus energy meter #undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter #undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code) #undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code) @@ -388,6 +390,7 @@ #undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor #undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor #undef USE_MCP39F501 // Disable MCP39F501 Energy monitor as used in Shelly 2 + #undef USE_SDM72 // Disable support for Eastron SDM72-Modbus energy meter #undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter #undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code) #undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code) @@ -563,6 +566,7 @@ #undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor #undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor #undef USE_MCP39F501 // Disable MCP39F501 Energy monitor as used in Shelly 2 +#undef USE_SDM72 // Disable support for Eastron SDM72-Modbus energy meter #undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter #undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code) #undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code) @@ -700,6 +704,7 @@ #undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor #undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor //#undef USE_MCP39F501 // Disable MCP39F501 Energy monitor as used in Shelly 2 +#undef USE_SDM72 // Disable support for Eastron SDM72-Modbus energy meter #undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter #undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code) #undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code) @@ -841,6 +846,7 @@ #undef USE_PZEM_AC // Disable PZEM014,016 Energy monitor #undef USE_PZEM_DC // Disable PZEM003,017 Energy monitor #undef USE_MCP39F501 // Disable MCP39F501 Energy monitor as used in Shelly 2 +#undef USE_SDM72 // Disable support for Eastron SDM72-Modbus energy meter #undef USE_SDM120 // Disable support for Eastron SDM120-Modbus energy meter #undef USE_SDM630 // Disable support for Eastron SDM630-Modbus energy monitor (+0k6 code) #undef USE_DDS2382 // Disable support for Hiking DDS2382 Modbus energy monitor (+0k6 code) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index dbdc41cce..98567ca42 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -148,6 +148,7 @@ enum UserSelectablePins { GPIO_BS814_CLK, GPIO_BS814_DAT, // Holtek BS814A2 touch ctrlr GPIO_WIEGAND_D0, GPIO_WIEGAND_D1, // Wiegand Data lines GPIO_NEOPOOL_TX, GPIO_NEOPOOL_RX, // Sugar Valley RS485 interface + GPIO_SDM72_TX, GPIO_SDM72_RX, // SDM72 Serial interface GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -316,6 +317,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_BS814_CLK "|" D_SENSOR_BS814_DAT "|" D_SENSOR_WIEGAND_D0 "|" D_SENSOR_WIEGAND_D1 "|" D_SENSOR_NEOPOOL_TX "|" D_SENSOR_NEOPOOL_RX "|" + D_SENSOR_SDM72_TX "|" D_SENSOR_SDM72_RX "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -605,6 +607,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_WE517_TX), // WE517 Serial interface AGPIO(GPIO_WE517_RX), // WE517 Serial interface #endif +#ifdef USE_SDM72 + AGPIO(GPIO_SDM72_TX), // SDM72 Serial interface + AGPIO(GPIO_SDM72_RX), // SDM72 Serial interface +#endif #endif // USE_ENERGY_SENSOR /*-------------------------------------------------------------------------------------------*\ diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index f253838aa..d63472a9d 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -80,9 +80,9 @@ struct ENERGY { float power_factor[3] = { NAN, NAN, NAN }; // 0.12 float frequency[3] = { NAN, NAN, NAN }; // 123.1 Hz -#ifdef SDM630_IMPORT +#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) float import_active[3] = { NAN, NAN, NAN }; // 123.123 kWh -#endif // SDM630_IMPORT +#endif // SDM630_IMPORT || SDM72_IMPEXP float export_active[3] = { NAN, NAN, NAN }; // 123.123 kWh float start_energy = 0; // 12345.12345 kWh total previous @@ -919,10 +919,10 @@ const char HTTP_ENERGY_SNS2[] PROGMEM = const char HTTP_ENERGY_SNS3[] PROGMEM = "{s}" D_EXPORT_ACTIVE "{m}%s " D_UNIT_KILOWATTHOUR "{e}"; -#ifdef SDM630_IMPORT +#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) const char HTTP_ENERGY_SNS4[] PROGMEM = "{s}" D_IMPORT_ACTIVE "{m}%s " D_UNIT_KILOWATTHOUR "{e}"; -#endif // SDM630_IMPORT +#endif // SDM630_IMPORT || SDM72_IMPEXP #endif // USE_WEBSERVER void EnergyShow(bool json) @@ -987,17 +987,17 @@ void EnergyShow(bool json) char voltage_chr[Energy.phase_count][FLOATSZ]; char current_chr[Energy.phase_count][FLOATSZ]; char active_power_chr[Energy.phase_count][FLOATSZ]; -#ifdef SDM630_IMPORT +#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) char import_active_chr[Energy.phase_count][FLOATSZ]; -#endif // SDM630_IMPORT +#endif // SDM630_IMPORT || SDM72_IMPEXP char export_active_chr[Energy.phase_count][FLOATSZ]; for (uint32_t i = 0; i < Energy.phase_count; i++) { dtostrfd(Energy.voltage[i], Settings.flag2.voltage_resolution, voltage_chr[i]); dtostrfd(Energy.current[i], Settings.flag2.current_resolution, current_chr[i]); dtostrfd(Energy.active_power[i], Settings.flag2.wattage_resolution, active_power_chr[i]); -#ifdef SDM630_IMPORT +#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) dtostrfd(Energy.import_active[i], Settings.flag2.energy_resolution, import_active_chr[i]); -#endif // SDM630_IMPORT +#endif // SDM630_IMPORT || SDM72_IMPEXP dtostrfd(Energy.export_active[i], Settings.flag2.energy_resolution, export_active_chr[i]); } @@ -1040,7 +1040,7 @@ void EnergyShow(bool json) energy_yesterday_chr, energy_daily_chr); - #ifdef SDM630_IMPORT + #if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) if (!isnan(Energy.import_active[0])) { ResponseAppend_P(PSTR(",\"" D_JSON_IMPORT_ACTIVE "\":%s"), EnergyFormat(value_chr, import_active_chr[0], json)); @@ -1049,7 +1049,7 @@ void EnergyShow(bool json) EnergyFormatIndex(value_chr, energy_return_chr[0], json, 2)); } } -#endif // SDM630_IMPORT +#endif // SDM630_IMPORT || SDM72_IMPEXP if (!isnan(Energy.export_active[0])) { ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_ACTIVE "\":%s"), @@ -1152,11 +1152,11 @@ void EnergyShow(bool json) if (!isnan(Energy.export_active[0])) { WSContentSend_PD(HTTP_ENERGY_SNS3, EnergyFormat(value_chr, export_active_chr[0], json)); } -#ifdef SDM630_IMPORT +#if defined(SDM630_IMPORT) || defined(SDM72_IMPEXP) if (!isnan(Energy.import_active[0])) { WSContentSend_PD(HTTP_ENERGY_SNS4, EnergyFormat(value_chr, import_active_chr[0], json)); } -#endif // SDM630_IMPORT +#endif // SDM630_IMPORT || SDM72_IMPEXP XnrgCall(FUNC_WEB_SENSOR); #endif // USE_WEBSERVER diff --git a/tasmota/xnrg_18_sdm72.ino b/tasmota/xnrg_18_sdm72.ino new file mode 100644 index 000000000..0da11cba3 --- /dev/null +++ b/tasmota/xnrg_18_sdm72.ino @@ -0,0 +1,210 @@ +/* + xnrg_18_sdm72.ino - Eastron SDM72D-M Modbus energy meter support for Tasmota + + Copyright (C) 2021 Gennaro Tortone, Theo Arends and Norbert Richter + + 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 . +*/ + +#ifdef USE_ENERGY_SENSOR +#ifdef USE_SDM72 +/*********************************************************************************************\ + * Eastron SDM72 Modbus energy meter +\*********************************************************************************************/ + +#define XNRG_18 18 + +// can be user defined in my_user_config.h +#ifndef SDM72_SPEED + #define SDM72_SPEED 9600 // default SDM72 Modbus address +#endif +// can be user defined in my_user_config.h +#ifndef SDM72_ADDR + #define SDM72_ADDR 1 // default SDM72 Modbus address +#endif + +#include +TasmotaModbus *Sdm72Modbus; + +const uint16_t sdm72_register[] { + 0x0034, // 0 SDM72D_POWER [W] + 0x0156, // 3 SDM72D_TOTAL_ACTIVE [kWh] +#ifdef SDM72_IMPEXP + 0x0500, // 1 SDM72D_IMPORT_POWER [W] + 0x0502, // 2 SDM72D_EXPORT_POWER [W] + 0x0048, // 4 SDM72D_IMPORT_ACTIVE [kWh] + 0x004A // 5 SDM72D_EXPORT_ACTIVE [kWh] +#endif // SDM72_IMPEXP +}; + +struct SDM72 { + float total_active = NAN; +#ifdef SDM72_IMPEXP + float import_power = 0; + float export_power = 0; + float import_active = 0; +#endif // SDM72_IMPEXP + uint8_t read_state = 0; + uint8_t send_retry = 0; +} Sdm72; + +/*********************************************************************************************/ + +void Sdm72Every250ms(void) +{ + bool data_ready = Sdm72Modbus->ReceiveReady(); + + if (data_ready) { + uint8_t buffer[14]; // At least 5 + (2 * 2) = 9 + + uint32_t error = Sdm72Modbus->ReceiveBuffer(buffer, 2); + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, buffer, Sdm72Modbus->ReceiveCount()); + + if (error) { + AddLog(LOG_LEVEL_DEBUG, PSTR("SDM: SDM72 error %d"), error); + } else { + Energy.data_valid[0] = 0; + + float value; + ((uint8_t*)&value)[3] = buffer[3]; // Get float values + ((uint8_t*)&value)[2] = buffer[4]; + ((uint8_t*)&value)[1] = buffer[5]; + ((uint8_t*)&value)[0] = buffer[6]; + + switch(Sdm72.read_state) { + case 0: + Energy.active_power[0] = value; // W + break; + + case 1: + Sdm72.total_active = value; // kWh + break; + +#ifdef SDM72_IMPEXP + case 2: + Sdm72.import_power = value; // W + break; + + case 3: + Sdm72.export_power = value; // W + break; + + case 4: + Energy.import_active[0] = value; // kWh + break; + + case 5: + Energy.export_active[0] = value; // kWh + break; +#endif // SDM72_IMPEXP + } + + ++Sdm72.read_state %= ARRAY_SIZE(sdm72_register); + if (0 == Sdm72.read_state && !isnan(Sdm72.total_active)) { + EnergyUpdateTotal(Sdm72.total_active, true); + } + } + } // end data ready + + if (0 == Sdm72.send_retry || data_ready) { + Sdm72.send_retry = 5; + Sdm72Modbus->Send(SDM72_ADDR, 0x04, sdm72_register[Sdm72.read_state], 2); + } else { + Sdm72.send_retry--; + } +} + +void Sdm72SnsInit(void) +{ + Sdm72Modbus = new TasmotaModbus(Pin(GPIO_SDM72_RX), Pin(GPIO_SDM72_TX)); + uint8_t result = Sdm72Modbus->Begin(SDM72_SPEED); + if (result) { + if (2 == result) { + ClaimSerial(); + } + } else { + TasmotaGlobal.energy_driver = ENERGY_NONE; + } +} + +void Sdm72DrvInit(void) +{ + if (PinUsed(GPIO_SDM72_RX) && PinUsed(GPIO_SDM72_TX)) { + Energy.voltage_available = false; + Energy.current_available = false; + TasmotaGlobal.energy_driver = XNRG_18; + } +} + +#ifdef USE_WEBSERVER +#ifdef SDM72_IMPEXP +const char HTTP_ENERGY_SDM72[] PROGMEM = + "{s}" D_EXPORT_POWER "{m}%*_f " D_UNIT_WATT "{e}" + "{s}" D_IMPORT_POWER "{m}%*_f " D_UNIT_WATT "{e}"; +#endif // SDM72_IMPEXP +#endif // USE_WEBSERVER + +void Sdm72Show(bool json) +{ + if (isnan(Sdm72.total_active)) { return; } + + if (json) { +#ifdef SDM72_IMPEXP + ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_POWER "\":%*_f,\"" D_JSON_IMPORT_POWER "\":%*_f"), + Settings.flag2.wattage_resolution, &Sdm72.export_power, + Settings.flag2.wattage_resolution, &Sdm72.import_power); +#endif // SDM72_IMPEXP +#ifdef USE_WEBSERVER + } else { +#ifdef SDM72_IMPEXP + WSContentSend_PD(HTTP_ENERGY_SDM72, + Settings.flag2.wattage_resolution, &Sdm72.export_power, + Settings.flag2.wattage_resolution, &Sdm72.import_power); +#endif // SDM72_IMPEXP +#endif // USE_WEBSERVER + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xnrg18(uint8_t function) +{ + bool result = false; + + switch (function) { + case FUNC_EVERY_250_MSECOND: + Sdm72Every250ms(); + break; + case FUNC_JSON_APPEND: + Sdm72Show(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Sdm72Show(0); + break; +#endif // USE_WEBSERVER + case FUNC_INIT: + Sdm72SnsInit(); + break; + case FUNC_PRE_INIT: + Sdm72DrvInit(); + break; + } + return result; +} + +#endif // USE_SDM72 +#endif // USE_ENERGY_SENSOR diff --git a/tools/decode-status.py b/tools/decode-status.py index 040ae94d4..995d0e111 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -245,7 +245,7 @@ a_features = [[ "USE_DISPLAY_ILI9488","USE_DISPLAY_SSD1351","USE_DISPLAY_RA8876","USE_DISPLAY_ST7789", "USE_DISPLAY_SSD1331","USE_UFILESYS","USE_TIMEPROP","USE_PID", "USE_BS814A2","USE_SEESAW_SOIL","USE_WIEGAND","USE_NEOPOOL", - "USE_TOF10120","","","" + "USE_TOF10120","USE_SDM72","","" ],[ "","","","", "","","","", From 76cffab6a4651579f97abe8a4bca1bc712cfa9a5 Mon Sep 17 00:00:00 2001 From: mikep1998 <44448320+mikep1998@users.noreply.github.com> Date: Tue, 9 Feb 2021 09:45:30 -0800 Subject: [PATCH 05/19] Update xdrv_27_shutter.ino --- tasmota/xdrv_27_shutter.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 4b7836452..e35a09e1c 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -458,7 +458,7 @@ void ShutterPowerOff(uint8_t i) { switch (ShutterGlobal.position_mode) { case SHT_PWM_VALUE: char scmnd[20]; - snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM " %d" ),Shutter[i].pwm_value); + snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d %d" ),i ,Shutter[i].pwm_value); // Add device number to PWM command ExecuteCommand(scmnd, SRC_BUTTON); break; } From e086c62fbb15fe14245c3fccde2780a12eb16c55 Mon Sep 17 00:00:00 2001 From: mikep1998 <44448320+mikep1998@users.noreply.github.com> Date: Tue, 9 Feb 2021 09:55:13 -0800 Subject: [PATCH 06/19] Update xdrv_27_shutter.ino Fix shutter pwm command to include device number and update loggin information. --- tasmota/xdrv_27_shutter.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index e35a09e1c..589355075 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -429,7 +429,7 @@ void ShutterDecellerateForStop(uint8_t i) } void ShutterPowerOff(uint8_t i) { - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop Shutter %d. Switchmode %d"), i,Shutter[i].switch_mode); + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Stop Shutter %d. Switchmode %d"), i+1,Shutter[i].switch_mode); // fix log to indicate correct shutter number ShutterDecellerateForStop(i); switch (Shutter[i].switch_mode) { case SHT_SWITCH: @@ -458,7 +458,8 @@ void ShutterPowerOff(uint8_t i) { switch (ShutterGlobal.position_mode) { case SHT_PWM_VALUE: char scmnd[20]; - snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d %d" ),i ,Shutter[i].pwm_value); // Add device number to PWM command + AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Setting PWM%d. value: %d"), i+1,Shutter[i].pwm_value); + snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d %d" ),i+1 ,Shutter[i].pwm_value); // Add device number to PWM command ExecuteCommand(scmnd, SRC_BUTTON); break; } From e990f9002b73421732fa12ae0ae9aba0f2a338a6 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 9 Feb 2021 20:41:53 +0100 Subject: [PATCH 07/19] Prepare RISCV --- lib/default/Ext-printf/src/ext_printf.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/default/Ext-printf/src/ext_printf.cpp b/lib/default/Ext-printf/src/ext_printf.cpp index cab08a9ff..157b2b30a 100644 --- a/lib/default/Ext-printf/src/ext_printf.cpp +++ b/lib/default/Ext-printf/src/ext_printf.cpp @@ -31,6 +31,8 @@ * This will allow to modify it in place and call back printf with altered arguments \*********************************************************************************************/ +#if defined(__XTENSA__) // this works only for xtensa, other platforms needs va_list to be adapted + // This code is heavily inspired by the gcc implementation of va_list // https://github.com/gcc-mirror/gcc/blob/master/gcc/config/xtensa/xtensa.c @@ -124,6 +126,18 @@ void * __va_cur_ptr4(va_list &va) { // >>> Reading a_ptr=0x3FFFFD70 *a_ptr=6 // >>> Reading a_ptr=0x3FFFFD74 *a_ptr=7 // >>> Reading a_ptr=0x3FFFFD78 *a_ptr=8 +#elif defined(__RISC_V__) +// #define __va_argsiz_tas(t) (((sizeof(t) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) +#define va_cur_ptr4(va,T) ( (T*) __va_cur_ptr4(va) ) +void * __va_cur_ptr4(va_list &va) { + uintptr_t * va_ptr = (uintptr_t*) &va; + void * cur_ptr = (void*) *va_ptr; + *va_ptr += 4; + return cur_ptr; +} +#else // __XTENSA__, __RISCV__ + #error "ext_printf is not suppoerted on this platform" +#endif // __XTENSA__, __RISCV__ /*********************************************************************************************\ * Genral function to convert u64 to hex @@ -202,7 +216,6 @@ int32_t ext_vsnprintf_P(char * buf, size_t buf_len, const char * fmt_P, va_list va_list va_cpy; va_copy(va_cpy, va); -#if defined(ESP8266) || defined(ESP32) // this works only for xtensa, other platforms needs va_list to be adapted // iterate on fmt to extract arguments and patch them in place char * fmt_cpy = copyStr(fmt_P); if (fmt_cpy == nullptr) { return 0; } @@ -362,9 +375,6 @@ int32_t ext_vsnprintf_P(char * buf, size_t buf_len, const char * fmt_P, va_list } } } -#else // defined(ESP8266) || defined(ESP32) - #error "ext_printf is not suppoerted on this platform" -#endif // defined(ESP8266) || defined(ESP32) // Serial.printf("> format_final=%s\n", fmt_cpy); Serial.flush(); int32_t ret = vsnprintf_P(buf, buf_len, fmt_cpy, va_cpy); From 60252a9043b9a31cb699f8826f21c296c6e6dec2 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Tue, 9 Feb 2021 15:10:32 -0600 Subject: [PATCH 08/19] Add DGR device map support --- tasmota/i18n.h | 1 + tasmota/settings.h | 2 +- tasmota/settings.ino | 3 ++ tasmota/support_command.ino | 16 +++++++-- tasmota/support_device_groups.ino | 57 +++++++++++++++++-------------- tasmota/support_tasmota.ino | 9 ++--- tasmota/tasmota_globals.h | 1 - tasmota/tasmota_version.h | 2 +- tasmota/xdrv_04_light.ino | 23 +++++-------- tasmota/xdrv_10_rules.ino | 2 +- tasmota/xdrv_35_pwm_dimmer.ino | 15 ++++---- 11 files changed, 73 insertions(+), 58 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 0eb558bbe..8976c769f 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -324,6 +324,7 @@ #define D_CMND_SPEEDUNIT "SpeedUnit" #define D_CMND_I2CSCAN "I2CScan" #define D_CMND_I2CDRIVER "I2CDriver" +#define D_CMND_DEVGROUP_DEVICE "DevGroupDevice" #define D_CMND_DEVGROUP_NAME "DevGroupName" #define D_CMND_DEVGROUP_SEND "DevGroupSend" #define D_CMND_DEVGROUP_SHARE "DevGroupShare" diff --git a/tasmota/settings.h b/tasmota/settings.h index 2719268ea..4ddcb90b0 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -631,7 +631,7 @@ struct { // Only 32 bit boundary variables below uint64_t rf_protocol_mask; // FA8 - uint32_t device_group_maps; // FB0 + uint8_t device_group_device[4]; // FB0 SysBitfield5 flag5; // FB4 uint16_t pulse_counter_debounce_low; // FB8 uint16_t pulse_counter_debounce_high; // FBA diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 9878e7678..a9c7500b5 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -1232,6 +1232,9 @@ void SettingsDelta(void) { Settings.interlock[i] = (i < 4) ? Settings.ex_interlock[i] : 0; } } + if (Settings.version < 0x09020007) { + *(uint32_t *)&Settings.device_group_device = 0x04030201; + } Settings.version = VERSION; SettingsSave(1); diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 7272cd2ab..5d3e20559 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -32,7 +32,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix D_CMND_I2CSCAN "|" D_CMND_I2CDRIVER "|" #endif #ifdef USE_DEVICE_GROUPS - D_CMND_DEVGROUP_NAME "|" + D_CMND_DEVGROUP_DEVICE "|" D_CMND_DEVGROUP_NAME "|" #ifdef USE_DEVICE_GROUPS_SEND D_CMND_DEVGROUP_SEND "|" #endif // USE_DEVICE_GROUPS_SEND @@ -59,7 +59,7 @@ void (* const TasmotaCommand[])(void) PROGMEM = { &CmndI2cScan, CmndI2cDriver, #endif #ifdef USE_DEVICE_GROUPS - &CmndDevGroupName, + &CmndDevGroupDevice, &CmndDevGroupName, #ifdef USE_DEVICE_GROUPS_SEND &CmndDevGroupSend, #endif // USE_DEVICE_GROUPS_SEND @@ -2052,6 +2052,16 @@ void CmndI2cDriver(void) #endif // USE_I2C #ifdef USE_DEVICE_GROUPS +void CmndDevGroupDevice(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) { + if (XdrvMailbox.data_len > 0) { + Settings.device_group_device[XdrvMailbox.index - 1] = XdrvMailbox.payload; + } + ResponseCmndIdxNumber(Settings.device_group_device[XdrvMailbox.index - 1]); + } +} + void CmndDevGroupName(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) { @@ -2072,7 +2082,7 @@ void CmndDevGroupSend(void) { uint8_t device_group_index = (XdrvMailbox.usridx ? XdrvMailbox.index - 1 : 0); if (device_group_index < device_group_count) { - if (!_SendDeviceGroupMessage(device_group_index, (DevGroupMessageType)(DGR_MSGTYPE_UPDATE_COMMAND + DGR_MSGTYPFLAG_WITH_LOCAL))) { + if (!_SendDeviceGroupMessage(-device_group_index, (DevGroupMessageType)(DGR_MSGTYPE_UPDATE_COMMAND + DGR_MSGTYPFLAG_WITH_LOCAL))) { ResponseCmndChar(XdrvMailbox.data); } } diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index cef0dd3af..13f5522c8 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -448,7 +448,7 @@ write_log: if (received) { if ((flags & DGR_FLAG_STATUS_REQUEST)) { if ((flags & DGR_FLAG_RESET) || device_group_member->acked_sequence != device_group->last_full_status_sequence) { - _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS); + _SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_FULL_STATUS); } } } @@ -479,7 +479,7 @@ cleanup: } } -bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType message_type, ...) +bool _SendDeviceGroupMessage(uint32_t device, DevGroupMessageType message_type, ...) { // If device groups is not up, ignore this request. if (!device_groups_up) return 1; @@ -492,11 +492,16 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes if (ignore_dgr_sends && message_type != DGR_MSGTYPE_UPDATE_COMMAND) return 0; // If device is < 0, the device group index is the device negated. If not, get the device group - // index from the device group maps. -// uint8_t device_group_index = -device; -// if (device > 0) device_group_index = (Settings.device_group_maps >> (device - 1) * 3 & 0x7 - 1; - - // If the device group index is higher then the number of device groups, ignore this request. + // index for this device. + uint8_t device_group_index = -device; + if (device > 0) { + device_group_index = 0; + if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups + for (; device_group_index < device_group_count; device_group_index++) { + if (Settings.device_group_device[device_group_index] == device) break; + } + } + } if (device_group_index >= device_group_count) return 0; // Get a pointer to the device information for this device. @@ -507,7 +512,7 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes // Load the message header, sequence and flags. #ifdef DEVICE_GROUPS_DEBUG - AddLog(LOG_LEVEL_DEBUG, PSTR("DGR: Building %s %spacket"), device_group->group_name, (message_type == DGR_MSGTYP_FULL_STATUS ? PSTR("full status ") : PSTR(""))); + AddLog(LOG_LEVEL_DEBUG, PSTR("DGR: Building %s %spacket"), device_group->group_name, (message_type == DGR_MSGTYP_FULL_STATUS ? PSTR("full status ") : PSTR(""))); #endif // DEVICE_GROUPS_DEBUG uint16_t original_sequence = device_group->outgoing_sequence; uint16_t flags = 0; @@ -531,10 +536,9 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes // Call the drivers to build the status update. power_t power = TasmotaGlobal.power; if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups - power >>= device_group_index; - power &= 1; + power = (power >> (Settings.device_group_device[device_group_index] - 1)) & 1; } - SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_NO_STATUS_SHARE, device_group->no_status_share, DGR_ITEM_POWER, power); + SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_NO_STATUS_SHARE, device_group->no_status_share, DGR_ITEM_POWER, power); XdrvMailbox.index = 0; if (device_group_index == 0 && first_device_group_is_local) XdrvMailbox.index = DGR_FLAG_LOCAL; XdrvMailbox.command_code = DGR_ITEM_STATUS; @@ -620,22 +624,25 @@ bool _SendDeviceGroupMessage(uint8_t device_group_index, DevGroupMessageType mes switch (item) { case DGR_ITEM_LIGHT_CHANNELS: { - int i = 0; char * endptr; value = strtoul((char *)value_ptr, &endptr, 10); - if ((*endptr && *endptr != ',' && *endptr != ' ') || value > 255) { - for (; i < 6; i++) { - if (!*value_ptr || *value_ptr == ' ') break; - uint8_t * next_value_ptr = value_ptr + 2; - uint8_t save_char = *next_value_ptr; - *next_value_ptr = 'X'; - *out_ptr++ = strtoul((char *)value_ptr, (char **)&value_ptr, 16); - *next_value_ptr = save_char; + bool hex = (*endptr != ','); + for (int i = 0; i < 6; i++) { + *out_ptr = 0; + if (*value_ptr != ' ') { + if (hex) { + endptr = (char *)value_ptr + 2; + chr = *endptr; + *endptr = 0; + *out_ptr = strtoul((char *)value_ptr, (char **)&value_ptr, 16); + *endptr = chr; + } + else { + *out_ptr = strtoul((char *)value_ptr, (char **)&value_ptr, 10); + if (*value_ptr == ',') value_ptr++; + } } - } - for (; i < 6; i++) { - *out_ptr++ = (*value_ptr == ' ' ? 0 : strtoul((char *)value_ptr, (char **)&value_ptr, 10)); - if (*value_ptr == ',') value_ptr++; + out_ptr++; } } break; @@ -933,7 +940,7 @@ AddLog(LOG_LEVEL_DEBUG, PSTR("DGR: Checking next_check_time=%u, now=%u"), next_c // If we've sent the initial status request message the set number of times, send our // status to all the members. else { - _SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_FULL_STATUS); + _SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_FULL_STATUS); } } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index f7c859ee7..807c794ed 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -586,10 +586,11 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source) } #ifdef USE_DEVICE_GROUPS if (TasmotaGlobal.power != old_power && SRC_REMOTE != source && SRC_RETRY != source) { - if (Settings.flag4.multiple_device_groups) // SetOption88 - Enable relays in separate device groups - SendDeviceGroupMessage(device - 1, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, (TasmotaGlobal.power >> (device - 1)) & 1 | 0x01000000); // Explicitly set number of relays to one - else - SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, TasmotaGlobal.power); + power_t dgr_power = TasmotaGlobal.power; + if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups + dgr_power = (dgr_power >> (device - 1)) & 1; + } + SendDeviceGroupMessage(device, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, TasmotaGlobal.power); } #endif // USE_DEVICE_GROUPS SetDevicePower(TasmotaGlobal.power, source); diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h index 8058db126..71e345b2b 100644 --- a/tasmota/tasmota_globals.h +++ b/tasmota/tasmota_globals.h @@ -471,7 +471,6 @@ const char kWebColors[] PROGMEM = #ifdef USE_DEVICE_GROUPS #define SendDeviceGroupMessage(DEVICE_INDEX, REQUEST_TYPE, ...) _SendDeviceGroupMessage(DEVICE_INDEX, REQUEST_TYPE, __VA_ARGS__, 0) -#define SendLocalDeviceGroupMessage(REQUEST_TYPE, ...) _SendDeviceGroupMessage(0, REQUEST_TYPE, __VA_ARGS__, 0) uint8_t device_group_count = 0; bool first_device_group_is_local = true; #endif // USE_DEVICE_GROUPS diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index e0ccb2a6b..ec0ef2dcf 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x09020006; +const uint32_t VERSION = 0x09020007; #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 102d36fa8..48ba6cfce 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -234,7 +234,6 @@ struct LIGHT { bool fade_initialized = false; // dont't fade at startup bool fade_running = false; #ifdef USE_DEVICE_GROUPS - uint8_t device_group_index; uint8_t last_scheme = 0; bool devgrp_no_channels_out = false; // don't share channels with device group (e.g. if scheme set by other device) #ifdef USE_DGR_LIGHT_SEQUENCE @@ -1118,12 +1117,6 @@ void LightInit(void) Light.device--; // we take the last two devices as lights } LightCalcPWMRange(); -#ifdef USE_DEVICE_GROUPS - Light.device_group_index = 0; - if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups - Light.device_group_index = Light.device - 1; - } -#endif // USE_DEVICE_GROUPS #ifdef DEBUG_LIGHT AddLog_P(LOG_LEVEL_DEBUG_MORE, "LightInit Light.pwm_multi_channels=%d Light.subtype=%d Light.device=%d TasmotaGlobal.devices_present=%d", Light.pwm_multi_channels, Light.subtype, Light.device, TasmotaGlobal.devices_present); @@ -1708,7 +1701,7 @@ void LightAnimate(void) #ifdef USE_DEVICE_GROUPS if (Settings.light_scheme != Light.last_scheme) { Light.last_scheme = Settings.light_scheme; - SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme); + SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme); Light.devgrp_no_channels_out = false; } #endif // USE_DEVICE_GROUPS @@ -2188,12 +2181,12 @@ void LightSendDeviceGroupStatus() if (building_status_message || memcmp(channels, last_channels, LST_MAX)) { memcpy(last_channels, channels, LST_MAX); last_channels[LST_MAX]++; - SendDeviceGroupMessage(Light.device_group_index, (send_bri_update ? DGR_MSGTYP_PARTIAL_UPDATE : DGR_MSGTYP_UPDATE), DGR_ITEM_LIGHT_CHANNELS, last_channels); + SendDeviceGroupMessage(Light.device, (send_bri_update ? DGR_MSGTYP_PARTIAL_UPDATE : DGR_MSGTYP_UPDATE), DGR_ITEM_LIGHT_CHANNELS, last_channels); } } if (send_bri_update) { last_bri = bri; - SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, light_state.getBri()); + SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, light_state.getBri()); } } @@ -2202,7 +2195,7 @@ void LightHandleDevGroupItem(void) static bool send_state = false; static bool restore_power = false; - if (*XdrvMailbox.topic != Light.device_group_index) return; + if (Settings.device_group_device[*XdrvMailbox.topic] != Light.device) return; bool more_to_come; uint32_t value = XdrvMailbox.payload; switch (XdrvMailbox.command_code) { @@ -2318,7 +2311,7 @@ void LightHandleDevGroupItem(void) } break; case DGR_ITEM_STATUS: - SendLocalDeviceGroupMessage(DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade, + SendDeviceGroupMessage(Light.device, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade, DGR_ITEM_LIGHT_SPEED, Settings.light_speed, DGR_ITEM_LIGHT_SCHEME, Settings.light_scheme); LightSendDeviceGroupStatus(); break; @@ -2742,7 +2735,7 @@ void CmndDimmer(void) uint8_t bri = light_state.getBri(); if (bri != Settings.bri_power_on) { Settings.bri_power_on = bri; - SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on); + SendDeviceGroupMessage(Light.device, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on); } #endif // USE_PWM_DIMMER && USE_DEVICE_GROUPS Light.update = true; @@ -2849,7 +2842,7 @@ void CmndFade(void) break; } #ifdef USE_DEVICE_GROUPS - if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade); + if (XdrvMailbox.payload >= 0 && XdrvMailbox.payload <= 2) SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_FADE, Settings.light_fade); #endif // USE_DEVICE_GROUPS if (!Settings.light_fade) { Light.fade_running = false; } ResponseCmndStateText(Settings.light_fade); @@ -2883,7 +2876,7 @@ void CmndSpeed(void) if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 40)) { Settings.light_speed = XdrvMailbox.payload; #ifdef USE_DEVICE_GROUPS - SendDeviceGroupMessage(Light.device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SPEED, Settings.light_speed); + SendDeviceGroupMessage(Light.device, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_SPEED, Settings.light_speed); #endif // USE_DEVICE_GROUPS } ResponseCmndNumber(Settings.light_speed); diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index fc52aee8a..cdf374a27 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -2191,7 +2191,7 @@ void CmndEvent(void) if (XdrvMailbox.data_len > 0) { strlcpy(Rules.event_data, XdrvMailbox.data, sizeof(Rules.event_data)); #ifdef USE_DEVICE_GROUPS - SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_EVENT, XdrvMailbox.data); + SendDeviceGroupMessage(1, DGR_MSGTYP_UPDATE, DGR_ITEM_EVENT, XdrvMailbox.data); #endif // USE_DEVICE_GROUPS } if (XdrvMailbox.command) ResponseCmndDone(); diff --git a/tasmota/xdrv_35_pwm_dimmer.ino b/tasmota/xdrv_35_pwm_dimmer.ino index 3bce167a2..892f05da9 100644 --- a/tasmota/xdrv_35_pwm_dimmer.ino +++ b/tasmota/xdrv_35_pwm_dimmer.ino @@ -252,11 +252,11 @@ void PWMDimmerHandleDevGroupItem(void) #ifdef USE_PWM_DIMMER_REMOTE if (is_local) #endif // USE_PWM_DIMMER_REMOTE - SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on, + SendDeviceGroupMessage(0, DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_POWER_ON, Settings.bri_power_on, DGR_ITEM_BRI_PRESET_LOW, Settings.bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, Settings.bri_preset_high); #ifdef USE_PWM_DIMMER_REMOTE else - SendDeviceGroupMessage(device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, remote_pwm_dimmer->power_on, + SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, remote_pwm_dimmer->power_on, DGR_ITEM_BRI_POWER_ON, remote_pwm_dimmer->bri_power_on, DGR_ITEM_BRI_PRESET_LOW, remote_pwm_dimmer->bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, remote_pwm_dimmer->bri_preset_high); #endif // USE_PWM_DIMMER_REMOTE @@ -491,6 +491,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed) } // If we need to adjust the brightness, do it. + uint32_t negated_device_group_index = -power_button_index; if (bri_offset) { int32_t bri; #ifdef USE_PWM_DIMMER_REMOTE @@ -509,7 +510,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed) } if (new_bri != bri) { #ifdef USE_DEVICE_GROUPS - SendDeviceGroupMessage(power_button_index, (dgr_more_to_come ? DGR_MSGTYP_UPDATE_MORE_TO_COME : DGR_MSGTYP_UPDATE_DIRECT), DGR_ITEM_LIGHT_BRI, new_bri); + SendDeviceGroupMessage(negated_device_group_index, (dgr_more_to_come ? DGR_MSGTYP_UPDATE_MORE_TO_COME : DGR_MSGTYP_UPDATE_DIRECT), DGR_ITEM_LIGHT_BRI, new_bri); #endif // USE_DEVICE_GROUPS #ifdef USE_PWM_DIMMER_REMOTE if (active_remote_pwm_dimmer) { @@ -559,9 +560,9 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed) } #endif // USE_PWM_DIMMER_REMOTE if (new_power) - SendDeviceGroupMessage(power_button_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, power_on_bri, DGR_ITEM_POWER, new_power); + SendDeviceGroupMessage(negated_device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_LIGHT_BRI, power_on_bri, DGR_ITEM_POWER, new_power); else - SendDeviceGroupMessage(power_button_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, new_power); + SendDeviceGroupMessage(negated_device_group_index, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, new_power); #endif // USE_DEVICE_GROUPS #ifdef USE_PWM_DIMMER_REMOTE if (active_remote_pwm_dimmer) @@ -639,7 +640,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed) if (handle_tap) #endif // USE_PWM_DIMMER_REMOTE message_type = (DevGroupMessageType)(message_type + DGR_MSGTYPFLAG_WITH_LOCAL); - SendDeviceGroupMessage(power_button_index, message_type, dgr_item, dgr_value); + SendDeviceGroupMessage(negated_device_group_index, message_type, dgr_item, dgr_value); #endif // USE_DEVICE_GROUPS #ifdef USE_PWM_DIMMER_REMOTE if (!active_remote_pwm_dimmer) @@ -697,7 +698,7 @@ void CmndBriPreset(void) Settings.bri_preset_high = parm[0]; } #ifdef USE_DEVICE_GROUPS - SendLocalDeviceGroupMessage(DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_PRESET_LOW, Settings.bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, Settings.bri_preset_high); + SendDeviceGroupMessage(0, DGR_MSGTYP_UPDATE, DGR_ITEM_BRI_PRESET_LOW, Settings.bri_preset_low, DGR_ITEM_BRI_PRESET_HIGH, Settings.bri_preset_high); #endif // USE_DEVICE_GROUPS } } From 133826c33191db1ff8e6d34b8693d91389f64dd5 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Tue, 9 Feb 2021 15:42:14 -0600 Subject: [PATCH 09/19] Use device map for received power item --- tasmota/support_device_groups.ino | 5 +++-- tasmota/support_tasmota.ino | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index 13f5522c8..36ad56db5 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -401,9 +401,10 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de switch (item) { case DGR_ITEM_POWER: if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups - if (device_group_index < TasmotaGlobal.devices_present) { + uint32_t device = Settings.device_group_device[device_group_index]; + if (device) { bool on = (value & 1); - if (on != (TasmotaGlobal.power & (1 << device_group_index))) ExecuteCommandPower(device_group_index + 1, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); + if (on != ((TasmotaGlobal.power >> (device - 1)) & 1)) ExecuteCommandPower(device, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); } } else if (XdrvMailbox.index & DGR_FLAG_LOCAL) { diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 807c794ed..07f776f5c 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -590,7 +590,7 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source) if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups dgr_power = (dgr_power >> (device - 1)) & 1; } - SendDeviceGroupMessage(device, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, TasmotaGlobal.power); + SendDeviceGroupMessage(device, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, dgr_power); } #endif // USE_DEVICE_GROUPS SetDevicePower(TasmotaGlobal.power, source); From 212ea2717078af5a921592a68e2aa5e95a3ea60f Mon Sep 17 00:00:00 2001 From: mikep1998 <44448320+mikep1998@users.noreply.github.com> Date: Tue, 9 Feb 2021 14:51:38 -0800 Subject: [PATCH 10/19] Update xdrv_27_shutter.ino Add #define to turn off servo in ShutterPowerOff. --- tasmota/xdrv_27_shutter.ino | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 589355075..b99499165 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -458,8 +458,12 @@ void ShutterPowerOff(uint8_t i) { switch (ShutterGlobal.position_mode) { case SHT_PWM_VALUE: char scmnd[20]; - AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Setting PWM%d. value: %d"), i+1,Shutter[i].pwm_value); - snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d %d" ),i+1 ,Shutter[i].pwm_value); // Add device number to PWM command +#ifdef SHUTTER_CLEAR_PWM_ONSTOP + // free the PWM servo lock on stop. + snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d 0" ), i+1); +#else + snprintf_P(scmnd, sizeof(scmnd), PSTR(D_CMND_PWM "%d %d" ), i+1,Shutter[i].pwm_value); +#endif ExecuteCommand(scmnd, SRC_BUTTON); break; } From 83298b2a9ebd46c30f277ab5a8fba61ba02c32f9 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Tue, 9 Feb 2021 21:22:43 -0600 Subject: [PATCH 11/19] Rename DevGroupDevice to DevGroupTie --- tasmota/i18n.h | 2 +- tasmota/settings.h | 2 +- tasmota/settings.ino | 2 +- tasmota/support_command.ino | 28 ++++++++++++++-------------- tasmota/support_device_groups.ino | 6 +++--- tasmota/xdrv_04_light.ino | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 8976c769f..27cd842ca 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -324,11 +324,11 @@ #define D_CMND_SPEEDUNIT "SpeedUnit" #define D_CMND_I2CSCAN "I2CScan" #define D_CMND_I2CDRIVER "I2CDriver" -#define D_CMND_DEVGROUP_DEVICE "DevGroupDevice" #define D_CMND_DEVGROUP_NAME "DevGroupName" #define D_CMND_DEVGROUP_SEND "DevGroupSend" #define D_CMND_DEVGROUP_SHARE "DevGroupShare" #define D_CMND_DEVGROUPSTATUS "DevGroupStatus" +#define D_CMND_DEVGROUP_DEVICE "DevGroupTie" #define D_CMND_SERIALSEND "SerialSend" #define D_CMND_SERIALDELIMITER "SerialDelimiter" #define D_CMND_BAUDRATE "Baudrate" diff --git a/tasmota/settings.h b/tasmota/settings.h index 4ddcb90b0..5f8484ea0 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -631,7 +631,7 @@ struct { // Only 32 bit boundary variables below uint64_t rf_protocol_mask; // FA8 - uint8_t device_group_device[4]; // FB0 + uint8_t device_group_tie[4]; // FB0 SysBitfield5 flag5; // FB4 uint16_t pulse_counter_debounce_low; // FB8 uint16_t pulse_counter_debounce_high; // FBA diff --git a/tasmota/settings.ino b/tasmota/settings.ino index a9c7500b5..9a9d9dcb6 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -1233,7 +1233,7 @@ void SettingsDelta(void) { } } if (Settings.version < 0x09020007) { - *(uint32_t *)&Settings.device_group_device = 0x04030201; + *(uint32_t *)&Settings.device_group_tie = 0x04030201; } Settings.version = VERSION; diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 5d3e20559..139631e74 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -32,11 +32,11 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix D_CMND_I2CSCAN "|" D_CMND_I2CDRIVER "|" #endif #ifdef USE_DEVICE_GROUPS - D_CMND_DEVGROUP_DEVICE "|" D_CMND_DEVGROUP_NAME "|" + D_CMND_DEVGROUP_NAME "|" #ifdef USE_DEVICE_GROUPS_SEND D_CMND_DEVGROUP_SEND "|" #endif // USE_DEVICE_GROUPS_SEND - D_CMND_DEVGROUP_SHARE "|" D_CMND_DEVGROUPSTATUS "|" + D_CMND_DEVGROUP_SHARE "|" D_CMND_DEVGROUPSTATUS "|" D_CMND_DEVGROUP_DEVICE "|" #endif // USE_DEVICE_GROUPS D_CMND_SENSOR "|" D_CMND_DRIVER #ifdef ESP32 @@ -59,11 +59,11 @@ void (* const TasmotaCommand[])(void) PROGMEM = { &CmndI2cScan, CmndI2cDriver, #endif #ifdef USE_DEVICE_GROUPS - &CmndDevGroupDevice, &CmndDevGroupName, + &CmndDevGroupName, #ifdef USE_DEVICE_GROUPS_SEND &CmndDevGroupSend, #endif // USE_DEVICE_GROUPS_SEND - &CmndDevGroupShare, &CmndDevGroupStatus, + &CmndDevGroupShare, &CmndDevGroupStatus, &CmndDevGroupTie, #endif // USE_DEVICE_GROUPS &CmndSensor, &CmndDriver #ifdef ESP32 @@ -2052,16 +2052,6 @@ void CmndI2cDriver(void) #endif // USE_I2C #ifdef USE_DEVICE_GROUPS -void CmndDevGroupDevice(void) -{ - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) { - if (XdrvMailbox.data_len > 0) { - Settings.device_group_device[XdrvMailbox.index - 1] = XdrvMailbox.payload; - } - ResponseCmndIdxNumber(Settings.device_group_device[XdrvMailbox.index - 1]); - } -} - void CmndDevGroupName(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) { @@ -2102,6 +2092,16 @@ void CmndDevGroupStatus(void) { DeviceGroupStatus((XdrvMailbox.usridx ? XdrvMailbox.index - 1 : 0)); } + +void CmndDevGroupTie(void) +{ + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DEV_GROUP_NAMES)) { + if (XdrvMailbox.data_len > 0) { + Settings.device_group_tie[XdrvMailbox.index - 1] = XdrvMailbox.payload; + } + ResponseCmndIdxNumber(Settings.device_group_tie[XdrvMailbox.index - 1]); + } +} #endif // USE_DEVICE_GROUPS void CmndSensor(void) diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index 36ad56db5..b651443bb 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -401,7 +401,7 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de switch (item) { case DGR_ITEM_POWER: if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups - uint32_t device = Settings.device_group_device[device_group_index]; + uint32_t device = Settings.device_group_tie[device_group_index]; if (device) { bool on = (value & 1); if (on != ((TasmotaGlobal.power >> (device - 1)) & 1)) ExecuteCommandPower(device, (on ? POWER_ON : POWER_OFF), SRC_REMOTE); @@ -499,7 +499,7 @@ bool _SendDeviceGroupMessage(uint32_t device, DevGroupMessageType message_type, device_group_index = 0; if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups for (; device_group_index < device_group_count; device_group_index++) { - if (Settings.device_group_device[device_group_index] == device) break; + if (Settings.device_group_tie[device_group_index] == device) break; } } } @@ -537,7 +537,7 @@ bool _SendDeviceGroupMessage(uint32_t device, DevGroupMessageType message_type, // Call the drivers to build the status update. power_t power = TasmotaGlobal.power; if (Settings.flag4.multiple_device_groups) { // SetOption88 - Enable relays in separate device groups - power = (power >> (Settings.device_group_device[device_group_index] - 1)) & 1; + power = (power >> (Settings.device_group_tie[device_group_index] - 1)) & 1; } SendDeviceGroupMessage(-device_group_index, DGR_MSGTYP_PARTIAL_UPDATE, DGR_ITEM_NO_STATUS_SHARE, device_group->no_status_share, DGR_ITEM_POWER, power); XdrvMailbox.index = 0; diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 48ba6cfce..2d8c2ec5b 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -2195,7 +2195,7 @@ void LightHandleDevGroupItem(void) static bool send_state = false; static bool restore_power = false; - if (Settings.device_group_device[*XdrvMailbox.topic] != Light.device) return; + if (Settings.device_group_tie[*XdrvMailbox.topic] != Light.device) return; bool more_to_come; uint32_t value = XdrvMailbox.payload; switch (XdrvMailbox.command_code) { From d8fa00fa075d89e4a046316dc08837aa1d2da0e4 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Tue, 9 Feb 2021 21:40:37 -0600 Subject: [PATCH 12/19] Use # prefix for color channel hex value --- tasmota/support_device_groups.ino | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index b651443bb..1a412ab3f 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -625,9 +625,12 @@ bool _SendDeviceGroupMessage(uint32_t device, DevGroupMessageType message_type, switch (item) { case DGR_ITEM_LIGHT_CHANNELS: { + bool hex = false; char * endptr; - value = strtoul((char *)value_ptr, &endptr, 10); - bool hex = (*endptr != ','); + if (*value_ptr == '#') { + value_ptr++; + hex = true; + } for (int i = 0; i < 6; i++) { *out_ptr = 0; if (*value_ptr != ' ') { From 223dadb06b41f2031c9a0bc3dd06a8f8fedd3645 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Tue, 9 Feb 2021 22:01:18 -0600 Subject: [PATCH 13/19] Fix DevGroupSend invert operator default value --- tasmota/support_device_groups.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index 1a412ab3f..1bc6ba956 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -604,10 +604,10 @@ bool _SendDeviceGroupMessage(uint32_t device, DevGroupMessageType message_type, oper = value_ptr[1]; value_ptr += 2; } - value = (isdigit(*value_ptr) ? strtoul((char *)value_ptr, (char **)&value_ptr, 0) : 1); + value = (isdigit(*value_ptr) ? strtoul((char *)value_ptr, (char **)&value_ptr, 0) : oper == '^' ? 0xffffffff : 1); if (oper) { old_value = (item <= DGR_ITEM_MAX_8BIT ? device_group->values_8bit[item] : (item <= DGR_ITEM_MAX_16BIT ? device_group->values_16bit[item - DGR_ITEM_MAX_8BIT - 1] : device_group->values_32bit[item - DGR_ITEM_MAX_16BIT - 1])); - value = (oper == '+' ? old_value + value : oper == '-' ? old_value - value : oper == '^' ? old_value ^ (value ? value : 0xffffffff) : oper == '|' ? old_value | value : old_value == '&' ? old_value & value : old_value); + value = (oper == '+' ? old_value + value : oper == '-' ? old_value - value : oper == '^' ? old_value ^ value : oper == '|' ? old_value | value : old_value == '&' ? old_value & value : old_value); } item_ptr->value = value; } From 74d99c669a863cfeacd80e8e570980889ea6081a Mon Sep 17 00:00:00 2001 From: Yves De Muyter Date: Wed, 10 Feb 2021 11:15:23 +0100 Subject: [PATCH 14/19] Bring ModeSet value out of the for loop, this ModeSet is repeated for every other value on the webpage. --- tasmota/xdrv_16_tuyamcu.ino | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 98e3370e8..5f94e576d 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -1336,13 +1336,16 @@ void TuyaSensorsShow(bool json) break; } } - if (AsModuleTuyaMS()) { - WSContentSend_P(PSTR("{s}" D_JSON_IRHVAC_MODE "{m}%d{e}"), Tuya.ModeSet); - } #endif // USE_WEBSERVER } } + #ifdef USE_WEBSERVER + if (AsModuleTuyaMS()) { + WSContentSend_P(PSTR("{s}" D_JSON_IRHVAC_MODE "{m}%d{e}"), Tuya.ModeSet); + } + #endif // USE_WEBSERVER + if (RootName) { ResponseJsonEnd();} } From 946b3c2653628f76392297d9fa46fa5945b20913 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Wed, 10 Feb 2021 11:44:49 +0100 Subject: [PATCH 15/19] move renderer, add touch display slider --- .../.gitignore | 0 .../.travis.yml | 0 .../Arduino/epd2in9-demo/epd2in9-demo.ino | 0 .../Arduino/libraries/readme.txt | 0 .../LICENSE | 0 .../Makefile | 0 .../README.md | 0 .../components/epaper-29-ws/component.mk | 0 .../components/epaper-29-ws/epaper-29-ws.c | 0 .../components/epaper-29-ws/epaper-29-ws.h | 0 .../components/epaper-29-ws/epaper_font.c | 0 .../components/epaper-29-ws/epaper_fonts.h | 0 .../components/epaper-29-ws/font16.c | 0 .../components/epaper-29-ws/font20.c | 0 .../components/epaper-29-ws/font8.c | 0 .../components/epaper-29-ws/imagedata.cpp | 0 .../components/epaper-29-ws/imagedata.h | 0 .../docs/Doxyfile | 0 .../docs/Makefile | 0 .../docs/README.md | 0 .../docs/conf.py | 0 .../docs/gen-dxd.py | 0 .../docs/index.rst | 0 .../docs/link-roles.py | 0 .../docs/repo_util.py | 0 .../docs/requirements.txt | 0 .../library.properties | 0 .../main/README.md | 0 .../main/component.mk | 0 .../main/esp-epaper-29-ws.c | 0 .../main/imagedata.c | 0 .../main/imagedata.h | 0 .../pictures/2.9inch_e-Paper_Datasheet.pdf | Bin .../pictures/e-paper-and-esp-sample-image.jpg | Bin .../pictures/e-paper-and-esp-sample-text.jpg | Bin .../pictures/espresif-logo.bmp | Bin .../pictures/image-conversion-setup.png | Bin .../src/epdif.cpp | 0 .../src/epdif.h | 0 .../src/epdpaint.cpp | 0 .../src/epdpaint.h | 0 .../src/font12.c | 0 .../src/font16.c | 0 .../src/font20.c | 0 .../src/font24.c | 0 .../src/font8.c | 0 .../src/fonts.h | 0 .../src/renderer.cpp | 90 ++++++++++ .../src/renderer.h | 19 ++- .../src => Epaper_29-gemu-1.0}/epd2in9.cpp | 0 .../src => Epaper_29-gemu-1.0}/epd2in9.h | 0 .../src => Epaper_42-gemu-1.0}/epd4in2.cpp | 0 .../src => Epaper_42-gemu-1.0}/epd4in2.h | 0 tasmota/xdrv_13_display.ino | 154 +++++++++++------- 54 files changed, 205 insertions(+), 58 deletions(-) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/.gitignore (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/.travis.yml (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/Arduino/epd2in9-demo/epd2in9-demo.ino (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/Arduino/libraries/readme.txt (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/LICENSE (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/Makefile (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/README.md (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/component.mk (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper-29-ws.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper-29-ws.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper_font.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/epaper_fonts.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/font16.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/font20.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/font8.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/imagedata.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/components/epaper-29-ws/imagedata.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/Doxyfile (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/Makefile (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/README.md (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/conf.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/gen-dxd.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/index.rst (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/link-roles.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/repo_util.py (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/docs/requirements.txt (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/library.properties (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/README.md (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/component.mk (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/esp-epaper-29-ws.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/imagedata.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/main/imagedata.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/2.9inch_e-Paper_Datasheet.pdf (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/e-paper-and-esp-sample-image.jpg (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/e-paper-and-esp-sample-text.jpg (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/espresif-logo.bmp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/pictures/image-conversion-setup.png (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdif.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdif.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdpaint.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/epdpaint.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font12.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font16.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font20.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font24.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/font8.c (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/fonts.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/renderer.cpp (82%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1 => Display_Renderer-gemu-1.0}/src/renderer.h (82%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_29-gemu-1.0}/epd2in9.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_29-gemu-1.0}/epd2in9.h (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_42-gemu-1.0}/epd4in2.cpp (100%) rename lib/lib_display/{esp-epaper-29-ws-20171230-gemu-1.1/src => Epaper_42-gemu-1.0}/epd4in2.h (100%) diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.gitignore b/lib/lib_display/Display_Renderer-gemu-1.0/.gitignore similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.gitignore rename to lib/lib_display/Display_Renderer-gemu-1.0/.gitignore diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.travis.yml b/lib/lib_display/Display_Renderer-gemu-1.0/.travis.yml similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/.travis.yml rename to lib/lib_display/Display_Renderer-gemu-1.0/.travis.yml diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/epd2in9-demo/epd2in9-demo.ino b/lib/lib_display/Display_Renderer-gemu-1.0/Arduino/epd2in9-demo/epd2in9-demo.ino similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/epd2in9-demo/epd2in9-demo.ino rename to lib/lib_display/Display_Renderer-gemu-1.0/Arduino/epd2in9-demo/epd2in9-demo.ino diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/libraries/readme.txt b/lib/lib_display/Display_Renderer-gemu-1.0/Arduino/libraries/readme.txt similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Arduino/libraries/readme.txt rename to lib/lib_display/Display_Renderer-gemu-1.0/Arduino/libraries/readme.txt diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/LICENSE b/lib/lib_display/Display_Renderer-gemu-1.0/LICENSE similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/LICENSE rename to lib/lib_display/Display_Renderer-gemu-1.0/LICENSE diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Makefile b/lib/lib_display/Display_Renderer-gemu-1.0/Makefile similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/Makefile rename to lib/lib_display/Display_Renderer-gemu-1.0/Makefile diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/README.md b/lib/lib_display/Display_Renderer-gemu-1.0/README.md similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/README.md rename to lib/lib_display/Display_Renderer-gemu-1.0/README.md diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/component.mk b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/component.mk similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/component.mk rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/component.mk diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.c rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.h b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper-29-ws.h rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper-29-ws.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_font.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_font.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_font.c rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_font.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_fonts.h b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_fonts.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/epaper_fonts.h rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/epaper_fonts.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font16.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font16.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font16.c rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font16.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font20.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font20.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font20.c rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font20.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font8.c b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font8.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/font8.c rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/font8.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.cpp similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.cpp rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.cpp diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.h b/lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/components/epaper-29-ws/imagedata.h rename to lib/lib_display/Display_Renderer-gemu-1.0/components/epaper-29-ws/imagedata.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Doxyfile b/lib/lib_display/Display_Renderer-gemu-1.0/docs/Doxyfile similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Doxyfile rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/Doxyfile diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Makefile b/lib/lib_display/Display_Renderer-gemu-1.0/docs/Makefile similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/Makefile rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/Makefile diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/README.md b/lib/lib_display/Display_Renderer-gemu-1.0/docs/README.md similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/README.md rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/README.md diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/conf.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/conf.py similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/conf.py rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/conf.py diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/gen-dxd.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/gen-dxd.py similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/gen-dxd.py rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/gen-dxd.py diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/index.rst b/lib/lib_display/Display_Renderer-gemu-1.0/docs/index.rst similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/index.rst rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/index.rst diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/link-roles.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/link-roles.py similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/link-roles.py rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/link-roles.py diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/repo_util.py b/lib/lib_display/Display_Renderer-gemu-1.0/docs/repo_util.py similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/repo_util.py rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/repo_util.py diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/requirements.txt b/lib/lib_display/Display_Renderer-gemu-1.0/docs/requirements.txt similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/docs/requirements.txt rename to lib/lib_display/Display_Renderer-gemu-1.0/docs/requirements.txt diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/library.properties b/lib/lib_display/Display_Renderer-gemu-1.0/library.properties similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/library.properties rename to lib/lib_display/Display_Renderer-gemu-1.0/library.properties diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/README.md b/lib/lib_display/Display_Renderer-gemu-1.0/main/README.md similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/README.md rename to lib/lib_display/Display_Renderer-gemu-1.0/main/README.md diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/component.mk b/lib/lib_display/Display_Renderer-gemu-1.0/main/component.mk similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/component.mk rename to lib/lib_display/Display_Renderer-gemu-1.0/main/component.mk diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/esp-epaper-29-ws.c b/lib/lib_display/Display_Renderer-gemu-1.0/main/esp-epaper-29-ws.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/esp-epaper-29-ws.c rename to lib/lib_display/Display_Renderer-gemu-1.0/main/esp-epaper-29-ws.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.c b/lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.c rename to lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.h b/lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/main/imagedata.h rename to lib/lib_display/Display_Renderer-gemu-1.0/main/imagedata.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/2.9inch_e-Paper_Datasheet.pdf b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/2.9inch_e-Paper_Datasheet.pdf similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/2.9inch_e-Paper_Datasheet.pdf rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/2.9inch_e-Paper_Datasheet.pdf diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-image.jpg b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-image.jpg similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-image.jpg rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-image.jpg diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-text.jpg b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-text.jpg similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/e-paper-and-esp-sample-text.jpg rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/e-paper-and-esp-sample-text.jpg diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/espresif-logo.bmp b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/espresif-logo.bmp similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/espresif-logo.bmp rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/espresif-logo.bmp diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/image-conversion-setup.png b/lib/lib_display/Display_Renderer-gemu-1.0/pictures/image-conversion-setup.png similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/pictures/image-conversion-setup.png rename to lib/lib_display/Display_Renderer-gemu-1.0/pictures/image-conversion-setup.png diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.cpp similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.cpp rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.cpp diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdif.h rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdif.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.cpp similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.cpp rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.cpp diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epdpaint.h rename to lib/lib_display/Display_Renderer-gemu-1.0/src/epdpaint.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font12.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font12.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font12.c rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font12.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font16.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font16.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font16.c rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font16.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font20.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font20.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font20.c rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font20.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font24.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font24.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font24.c rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font24.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font8.c b/lib/lib_display/Display_Renderer-gemu-1.0/src/font8.c similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/font8.c rename to lib/lib_display/Display_Renderer-gemu-1.0/src/font8.c diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/fonts.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/fonts.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/fonts.h rename to lib/lib_display/Display_Renderer-gemu-1.0/src/fonts.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp similarity index 82% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp rename to lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp index bd3f83c86..31b62f1e2 100644 --- a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp @@ -531,6 +531,96 @@ void VButton::xdrawButton(bool inverted) { wr_redir=0; } +boolean VButton::didhit(int16_t x, int16_t y) { + return ((x >= spars.xp) && (x < (int16_t) (spars.xp + spars.xs)) && + (y >= spars.yp) && (y < (int16_t) (spars.yp + spars.ys))); +} + +void VButton::SliderInit(Renderer *renderer, uint16_t xp, uint16_t yp, uint16_t xs, uint16_t ys, uint16_t nelem, uint16_t bgcol, uint16_t frcol, uint16_t barcol) { + spars.xp = xp; + spars.yp = yp; + spars.xs = xs; + spars.ys = ys; + spars.nelem = nelem; + spars.bgcol = bgcol; + spars.frcol = frcol; + spars.barcol = barcol; + rend = renderer; + + rend->fillRect(spars.xp, spars.yp, spars.xs, spars.ys, spars.bgcol); + + if (xs < ys) { + float bxs = spars.xs - 6; + float bys = (float)(spars.ys - 6) / (float)nelem; + float bxp = xp + 3; + float byp = yp + 3; + for (uint32_t count = 0; count < spars.nelem; count++) { + rend->fillRect(bxp, byp, bxs, bys - 3, spars.barcol); + rend->drawRect(bxp, byp, bxs, bys - 3, spars.frcol); + byp += bys; + } + } else { + float bys = spars.ys - 6; + float bxs = (float)(spars.xs - 6) / (float)nelem; + float byp = yp + 3; + float bxp = xp + 3; + for (uint32_t count = 0; count < spars.nelem; count++) { + rend->fillRect(bxp, byp, bxs - 3 , bys, spars.barcol); + rend->drawRect(bxp, byp, bxs - 3, bys, spars.frcol); + bxp += bxs; + } + } +} + +uint16_t VButton::UpdateSlider(int16_t x, int16_t y) { + uint16_t elems = spars.nelem + 1; + + if (x < 0) { + x = spars.xp + (-x * spars.xs) / 100; + y = spars.yp + (spars.ys - (-y * spars.ys) / 100); + } + + if (spars.xs < spars.ys) { + uint16_t dy = spars.ys - (y - spars.yp); + uint16_t limit = elems - ((float)dy /(float)spars.ys * elems); + float bxs = spars.xs - 6; + float bys = (float)(spars.ys - 6) / (float)spars.nelem; + float bxp = spars.xp + 3; + float byp = spars.yp + 3; + uint16_t col; + for (uint32_t count = 0; count < spars.nelem; count++) { + if (count >= limit) { + col = spars.barcol; + } else { + col = spars.bgcol; + } + rend->fillRect(bxp, byp, bxs, bys - 3, col); + rend->drawRect(bxp, byp, bxs, bys - 3, spars.frcol); + byp += bys; + } + return 100 - (float(y - spars.yp) / (float)spars.ys) * 100.0; + } else { + uint16_t limit = (x - spars.xp) * elems / spars.xs; + float bys = spars.ys - 6; + float bxs = (float)(spars.xs - 6) / (float)spars.nelem; + float byp = spars.yp + 3; + float bxp = spars.xp + 3; + uint16_t col; + for (uint32_t count = 0; count < spars.nelem; count++) { + if (count < limit) { + col = spars.barcol; + } else { + col = spars.bgcol; + } + rend->fillRect(bxp, byp, bxs - 3, bys, col); + rend->drawRect(bxp, byp, bxs - 3 , bys, spars.frcol); + bxp += bxs; + } + return (float(x - spars.xp) / (float)spars.xs) * 100.0; + } + +} + diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h similarity index 82% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h rename to lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h index 261363956..b50745686 100644 --- a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h @@ -53,7 +53,7 @@ typedef union { uint8_t spare0 : 1; uint8_t spare1 : 1; uint8_t spare2 : 1; - uint8_t spare3 : 1; + uint8_t slider : 1; uint8_t disable : 1; uint8_t on_off : 1; uint8_t is_pushbutton : 1; @@ -61,10 +61,27 @@ typedef union { }; } TButton_State; + +struct Slider { + uint16_t xp; + uint16_t yp; + uint16_t xs; + uint16_t ys; + uint16_t nelem; + uint16_t bgcol; + uint16_t frcol; + uint16_t barcol; +}; + class VButton : public Adafruit_GFX_Button { public: TButton_State vpower; + struct Slider spars; + Renderer *rend; void xdrawButton(bool inverted); + boolean didhit(int16_t x, int16_t y); + uint16_t UpdateSlider(int16_t x, int16_t y); + void SliderInit(Renderer *rend, uint16_t xp, uint16_t yp, uint16_t xs, uint16_t ys, uint16_t nelem, uint16_t bgcol, uint16_t frcol, uint16_t barcol); }; diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.cpp b/lib/lib_display/Epaper_29-gemu-1.0/epd2in9.cpp similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.cpp rename to lib/lib_display/Epaper_29-gemu-1.0/epd2in9.cpp diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.h b/lib/lib_display/Epaper_29-gemu-1.0/epd2in9.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd2in9.h rename to lib/lib_display/Epaper_29-gemu-1.0/epd2in9.h diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.cpp b/lib/lib_display/Epaper_42-gemu-1.0/epd4in2.cpp similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.cpp rename to lib/lib_display/Epaper_42-gemu-1.0/epd4in2.cpp diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.h b/lib/lib_display/Epaper_42-gemu-1.0/epd4in2.h similarity index 100% rename from lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/epd4in2.h rename to lib/lib_display/Epaper_42-gemu-1.0/epd4in2.h diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index a9b9f7d33..817898d56 100755 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -497,7 +497,7 @@ void DisplayText(void) cp += var; linebuf[fill] = 0; break; -#if (defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT)) || defined(USE_UFILESYS) +#ifdef USE_UFILESYS case 'P': { char *ep=strchr(cp,':'); if (ep) { @@ -508,7 +508,7 @@ void DisplayText(void) } } break; -#endif // USE_SCRIPT_FATFS +#endif // USE_UFILESYS case 'h': // hor line to var = atoiv(cp, &temp); @@ -765,17 +765,17 @@ void DisplayText(void) #ifdef USE_TOUCH_BUTTONS case 'b': - { int16_t num,gxp,gyp,gxs,gys,outline,fill,textcolor,textsize; uint8_t dflg=1; - if (*cp=='e' || *cp=='d') { + { int16_t num, gxp, gyp, gxs, gys, outline, fill, textcolor, textsize; uint8_t dflg = 1, sbt = 0; + if (*cp == 'e' || *cp == 'd') { // enable disable - uint8_t dis=0; - if (*cp=='d') dis=1; + uint8_t dis = 0; + if (*cp == 'd') dis = 1; cp++; - var=atoiv(cp,&num); - num=num%MAX_TOUCH_BUTTONS; - cp+=var; + var = atoiv(cp, &num); + num = num % MAX_TOUCH_BUTTONS; + cp += var; if (buttons[num]) { - buttons[num]->vpower.disable=dis; + buttons[num]->vpower.disable = dis; if (!dis) { if (buttons[num]->vpower.is_virtual) buttons[num]->xdrawButton(buttons[num]->vpower.on_off); else buttons[num]->xdrawButton(bitRead(TasmotaGlobal.power,num)); @@ -783,15 +783,33 @@ void DisplayText(void) } break; } - if (*cp=='-') { + if (*cp == '-') { cp++; - dflg=0; + dflg = 0; + } + if (*cp == 's') { + cp++; + sbt = 1; } var=atoiv(cp,&num); cp+=var; - cp++; uint8_t bflags=num>>8; num=num%MAX_TOUCH_BUTTONS; + if (*cp == 's') { + cp++; + var=atoiv(cp,&gxp); + if (buttons[num]) { + // set slider or button + if (buttons[num]->vpower.slider) { + buttons[num]->UpdateSlider(-gxp, -gxp); + } else { + buttons[num]->vpower.on_off = gxp; + buttons[num]->xdrawButton(buttons[num]->vpower.on_off); + } + } + break; + } + cp++; var=atoiv(cp,&gxp); cp+=var; cp++; @@ -818,32 +836,42 @@ void DisplayText(void) cp++; // text itself char bbuff[32]; - cp=get_string(bbuff,sizeof(bbuff),cp); - + if (!sbt) { + // text itself + cp = get_string(bbuff, sizeof(bbuff), cp); + } if (buttons[num]) { delete buttons[num]; } if (renderer) { buttons[num]= new VButton(); if (buttons[num]) { - buttons[num]->initButtonUL(renderer,gxp,gyp,gxs,gys,renderer->GetColorFromIndex(outline),\ - renderer->GetColorFromIndex(fill),renderer->GetColorFromIndex(textcolor),bbuff,textsize); - if (!bflags) { - // power button - if (dflg) buttons[num]->xdrawButton(bitRead(TasmotaGlobal.power,num)); - buttons[num]->vpower.is_virtual=0; - } else { - // virtual button - buttons[num]->vpower.is_virtual=1; - if (bflags==2) { - // push - buttons[num]->vpower.is_pushbutton=1; + if (!sbt) { + buttons[num]->vpower.slider = 0; + buttons[num]->initButtonUL(renderer, gxp, gyp, gxs, gys, renderer->GetColorFromIndex(outline),\ + renderer->GetColorFromIndex(fill), renderer->GetColorFromIndex(textcolor), bbuff, textsize); + if (!bflags) { + // power button + if (dflg) buttons[num]->xdrawButton(bitRead(TasmotaGlobal.power, num)); + buttons[num]->vpower.is_virtual = 0; } else { - // toggle - buttons[num]->vpower.is_pushbutton=0; + // virtual button + buttons[num]->vpower.is_virtual = 1; + if (bflags==2) { + // push + buttons[num]->vpower.is_pushbutton = 1; + } else { + // toggle + buttons[num]->vpower.is_pushbutton = 0; + } + if (dflg) buttons[num]->xdrawButton(buttons[num]->vpower.on_off); + buttons[num]->vpower.disable = !dflg; } - if (dflg) buttons[num]->xdrawButton(buttons[num]->vpower.on_off); - buttons[num]->vpower.disable=!dflg; + } else { + // slider + buttons[num]->vpower.slider = 1; + buttons[num]->SliderInit(renderer, gxp, gyp, gxs, gys, outline, renderer->GetColorFromIndex(fill),\ + renderer->GetColorFromIndex(textcolor), renderer->GetColorFromIndex(textsize)); } } } @@ -1575,7 +1603,7 @@ char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short * #endif // JPEG_PICTS #endif // ESP32 -#if (defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT)) || defined(USE_UFILESYS) +#ifdef USE_UFILESYS extern FS *ufsp; #define XBUFF_LEN 128 void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp, bool inverted ) { @@ -1675,7 +1703,7 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp, bool inverted ) { #endif // ESP32 } } -#endif // USE_SCRIPT_FATFS +#endif // USE_UFILESYS #ifdef USE_AWATCH #define MINUTE_REDUCT 4 @@ -2188,9 +2216,11 @@ uint8_t vbutt=0; //AddLog(LOG_LEVEL_INFO, PSTR("touch %d - %d"), pLoc.x, pLoc.y); // now must compare with defined buttons - for (uint8_t count=0; countvpower.disable) { - if (buttons[count]->contains(pLoc.x, pLoc.y)) { + for (uint8_t count = 0; count < MAX_TOUCH_BUTTONS; count++) { + if (buttons[count]) { + if (!buttons[count]->vpower.slider) { + if (!buttons[count]->vpower.disable) { + if (buttons[count]->contains(pLoc.x, pLoc.y)) { // did hit buttons[count]->press(true); if (buttons[count]->justPressed()) { @@ -2216,12 +2246,20 @@ uint8_t vbutt=0; Touch_MQTT(count, cp, buttons[count]->vpower.on_off); } } + } + if (!buttons[count]->vpower.is_virtual) { + rbutt++; + } else { + vbutt++; + } } - if (!buttons[count]->vpower.is_virtual) { - rbutt++; - } else { - vbutt++; + } else { + // slider + if (buttons[count]->didhit(pLoc.x, pLoc.y)) { + uint16_t value = buttons[count]->UpdateSlider(pLoc.x, pLoc.y); + Touch_MQTT(count, "SLD", value); } + } } } } @@ -2237,27 +2275,29 @@ uint8_t vbutt=0; } } #endif - for (uint8_t count=0; countpress(false); - if (buttons[count]->justReleased()) { - if (buttons[count]->vpower.is_virtual) { - if (buttons[count]->vpower.is_pushbutton) { - // push button - buttons[count]->vpower.on_off = 0; - Touch_MQTT(count,"PBT", buttons[count]->vpower.on_off); - buttons[count]->xdrawButton(buttons[count]->vpower.on_off); + if (!buttons[count]->vpower.slider) { + buttons[count]->press(false); + if (buttons[count]->justReleased()) { + if (buttons[count]->vpower.is_virtual) { + if (buttons[count]->vpower.is_pushbutton) { + // push button + buttons[count]->vpower.on_off = 0; + Touch_MQTT(count,"PBT", buttons[count]->vpower.on_off); + buttons[count]->xdrawButton(buttons[count]->vpower.on_off); + } } } - } - if (!buttons[count]->vpower.is_virtual) { - // check if power button stage changed - uint8_t pwr = bitRead(TasmotaGlobal.power, rbutt); - uint8_t vpwr = buttons[count]->vpower.on_off; - if (pwr != vpwr) { - Touch_RDW_BUTT(count, pwr); + if (!buttons[count]->vpower.is_virtual) { + // check if power button stage changed + uint8_t pwr = bitRead(TasmotaGlobal.power, rbutt); + uint8_t vpwr = buttons[count]->vpower.on_off; + if (pwr != vpwr) { + Touch_RDW_BUTT(count, pwr); + } + rbutt++; } - rbutt++; } } } From c41373d7ef46466f0cb58aeb5a9edb2c2709602f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 10 Feb 2021 13:51:53 +0100 Subject: [PATCH 16/19] warning if ESP8266 firmware is too big --- pio-tools/gzip-firmware.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index bb1759123..14e030f20 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -29,6 +29,9 @@ if env["PIOPLATFORM"] != "espressif32": ORG_FIRMWARE_SIZE = os.stat(bin_file).st_size GZ_FIRMWARE_SIZE = os.stat(gzip_file).st_size - print("Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format((GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE)) - + if ORG_FIRMWARE_SIZE > 995326: + print("\u001b[31;1m!!! Tasmota firmware size is too big with {} bytes. Max size is 995326 bytes !!! \u001b[0m".format(ORG_FIRMWARE_SIZE)) + else: + print("Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format((GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE)) + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) From 27ebcec4091f30f22d27be3945ffeeef68421929 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 10 Feb 2021 14:45:57 +0100 Subject: [PATCH 17/19] Bump version to 9.2.0.7 --- CHANGELOG.md | 5 ++++- RELEASENOTES.md | 7 ++++++- tasmota/language/fy_NL.h | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30671cf0d..384d3f23f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,13 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [9.2.0.6] +## [9.2.0.7] ### Added +- Support for Device Groups Device Map (#10898) - Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862) +- Support for Frysk language translations by Christiaan Heerze +## [9.2.0.6] 20210210 ### Changed - Removed migration support for versions before v8.1.0 (Doris) - ESP32 Increase number of switch GPIOs from 8 to 28 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d129a4697..0c81c26f4 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,8 @@ ## Migration Information +This version removes migration support for versions before v8.1.0 (Doris) + See [migration path](https://tasmota.github.io/docs/Upgrading#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: 1. Migrate to **Sonoff-Tasmota 3.9.x** @@ -56,7 +58,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v9.2.0.6 +## Changelog v9.2.0.7 ### Added - Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) - Command ``L1MusicSync <0|Off>|<1|On>|<2|Toggle>, 1..10, 1..100>`` to control Sonoff L1 Music Sync mode sensitivity and speed [#10722](https://github.com/arendst/Tasmota/issues/10722) @@ -84,6 +86,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for up to 4 I2C SEESAW_SOIL Capacitance & Temperature sensors by Peter Franck [#10481](https://github.com/arendst/Tasmota/issues/10481) - Support for TOF10120 time of flight sensor by Cyril Pawelko [#10190](https://github.com/arendst/Tasmota/issues/10190) - Support for Afrikaans language translations by Christiaan Heerze +- Support for Frysk language translations by Christiaan Heerze - Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for SPI display driver for ST7789 TFT by Gerhard Mutz [#9037](https://github.com/arendst/Tasmota/issues/9037) @@ -91,6 +94,8 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for 24/26/32/34 bit RFID Wiegand interface (D0/D1) by Sigurd Leuther [#3647](https://github.com/arendst/Tasmota/issues/3647) - Support for SM2135 current selection using GPIO ``SM2135 DAT`` index [#10634](https://github.com/arendst/Tasmota/issues/10634) - Support for Sugar Valley NeoPool Controller by Norbert Richter [#10637](https://github.com/arendst/Tasmota/issues/10637) +- Support for Device Groups Device Map [#10898](https://github.com/arendst/Tasmota/issues/10898) +- Support for Eastron SDM72D-M three phase 100A Modbus energy meter [#10862](https://github.com/arendst/Tasmota/issues/10862) - Support for ESP32 ``Module 3`` Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630) - Support for ESP32 ``Module 5`` Wireless Tag Eth01 [#9496](https://github.com/arendst/Tasmota/issues/9496) - Support for ESP32 ``Module 7`` M5stack core2 16MB binary tasmota32-core2.bin [#10635](https://github.com/arendst/Tasmota/issues/10635) diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 1460d1d99..d2511ba47 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -1,7 +1,7 @@ /* fy-NL.h - localization for Frysk - Nederland for Tasmota - Copyright (C) 2021 Christiaan Heerze + Copyright (C) 2021 Christiaan Heerze 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 From 55ba994956e39ea4fbba703cd3286b942255e733 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 10 Feb 2021 15:08:57 +0100 Subject: [PATCH 18/19] Default disable ESP32 BLE due to instabilities --- tasmota/my_user_config.h | 4 ++-- tasmota/tasmota_configurations.h | 16 ++++++++-------- tasmota/tasmota_configurations_ESP32.h | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index fc4becb48..9ccf11658 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -868,8 +868,8 @@ #define USE_ADC // Add support for ADC on GPIO32 to GPIO39 //#define USE_SPI // Add support for hardware SPI -#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) -//#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) +//#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +//#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) //#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) //#define USE_IBEACON_ESP32 //#define USE_WEBCAM // Add support for webcam diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 6d7664f8b..d65106a92 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -171,8 +171,8 @@ //#define USE_GPS // Add support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM) #define USE_HM10 // (ESP8266 only) Add support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) #ifdef ESP32 - #define USE_BLE_ESP32 // (ESP32 only) Add support for native BLE on ESP32 - use new driver - #define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +// #define USE_BLE_ESP32 // (ESP32 only) Add support for native BLE on ESP32 - use new driver +// #define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #endif #define USE_HRXL // Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) //#define USE_TASMOTA_CLIENT // Add support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) @@ -237,7 +237,7 @@ #undef USE_EMULATION_WEMO // Disable Belkin WeMo emulation for Alexa (+6k code, +2k mem common) #undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code) #undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code) -#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver #undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer @@ -298,7 +298,7 @@ #undef USE_TELEINFO // Disable support for French Energy Provider metering telemetry #undef USE_IEM3000 // Disable support for Schneider Electric iEM3000-Modbus series energy monitor (+0k8 code) #undef USE_WE517 // Disable support for Orno WE517-Modbus energy monitor (+1k code) -#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver #undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) @@ -424,7 +424,7 @@ #undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) #undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM) #undef USE_HM10 // (ESP8266 only) Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) -#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver #undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) #undef USE_TASMOTA_CLIENT // Disable support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) @@ -553,7 +553,7 @@ #undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) #undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM) #undef USE_HM10 // (ESP8266 only) Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) -#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver #undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) #undef USE_TASMOTA_CLIENT // Disable support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) @@ -692,7 +692,7 @@ #undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) #undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM) #undef USE_HM10 // (ESP8266 only) Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) -#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver #undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) #undef USE_TASMOTA_CLIENT // Disable support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) @@ -833,7 +833,7 @@ #undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) #undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM) #undef USE_HM10 // (ESP8266 only) Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) -#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver #undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) #undef USE_TASMOTA_CLIENT // Disable support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index f4dc57b82..431b3381f 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -59,8 +59,8 @@ #define USE_SPI #define USE_DISPLAY // Add SPI Display Support (+2k code) #define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code) -#define USE_BLE_ESP32 // Enable new BLE driver -#define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +//#define USE_BLE_ESP32 // Enable new BLE driver +//#define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #endif // FIRMWARE_ODROID_GO /*********************************************************************************************\ From 7c9067b7b15a72ec5a8d59a571ec098a355b43c4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 10 Feb 2021 15:56:06 +0100 Subject: [PATCH 19/19] Fix NTC calculation for ESP32 Fix NTC calculation for ESP32 (#10906) --- tasmota/xsns_02_analog.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/xsns_02_analog.ino b/tasmota/xsns_02_analog.ino index 73193a8af..6d581c4fd 100644 --- a/tasmota/xsns_02_analog.ino +++ b/tasmota/xsns_02_analog.ino @@ -42,7 +42,7 @@ #define TO_KELVIN(x) ((x) + 273.15) // Parameters for equation -#define ANALOG_V33 3.3 // ESP8266 Analog voltage +#define ANALOG_V33 3.3 // ESP8266 / ESP32 Analog voltage #define ANALOG_T0 TO_KELVIN(25.0) // 25 degrees Celcius in Kelvin (= 298.15) // Shelly 2.5 NTC Thermistor @@ -410,9 +410,9 @@ void AdcEverySecond(void) { if (ADC_TEMP == Adc[idx].type) { int adc = AdcRead(Adc[idx].pin, 2); // Steinhart-Hart equation for thermistor as temperature sensor - double Rt = (adc * Adc[idx].param1) / (1024.0 * ANALOG_V33 - (double)adc); - double BC = (double)Adc[idx].param3 / 10000; - double T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (double)Adc[idx].param2)); + double Rt = (adc * Adc[idx].param1) / (ANALOG_RANGE * ANALOG_V33 - (double)adc); // Shelly param1 = 32000 (ANALOG_NTC_BRIDGE_RESISTANCE) + double BC = (double)Adc[idx].param3 / 10000; // Shelly param3 = 3350 (ANALOG_NTC_B_COEFFICIENT) + double T = BC / (BC / ANALOG_T0 + TaylorLog(Rt / (double)Adc[idx].param2)); // Shelly param2 = 10000 (ANALOG_NTC_RESISTANCE) Adc[idx].temperature = ConvertTemp(TO_CELSIUS(T)); } else if (ADC_CT_POWER == Adc[idx].type) {