From f40f4a1947f0a1f8004cae1f7d70a03201bfcc7c Mon Sep 17 00:00:00 2001 From: SteWers <42718143+SteWers@users.noreply.github.com> Date: Sat, 12 Aug 2023 14:57:58 +0200 Subject: [PATCH 1/2] [DS18x20] Enhance use of aliases (#19026) * [DS18x20] Enhance use of aliases `defineDS18x20_USE_ID_AS_NAME`: Always show part of the address, even for one sensor `#define DS18x20_USE_ID_ALIAS`: The command `DS18Alias` can now be use with alphanumeric aliases, which replace the sensor name * [DS18x20] change to calloc() --- .../tasmota_xsns_sensor/xsns_05_ds18x20.ino | 62 ++++++++++-------- .../xsns_05_esp32_ds18x20.ino | 64 +++++++++++-------- 2 files changed, 71 insertions(+), 55 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_05_ds18x20.ino b/tasmota/tasmota_xsns_sensor/xsns_05_ds18x20.ino index 74ccc478e..cc0586649 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_05_ds18x20.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_05_ds18x20.ino @@ -31,7 +31,8 @@ /* #define DS18x20_USE_ID_ALIAS in my_user_config.h or user_config_override.h * Use alias for fixed sensor name in scripts by autoexec. Command: DS18Alias XXXXXXXXXXXXXXXX,N where XXXXXXXXXXXXXXXX full serial and N number 1-255 * Result in JSON: "DS18Sens_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2) - * add 8 bytes used memory + * Setting N to an alphanumeric value, the complete name is replaced with it + * Result in JSON: "Outside1":{"Id":"000003287CD8","Temperature":26.3} (example with N=Outside1) */ #define DS18S20_CHIPID 0x10 // +/-0.5C 9-bit @@ -49,6 +50,8 @@ #define DS18X20_MAX_SENSORS 8 #endif +#define DS18X20_ALIAS_LEN 17 + const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850"; uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID }; @@ -62,7 +65,7 @@ struct { uint8_t valid; int8_t pins_id; #ifdef DS18x20_USE_ID_ALIAS - uint8_t alias; + char *alias = (char*)calloc(DS18X20_ALIAS_LEN, 1); #endif // DS18x20_USE_ID_ALIAS } ds18x20_sensor[DS18X20_MAX_SENSORS]; @@ -357,7 +360,7 @@ void Ds18x20Init(void) { ids[DS18X20Data.sensors] = ids[DS18X20Data.sensors] << 8 | ds18x20_sensor[DS18X20Data.sensors].address[j]; } #ifdef DS18x20_USE_ID_ALIAS - ds18x20_sensor[DS18X20Data.sensors].alias=0; + ds18x20_sensor[DS18X20Data.sensors].alias[0] = '0'; #endif ds18x20_sensor[DS18X20Data.sensors].pins_id = pins; DS18X20Data.sensors++; @@ -472,24 +475,28 @@ void Ds18x20Name(uint8_t sensor) { } } GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types); - if (DS18X20Data.sensors > 1) { + #ifdef DS18x20_USE_ID_AS_NAME - char address[17]; - for (uint32_t j = 0; j < 3; j++) { - sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes - } - snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address); -#else -uint8_t print_ind = sensor +1; -#ifdef DS18x20_USE_ID_ALIAS - if (ds18x20_sensor[sensor].alias) { - snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens")); - print_ind = ds18x20_sensor[sensor].alias; - } -#endif - snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), print_ind); -#endif + char address[17]; + for (uint32_t j = 0; j < 3; j++) { + sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes } + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address); +#elif defined(DS18x20_USE_ID_ALIAS) + if (ds18x20_sensor[sensor].alias[0] != '0') { + if (isdigit(ds18x20_sensor[sensor].alias[0])) { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens%c%d"), IndexSeparator(), atoi(ds18x20_sensor[sensor].alias)); + } else { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s"), ds18x20_sensor[sensor].alias); + } + } else { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1); + } +#else // no #defines set + if (DS18X20Data.sensors > 1) { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1); + } +#endif } /********************************************************************************************/ @@ -574,25 +581,26 @@ void (* const DSCommand[])(void) PROGMEM = { &CmndDSAlias }; void CmndDSAlias(void) { - uint8_t tmp; - uint8_t sensor=255; - char argument[XdrvMailbox.data_len]; + char Argument1[XdrvMailbox.data_len]; + char Argument2[XdrvMailbox.data_len]; char address[17]; if (ArgC()==2) { - tmp=atoi(ArgV(argument, 2)); - ArgV(argument,1); + ArgV(Argument1, 1); + ArgV(Argument2, 2); + TrimSpace(Argument2); for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { for (uint32_t j = 0; j < 8; j++) { sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); } - if (!strncmp(argument,address,12)) { - ds18x20_sensor[i].alias=tmp; + if (!strncmp(Argument1, address, 12) && Argument2[0]) { + snprintf_P(ds18x20_sensor[i].alias, DS18X20_ALIAS_LEN, PSTR("%s"), Argument2); break; } } } + Response_P(PSTR("{")); for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { Ds18x20Name(i); @@ -601,7 +609,7 @@ void CmndDSAlias(void) { sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); // Skip sensor type and crc } ResponseAppend_P(PSTR("\"%s\":{\"" D_JSON_ID "\":\"%s\"}"),DS18X20Data.name, address); - if (i < DS18X20Data.sensors-1) {ResponseAppend_P(PSTR(","));} + if (i < DS18X20Data.sensors-1) ResponseAppend_P(PSTR(",")); } ResponseAppend_P(PSTR("}")); } diff --git a/tasmota/tasmota_xsns_sensor/xsns_05_esp32_ds18x20.ino b/tasmota/tasmota_xsns_sensor/xsns_05_esp32_ds18x20.ino index 2113f1aed..914d9532a 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_05_esp32_ds18x20.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_05_esp32_ds18x20.ino @@ -29,8 +29,9 @@ /* #define DS18x20_USE_ID_ALIAS in my_user_config.h or user_config_override.h * Use alias for fixed sensor name in scripts by autoexec. Command: DS18Alias XXXXXXXXXXXXXXXX,N where XXXXXXXXXXXXXXXX full serial and N number 1-255 - * Result in JSON: "DS18Alias_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2) - * add 8 bytes used memory + * Result in JSON: "DS18Sens_2":{"Id":"000003287CD8","Temperature":26.3} (example with N=2) + * Setting N to an alphanumeric value, the complete name is replaced with it + * Result in JSON: "Outside1":{"Id":"000003287CD8","Temperature":26.3} (example with N=Outside1) */ #define DS18S20_CHIPID 0x10 // +/-0.5C 9-bit @@ -46,6 +47,8 @@ #define DS18X20_MAX_SENSORS 8 #endif +#define DS18X20_ALIAS_LEN 17 + const char kDs18x20Types[] PROGMEM = "DS18x20|DS18S20|DS1822|DS18B20|MAX31850"; uint8_t ds18x20_chipids[] = { 0, DS18S20_CHIPID, DS1822_CHIPID, DS18B20_CHIPID, MAX31850_CHIPID }; @@ -61,7 +64,7 @@ struct { uint8_t valid; int8_t pins_id; #ifdef DS18x20_USE_ID_ALIAS - uint8_t alias; + char *alias = (char*)calloc(DS18X20_ALIAS_LEN, 1); #endif //DS18x20_USE_ID_ALIAS } ds18x20_sensor[DS18X20_MAX_SENSORS]; @@ -108,7 +111,7 @@ void Ds18x20Search(void) { (ds18x20_sensor[num_sensors].address[0] == DS18B20_CHIPID) || (ds18x20_sensor[num_sensors].address[0] == MAX31850_CHIPID))) { #ifdef DS18x20_USE_ID_ALIAS - ds18x20_sensor[num_sensors].alias=0; + ds18x20_sensor[DS18X20Data.sensors].alias[0] = '0'; #endif ds18x20_sensor[num_sensors].pins_id = pins; num_sensors++; @@ -214,24 +217,28 @@ void Ds18x20Name(uint8_t sensor) { } } GetTextIndexed(DS18X20Data.name, sizeof(DS18X20Data.name), index, kDs18x20Types); - if (DS18X20Data.sensors > 1) { + #ifdef DS18x20_USE_ID_AS_NAME - char address[17]; - for (uint32_t j = 0; j < 3; j++) { - sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes - } - snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address); -#else -uint8_t print_ind = sensor +1; -#ifdef DS18x20_USE_ID_ALIAS - if (ds18x20_sensor[sensor].alias) { - snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens")); - print_ind = ds18x20_sensor[sensor].alias; - } -#endif - snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), print_ind); -#endif + char address[17]; + for (uint32_t j = 0; j < 3; j++) { + sprintf(address+2*j, "%02X", ds18x20_sensor[ds18x20_sensor[sensor].index].address[3-j]); // Only last 3 bytes } + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%s"), DS18X20Data.name, IndexSeparator(), address); +#elif defined(DS18x20_USE_ID_ALIAS) + if (ds18x20_sensor[sensor].alias[0] != '0') { + if (isdigit(ds18x20_sensor[sensor].alias[0])) { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("DS18Sens%c%d"), IndexSeparator(), atoi(ds18x20_sensor[sensor].alias)); + } else { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s"), ds18x20_sensor[sensor].alias); + } + } else { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1); + } +#else // no #defines set + if (DS18X20Data.sensors > 1) { + snprintf_P(DS18X20Data.name, sizeof(DS18X20Data.name), PSTR("%s%c%d"), DS18X20Data.name, IndexSeparator(), sensor + 1); + } +#endif } /********************************************************************************************/ @@ -317,25 +324,26 @@ void (* const DSCommand[])(void) PROGMEM = { &CmndDSAlias }; void CmndDSAlias(void) { - uint8_t tmp; - uint8_t sensor=255; - char argument[XdrvMailbox.data_len]; + char Argument1[XdrvMailbox.data_len]; + char Argument2[XdrvMailbox.data_len]; char address[17]; if (ArgC()==2) { - tmp=atoi(ArgV(argument, 2)); - ArgV(argument,1); + ArgV(Argument1, 1); + ArgV(Argument2, 2); + TrimSpace(Argument2); for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { for (uint32_t j = 0; j < 8; j++) { sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); } - if (!strncmp(argument,address,12)) { - ds18x20_sensor[i].alias=tmp; + if (!strncmp(Argument1, address, 12) && Argument2[0]) { + snprintf_P(ds18x20_sensor[i].alias, DS18X20_ALIAS_LEN, PSTR("%s"), Argument2); break; } } } + Response_P(PSTR("{")); for (uint32_t i = 0; i < DS18X20Data.sensors; i++) { Ds18x20Name(i); @@ -344,7 +352,7 @@ void CmndDSAlias(void) { sprintf(address+2*j, "%02X", ds18x20_sensor[i].address[7-j]); // Skip sensor type and crc } ResponseAppend_P(PSTR("\"%s\":{\"" D_JSON_ID "\":\"%s\"}"),DS18X20Data.name, address); - if (i < DS18X20Data.sensors-1) {ResponseAppend_P(PSTR(","));} + if (i < DS18X20Data.sensors-1) ResponseAppend_P(PSTR(",")); } ResponseAppend_P(PSTR("}")); } From 7d18dd0e9e5d46f880cc3aadc7bcfd6d2fe16c22 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Mon, 14 Aug 2023 09:34:48 +0200 Subject: [PATCH 2/2] fix OneWire for IDF5.1 and C2/C6 (#19303) * fix OneWire for IDF5.1 and C2/C6 * Use Onewire in arduino30 builds * use SOC specific defines for C2,C3 and C6 --- lib/lib_basic/OneWire-Stickbreaker/OneWire.h | 13 ++++++++----- platformio_tasmota_env32.ini | 2 -- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h index c92dda8d0..cb1e16d73 100644 --- a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h +++ b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h @@ -147,6 +147,9 @@ #elif defined(ARDUINO_ARCH_ESP32) #include +#if ESP_IDF_VERSION_MAJOR >= 5 +#include "soc/gpio_periph.h" +#endif // ESP_IDF_VERSION_MAJOR >= 5 #define PIN_TO_BASEREG(pin) (0) #define PIN_TO_BITMASK(pin) (pin) #define IO_REG_TYPE uint32_t @@ -156,7 +159,7 @@ static inline __attribute__((always_inline)) IO_REG_TYPE directRead(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 // max. usable Pins are 23 for C6 (below flash pins) return (GPIO.in.val >> pin) & 0x1; #else // plain ESP32 if ( pin < 32 ) @@ -171,7 +174,7 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directWriteLow(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 GPIO.out_w1tc.val = ((uint32_t)1 << pin); #else // plain ESP32 if ( pin < 32 ) @@ -184,7 +187,7 @@ void directWriteLow(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directWriteHigh(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 GPIO.out_w1ts.val = ((uint32_t)1 << pin); #else // plain ESP32 if ( pin < 32 ) @@ -197,7 +200,7 @@ void directWriteHigh(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directModeInput(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 GPIO.enable_w1tc.val = ((uint32_t)1 << (pin)); #else if ( digitalPinIsValid(pin) ) @@ -223,7 +226,7 @@ void directModeInput(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directModeOutput(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 GPIO.enable_w1ts.val = ((uint32_t)1 << (pin)); #else if ( digitalPinIsValid(pin) && pin <= 33 ) // pins above 33 can be only inputs diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 2e826f757..fe74871af 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -54,7 +54,6 @@ lib_ignore = ESP Mail Client IRremoteESP8266 NeoPixelBus - OneWire MFRC522 universal display Library ESP8266Audio @@ -75,7 +74,6 @@ lib_ignore = ESP Mail Client IRremoteESP8266 NeoPixelBus - OneWire MFRC522 universal display Library ESP8266Audio