diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df12224c..156a7489f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - Support for Vietnamese language translations by Tâm.NT - Support for timers in case of no-sunset permanent day by cybermaus (#9543) - Command ``NoDelay`` for immediate backlog command execution by Erik Montnemery (#9544) -- Command ``SwitchMode 15`` sending only MQTT message on switch change (#9596) +- Command ``SwitchMode 15`` sending only MQTT message on switch change (#9593) - Support for EZO Ph and ORP sensors by Christopher Tremblay (#9567) - Support for EZO RTD sensors by Christopher Tremblay (#9585) - On ZigbeeBridge support for glowing led when permit join is active (#9581) @@ -20,6 +20,7 @@ All notable changes to this project will be documented in this file. - Management of serial baudrate (#9554) - ``#define MQTT_FINGERPRINT`` from string to hexnumbers (#9570) - Rotary driver adjusted accordingly if Mi Desk Lamp module is selected (#9399) +- Tasmota Arduino Core v2.7.4.5 allowing webpassword over 47 characters (#9687) ### Fixed - Convert AdcParam parameters from versions before v9.0.0.2 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index cfed7f363..d7d1a1aac 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -60,7 +60,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ## Changelog v9.0.0.2 ### Added - Command ``NoDelay`` for immediate backlog command execution by Erik Montnemery (#9544) -- Command ``SwitchMode 15`` sending only MQTT message on switch change (#9596) +- Command ``SwitchMode 15`` sending only MQTT message on switch change (#9593) - Zigbee command ``ZbData`` for better support of device specific data - Optional support for Mitsubishi Electric HVAC by David Gwynne (#9237) - Optional support for Orno WE517-Modbus energy meter by Maxime Vincent (#9353) @@ -89,6 +89,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - NeoPixelBus library from v2.5.0.09 to v2.6.0 - Management of serial baudrate (#9554) - Rotary driver adjusted accordingly if Mi Desk Lamp module is selected (#9399) +- Tasmota Arduino Core v2.7.4.5 allowing webpassword over 47 characters (#9687) ### Fixed - Ledlink blink when no network connected regression from v8.3.1.4 (#9292) diff --git a/lib/AT24C256/library.properties b/lib/AT24C256/library.properties new file mode 100644 index 000000000..648e89096 --- /dev/null +++ b/lib/AT24C256/library.properties @@ -0,0 +1,9 @@ +name=EEPROM 24C128 +version= +author=Julien Le Sech +maintainer=Julien Le Sech - www.idreammicro.com +sentence=EEPROM 24C128 / 24C256 memory driver. +paragraph=EEPROM 24C128 / 24C256 memory driver. +category= +url= +architectures=* diff --git a/lib/Adafruit_SH1106-gemu-1.0/library.properties b/lib/Adafruit_SH1106-gemu-1.0/library.properties new file mode 100644 index 000000000..e8e2bed07 --- /dev/null +++ b/lib/Adafruit_SH1106-gemu-1.0/library.properties @@ -0,0 +1,9 @@ +name=Adafruit SH1106-gemu-1.0 +version=1.0 +author=Adafruit +maintainer=Adafruit +sentence=SH1106 +paragraph=SH1106 +category=Display +url= +architectures=* diff --git a/lib/Adafruit_TSL2591_Library/library.properties b/lib/Adafruit_TSL2591_Library/library.properties new file mode 100644 index 000000000..5f5dcd97d --- /dev/null +++ b/lib/Adafruit_TSL2591_Library/library.properties @@ -0,0 +1,9 @@ +name=Adafruit TSL2591 +version= +author=Adafruit +maintainer=Adafruit +sentence=Library for Adafruit TSL2591 +paragraph=Library for Adafruit TSL2591 +category= +url=https://www.adafruit.com/products/1980 +architectures=* diff --git a/lib/ArduinoNTPd/library.properties b/lib/ArduinoNTPd/library.properties new file mode 100644 index 000000000..e20a1d850 --- /dev/null +++ b/lib/ArduinoNTPd/library.properties @@ -0,0 +1,9 @@ +name=NTP Library +version= +author=Mooneer Salem +maintainer=Mooneer Salem +sentence=NTP +paragraph=NTP +category= +url= +architectures=* diff --git a/lib/BME680_driver-bme680_v3.5.9/library.properties b/lib/BME680_driver-bme680_v3.5.9/library.properties new file mode 100644 index 000000000..93954f32d --- /dev/null +++ b/lib/BME680_driver-bme680_v3.5.9/library.properties @@ -0,0 +1,9 @@ +name=BME680 +version= +author= +maintainer=Bosch Sensortec GmbH +sentence=Sensor driver for BME680 sensor +paragraph=Sensor driver for BME680 sensor +category=Sensor +url= +architectures=esp8266 diff --git a/lib/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp b/lib/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp index ed659ee5e..c07eb0944 100755 --- a/lib/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp +++ b/lib/ESP8266Audio/src/AudioFileSourceHTTPStream.cpp @@ -40,7 +40,7 @@ bool AudioFileSourceHTTPStream::open(const char *url) http.begin(client, url); http.setReuse(true); #ifndef ESP32 - http.setFollowRedirects(true); + http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); #endif int code = http.GET(); if (code != HTTP_CODE_OK) { diff --git a/lib/FrogmoreScd30/library.properties b/lib/FrogmoreScd30/library.properties new file mode 100644 index 000000000..80b7d46ec --- /dev/null +++ b/lib/FrogmoreScd30/library.properties @@ -0,0 +1,9 @@ +name=FrogmoreScd30 +version= +author=Frogmore42 +maintainer=Frogmore42 +sentence=SCD30 +paragraph=SCD30 +category=Sensor +url= +architectures=esp8266,esp32 diff --git a/lib/I2Cdevlib-MPU6050/library.properties b/lib/I2Cdevlib-MPU6050/library.properties new file mode 100644 index 000000000..95e768cd8 --- /dev/null +++ b/lib/I2Cdevlib-MPU6050/library.properties @@ -0,0 +1,9 @@ +name=MPU6050 I2C +version= +author=Jeff Rowberg +maintainer=Jeff Rowberg +sentence=This is a library for the MPU6050. +paragraph=This is a library for the MPU6050. +category=Sensors +url=https://github.com/jrowberg/i2cdevlib +architectures=* diff --git a/lib/LOLIN_HP303B/examples/library.properties b/lib/LOLIN_HP303B/examples/library.properties new file mode 100644 index 000000000..7f71ad2b2 --- /dev/null +++ b/lib/LOLIN_HP303B/examples/library.properties @@ -0,0 +1,9 @@ +name=LOLIN_HP303B +version=1.0.0 +author=WEMOS.CC +maintainer=WEMOS.CC +sentence=Library for the HP303B.. +paragraph=LOLIN HP303B +category=Device Control +url=https://github.com/wemos/LOLIN_HP303B_Library +architectures=* diff --git a/lib/cc1101/library.properties b/lib/cc1101/library.properties new file mode 100644 index 000000000..bfb8a65bc --- /dev/null +++ b/lib/cc1101/library.properties @@ -0,0 +1,9 @@ +name=cc1101 +version= +author=Daniel Berenguer +maintainer=panStamp +sentence=. +paragraph= +category= +url= +architectures=esp8266 diff --git a/lib/mlx90640-library/library.properties b/lib/mlx90640-library/library.properties new file mode 100644 index 000000000..efad72a8d --- /dev/null +++ b/lib/mlx90640-library/library.properties @@ -0,0 +1,9 @@ +name=MLX90640 +version= +author=Melexis N.V. +maintainer= +sentence= +paragraph=MLX90640 +category=Sensor +url= +architectures=* diff --git a/platformio.ini b/platformio.ini index 6327787f5..a14faae3e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -54,6 +54,7 @@ default_envs = [platformio] description = Provide ESP8266 / ESP32 based devices with Web, MQTT and OTA firmware src_dir = tasmota +lib_dir = lib build_cache_dir = .cache extra_configs = platformio_tasmota32.ini platformio_tasmota_env.ini @@ -80,6 +81,8 @@ upload_speed = 115200 upload_resetmethod = nodemcu upload_port = COM5 extra_scripts = ${scripts_defaults.extra_scripts} +shared_libdeps_dir = lib +lib_ignore = ${esp82xx_defaults.lib_ignore} [scripts_defaults] extra_scripts = pio/strip-floats.py @@ -121,6 +124,21 @@ build_flags = ${esp_defaults.build_flags} ; restrict to minimal mime-types -DMIMETYPE_MINIMAL +lib_ignore = Servo(esp8266) + ESP8266AVRISP + ESP8266LLMNR + ESP8266NetBIOS + ESP8266SSDP + ESP8266WiFiMesh + Ethernet(esp8266) + GDBStub + TFT_Touch_Shield_V2 + ESP8266WiFiMesh + EspSoftwareSerial + SPISlave + Hash + + [irremoteesp_full] build_flags = -DUSE_IR_REMOTE_FULL -U_IR_ENABLE_DEFAULT_ diff --git a/platformio_tasmota_env.ini b/platformio_tasmota_env.ini index 41944ed37..c28667685 100644 --- a/platformio_tasmota_env.ini +++ b/platformio_tasmota_env.ini @@ -14,11 +14,72 @@ upload_port = ${common.upload_port} upload_resetmethod = ${common.upload_resetmethod} upload_speed = ${common.upload_speed} extra_scripts = ${common.extra_scripts} +lib_extra_dirs = ${common.shared_libdeps_dir} +lib_ignore = ${common.lib_ignore} [env:tasmota] [env:tasmota-minimal] build_flags = ${common.build_flags} -DFIRMWARE_MINIMAL +lib_ignore = ${common.lib_ignore} + LittleFS(esp8266) + A4988_Stepper + Adafruit BusIO + Adafruit CCS811 Library + Adafruit GFX Library + Arduino ST7789 Library + Adafruit ILI9341 + ILI9488 + RA8876 + Adafruit LED Backpack Library + Waveshare esp 2.9 inch e-paper display driver + LiquidCrystal_I2C + Adafruit MAX31865 library + Adafruit MCP9808 Library + Adafruit SGP30 Sensor + Adafruit SH1106-gemu-1.0 + Adafruit SSD1306 + Adafruit TSL2591 + Joba Tsl2561 Library + Joba_Tsl2561 + Adafruit VEML7700 Library + SSD3115 + NTP Library + base64 + C2Programmer + ;ESP KNX IP Library + I2Cdevlib-Core + MPU6050 I2C + LibTeleinfo + LinkedList + LOLIN_HP303B + Mutichannel_Gas_Sensor + NewPing + OneWire + OpenTherm Library + rc-switch + RF24 + TasmotaModbus + TasmotaSerial + UdpListener + VL53L0X + VL53L1X + MLX90640 + FrogmoreScd30 + cc1101 + EEPROM 24C128 + BME680 + FrogmoreScd30 + FT5206_Library + HPMA115S0 Arduino Library + Grove - Multichannel Gas Sensor + BearSSL + OneWire + IRremoteESP8266 + ESP8266Audio + ESP8266SAM + KeeloqLib + NeoPixelBus [env:tasmota-lite] build_flags = ${common.build_flags} -DFIRMWARE_LITE diff --git a/tasmota/support.ino b/tasmota/support.ino index 462aec9e2..dd51c8004 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -48,7 +48,7 @@ bool knx_started = false; void OsWatchTicker(void) { uint32_t t = millis(); - uint32_t last_run = abs(t - oswatch_last_loop_time); + uint32_t last_run = t - oswatch_last_loop_time; #ifdef DEBUG_THEO int32_t rssi = WiFi.RSSI(); diff --git a/tasmota/support_rotary.ino b/tasmota/support_rotary.ino index 361a130dd..e04c36faa 100644 --- a/tasmota/support_rotary.ino +++ b/tasmota/support_rotary.ino @@ -36,33 +36,36 @@ #ifndef ROTARY_MAX_STEPS #define ROTARY_MAX_STEPS 10 // Rotary step boundary #endif +#ifndef ROTARY_TIMEOUT +#define ROTARY_TIMEOUT 2 // 2 * RotaryHandler() call which is usually 2 * 0.05 seconds +#endif +#ifndef ROTARY_DEBOUNCE +#define ROTARY_DEBOUNCE 10 // Debounce time in milliseconds +#endif // (0) = Mi Desk lamp (1) = Normal rotary // ---------------------------- ---------------------- const uint8_t rotary_dimmer_increment[2] = { 100 / (ROTARY_MAX_STEPS * 3), 100 / ROTARY_MAX_STEPS }; // Dimmer 1..100 = 100 const uint8_t rotary_ct_increment[2] = { 350 / (ROTARY_MAX_STEPS * 3), 350 / ROTARY_MAX_STEPS }; // Ct 153..500 = 347 const uint8_t rotary_color_increment[2] = { 360 / (ROTARY_MAX_STEPS * 3), 360 / ROTARY_MAX_STEPS }; // Hue 0..359 = 360 - -const uint8_t ROTARY_TIMEOUT = 10; // 10 * RotaryHandler() call which is usually 10 * 0.05 seconds -const uint8_t ROTARY_DEBOUNCE = 10; // Debounce time in milliseconds +const uint8_t rotary_offset = 128; +const int8_t rotary_state_pos[16] = { 0, 1, -1, 2, -1, 0, -2, 1, 1, -2, 0, -1, 2, -1, 1, 0 }; struct ROTARY { - uint8_t model = 1; - bool present = false; + uint8_t model; + bool present; } Rotary; struct tEncoder { volatile uint32_t debounce = 0; - volatile int8_t direction = 0; // Control consistent direction volatile uint8_t state = 0; - volatile uint8_t position = 128; - uint8_t last_position = 128; + volatile uint8_t position; + volatile int8_t direction = 0; // Control consistent direction + volatile int8_t pina; + volatile int8_t pinb; uint8_t timeout = 0; // Disallow direction change within 0.5 second int8_t abs_position[2] = { 0 }; - int8_t pina = -1; - int8_t pinb = -1; bool changed = false; - volatile bool busy = false; }; tEncoder Encoder[MAX_ROTARIES]; @@ -93,34 +96,17 @@ bool RotaryButtonPressed(uint32_t button_index) { void ICACHE_RAM_ATTR RotaryIsrArgMiDesk(void *arg) { tEncoder* encoder = static_cast(arg); - if (encoder->busy) { return; } - // https://github.com/PaulStoffregen/Encoder/blob/master/Encoder.h - uint8_t state = encoder->state & 3; + uint32_t state = encoder->state & 3; if (digitalRead(encoder->pina)) { state |= 4; } if (digitalRead(encoder->pinb)) { state |= 8; } + encoder->position += rotary_state_pos[state]; encoder->state = (state >> 2); - switch (state) { - case 1: case 7: case 8: case 14: - encoder->position++; - return; - case 2: case 4: case 11: case 13: - encoder->position--; - return; - case 3: case 12: - encoder->position += 2; - return; - case 6: case 9: - encoder->position -= 2; - return; - } } void ICACHE_RAM_ATTR RotaryIsrArg(void *arg) { tEncoder* encoder = static_cast(arg); - if (encoder->busy) { return; } - // Theo Arends uint32_t time = millis(); if ((encoder->debounce < time) || (encoder->debounce > time + ROTARY_DEBOUNCE)) { @@ -144,9 +130,10 @@ void RotaryInit(void) { for (uint32_t index = 0; index < MAX_ROTARIES; index++) { Encoder[index].pinb = -1; if (PinUsed(GPIO_ROT1A, index) && PinUsed(GPIO_ROT1B, index)) { + Encoder[index].position = rotary_offset; Encoder[index].pina = Pin(GPIO_ROT1A, index); - pinMode(Encoder[index].pina, INPUT_PULLUP); Encoder[index].pinb = Pin(GPIO_ROT1B, index); + pinMode(Encoder[index].pina, INPUT_PULLUP); pinMode(Encoder[index].pinb, INPUT_PULLUP); if (0 == Rotary.model) { attachInterruptArg(Encoder[index].pina, RotaryIsrArgMiDesk, &Encoder[index], CHANGE); @@ -181,12 +168,14 @@ void RotaryHandler(void) { Encoder[index].direction = 0; } } - if (Encoder[index].last_position == Encoder[index].position) { continue; } - Encoder[index].busy = true; + if (rotary_offset == Encoder[index].position) { continue; } Encoder[index].timeout = ROTARY_TIMEOUT; // Prevent fast direction changes within 0.5 second - int rotary_position = Encoder[index].position - Encoder[index].last_position; + noInterrupts(); + int rotary_position = Encoder[index].position - rotary_offset; + Encoder[index].position = rotary_offset; + interrupts(); if (Settings.save_data && (save_data_counter < 2)) { save_data_counter = 3; // Postpone flash writes while rotary is turned @@ -232,10 +221,6 @@ void RotaryHandler(void) { #ifdef USE_LIGHT } #endif // USE_LIGHT - - Encoder[index].last_position = 128; - Encoder[index].position = 128; - Encoder[index].busy = false; } } diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index b51aabdcf..9725e94a2 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -420,8 +420,11 @@ struct SCRIPT_MEM { #ifdef USE_SCRIPT_GLOBVARS UDP_FLAGS udp_flags; #endif + char web_mode; } glob_script_mem; + + bool event_handeled = false; @@ -768,8 +771,14 @@ char *script; script_mem += size; #ifdef SCRIPT_LARGE_VNBUFF - glob_script_mem.vnp_offset = (uint16_t*)script_mem; - size = vars*sizeof(uint16_t); + uint32_t alignedmem = (uint32_t)script_mem; + if (alignedmem&1) { + alignedmem++; + size = vars*sizeof(uint16_t)+1; + } else { + size = vars*sizeof(uint16_t); + } + glob_script_mem.vnp_offset = (uint16_t*)alignedmem; #else glob_script_mem.vnp_offset = (uint8_t*)script_mem; size = vars*sizeof(uint8_t); @@ -3107,7 +3116,10 @@ chknext: goto exit; } #endif // USE_FT5206 - + if (!strncmp(vname, "wm", 2)) { + fvar = glob_script_mem.web_mode; + goto exit; + } if (!strncmp(vname, "wday", 4)) { fvar = RtcTime.day_of_week; goto exit; @@ -3718,6 +3730,29 @@ void esp32_beep(int32_t freq ,uint32_t len) { //#define IFTHEN_DEBUG +char *scripter_sub(char *lp, uint8_t fromscriptcmd) { + lp += 1; + char *slp = lp; + uint8_t plen = 0; + while (*lp) { + if (*lp=='\n'|| *lp=='\r'|| *lp=='(') { + break; + } + lp++; + plen++; + } + if (fromscriptcmd) { + char *sp = glob_script_mem.scriptptr; + glob_script_mem.scriptptr = glob_script_mem.scriptptr_bu; + Run_Scripter(slp, plen, 0); + glob_script_mem.scriptptr = sp; + } else { + Run_Scripter(slp, plen, 0); + } + lp = slp; + return lp; +} + #define IF_NEST 8 // execute section of scripter int16_t Run_Scripter(const char *type, int8_t tlen, char *js) { @@ -4107,7 +4142,16 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { goto next_line; } #endif //ESP32 - + else if (!strncmp(lp, "wcs", 3)) { + lp+=4; + // skip one space after cmd + char tmp[256]; + Replace_Cmd_Vars(lp ,1 , tmp, sizeof(tmp)); + WSContentFlush(); + WSContentSend_P(PSTR("%s"),tmp); + WSContentFlush(); + goto next_line; + } else if (!strncmp(lp,"=>",2) || !strncmp(lp,"->",2) || !strncmp(lp,"+>",2) || !strncmp(lp,"print",5)) { // execute cmd uint8_t sflag = 0,pflg = 0,svmqtt,swll; @@ -4170,25 +4214,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { goto next_line; } else if (!strncmp(lp, "=#", 2)) { // subroutine - lp += 1; - char *slp = lp; - uint8_t plen = 0; - while (*lp) { - if (*lp=='\n'|| *lp=='\r'|| *lp=='(') { - break; - } - lp++; - plen++; - } - if (fromscriptcmd) { - char *sp = glob_script_mem.scriptptr; - glob_script_mem.scriptptr = glob_script_mem.scriptptr_bu; - Run_Scripter(slp, plen, 0); - glob_script_mem.scriptptr = sp; - } else { - Run_Scripter(slp, plen, 0); - } - lp = slp; + lp = scripter_sub(lp, fromscriptcmd); goto next_line; } else if (!strncmp(lp, "=(", 2)) { lp += 2; @@ -6474,10 +6500,10 @@ uint32_t cnt; } void ScriptWebShow(char mc) { - uint8_t web_script,xflg = 0; + uint8_t web_script; + glob_script_mem.web_mode = mc; if (mc=='w' || mc=='x') { if (mc=='x') { - xflg = 1; mc='$'; } web_script = Run_Scripter(">w", -2, 0); @@ -6543,11 +6569,22 @@ void ScriptWebShow(char mc) { } else { goto nextwebline; } + } else if (!strncmp(lp, "%=#", 3)) { + // subroutine + lp = scripter_sub(lp + 1, 0); + goto nextwebline; } Replace_Cmd_Vars(lp, 1, tmp, sizeof(tmp)); char *lin = tmp; if ((!mc && (*lin!='$')) || (mc=='w' && (*lin!='$'))) { + /*if (!mc || mc=='w') { + if (*lin=='$') { + lin++; + if (!strncmp(lin,"gc(", 3)) { + goto exgc; + } + }*/ // normal web section if (*lin=='@') { lin++; diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino index d4daffd26..bb9e5caf9 100644 --- a/tasmota/xdrv_12_home_assistant.ino +++ b/tasmota/xdrv_12_home_assistant.ino @@ -316,7 +316,6 @@ void NewHAssDiscovery(void) mac_address.replace(":", ""); snprintf_P(unique_id, sizeof(unique_id), PSTR("%s"), mac_address.c_str()); snprintf_P(stopic, sizeof(stopic), PSTR("tasmota/discovery/%s/config"), unique_id); - GetTopic_P(state_topic, TELE, mqtt_topic, PSTR(D_RSLT_HASS_STATE)); // Send empty message if new discovery is disabled masterlog_level = 4; // Hide topic on clean and remove use weblog 4 to see it @@ -1071,8 +1070,7 @@ void HAssDiscover(void) void HAssAnyKey(void) { if (!Settings.flag.hass_discovery) { return; } // SetOption19 - Control Home Assistantautomatic discovery (See SetOption59) - - uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF; // 0 = Button, 1 = Switch + uint32_t key = (XdrvMailbox.payload >> 16) & 0xFF; // 0 = KEY_BUTTON, 1 = KEY_SWITCH uint32_t device = XdrvMailbox.payload & 0xFF; // Device number or 1 if more Buttons than Devices uint32_t state = (XdrvMailbox.payload >> 8) & 0xFF; // 0 = Off, 1 = On, 2 = Toggle, 3 = Hold, 10,11,12,13 and 14 for Button Multipress @@ -1095,11 +1093,13 @@ void HAssAnyKey(void) char stopic[TOPSZ]; - if (state == 3) { - snprintf_P(trg_state, sizeof(trg_state), GetStateText(3)); - } else { - if (state == 2) { state = 10; } - GetTextIndexed(trg_state, sizeof(trg_state), state -9, kHAssTriggerStringButtons); + if (!key) { + if (state == 3) { + snprintf_P(trg_state, sizeof(trg_state), GetStateText(3)); + } else { + if (state == 2) { state = 10; } + GetTextIndexed(trg_state, sizeof(trg_state), state -9, kHAssTriggerStringButtons); + } } GetTopic_P(stopic, STAT, mqtt_topic, scommand); diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index d1f76fdd6..f750302cc 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -595,17 +595,14 @@ void TuyaProcessStatePacket(void) { Tuya.FanState = packetValue; } - if ((fnId == TUYA_MCU_FUNC_DIMMER) || (fnId == TUYA_MCU_FUNC_REPORT1)) { - dimIndex = 0; - } + if (fnId == TUYA_MCU_FUNC_DIMMER || fnId == TUYA_MCU_FUNC_REPORT1) { dimIndex = 0; } - if ((fnId == TUYA_MCU_FUNC_DIMMER2) || (fnId == TUYA_MCU_FUNC_REPORT2) || (fnId == TUYA_MCU_FUNC_CT)) { - dimIndex = 1; - if (Settings.flag3.pwm_multi_channels) { - Tuya.Levels[dimIndex] = changeUIntScale(packetValue, 0, Settings.dimmer_hw_max, 0, 100); - } else { - Tuya.Levels[dimIndex] = changeUIntScale(packetValue, 0, Settings.dimmer_hw_max, Tuya.CTMax, Tuya.CTMin); - } + if (fnId == TUYA_MCU_FUNC_DIMMER2 || fnId == TUYA_MCU_FUNC_REPORT2 || fnId == TUYA_MCU_FUNC_CT) { dimIndex = 1; } + + if (dimIndex == 1 && !Settings.flag3.pwm_multi_channels) { + Tuya.Levels[dimIndex] = changeUIntScale(packetValue, 0, Settings.dimmer_hw_max, Tuya.CTMax, Tuya.CTMin); + } else { + Tuya.Levels[dimIndex] = changeUIntScale(packetValue, 0, Settings.dimmer_hw_max, 0, 100); } AddLog_P2(LOG_LEVEL_DEBUG, PSTR("TYA: RX value %d from dpId %d "), packetValue, Tuya.buffer[dpidStart]); diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index 733a1d45d..bbaf670a0 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -1824,7 +1824,7 @@ void ZCLFrame::postProcessAttributes(uint16_t shortaddr, Z_attribute_list& attr_ switch (ccccaaaa) { case 0x00000004: zigbee_devices.setManufId(shortaddr, attr.getStr()); break; case 0x00000005: zigbee_devices.setModelId(shortaddr, attr.getStr()); break; - case 0x00010021: zigbee_devices.setBatteryPercent(shortaddr, uval16); break; + case 0x00010021: zigbee_devices.setBatteryPercent(shortaddr, uval16 / 2); break; case 0x00060000: case 0x00068000: device.setPower(attr.getBool(), src_ep); break; } diff --git a/tasmota/xdrv_26_ariluxrf.ino b/tasmota/xdrv_26_ariluxrf.ino index b0f20e8a6..d4491423d 100644 --- a/tasmota/xdrv_26_ariluxrf.ino +++ b/tasmota/xdrv_26_ariluxrf.ino @@ -32,7 +32,7 @@ const uint32_t ARILUX_RF_SEPARATION_LIMIT = 4300; // Microseconds const uint32_t ARILUX_RF_RECEIVE_TOLERANCE = 60; // Percentage struct ARILUX { - unsigned int rf_timings[ARILUX_RF_MAX_CHANGES]; + int rf_timings[ARILUX_RF_MAX_CHANGES]; unsigned long rf_received_value = 0; unsigned long rf_last_received_value = 0; @@ -52,15 +52,15 @@ void AriluxRfInterrupt(void) ICACHE_RAM_ATTR; // As iram is tight and it works void AriluxRfInterrupt(void) { unsigned long time = micros(); - unsigned int duration = time - Arilux.rf_lasttime; + int duration = time - Arilux.rf_lasttime; if (duration > ARILUX_RF_SEPARATION_LIMIT) { if (abs(duration - Arilux.rf_timings[0]) < 200) { Arilux.rf_repeat_count++; if (Arilux.rf_repeat_count == 2) { unsigned long code = 0; - const unsigned int delay = Arilux.rf_timings[0] / 31; - const unsigned int delayTolerance = delay * ARILUX_RF_RECEIVE_TOLERANCE / 100; + const int delay = Arilux.rf_timings[0] / 31; + const int delayTolerance = delay * ARILUX_RF_RECEIVE_TOLERANCE / 100; for (unsigned int i = 1; i < Arilux.rf_change_count -1; i += 2) { code <<= 1; if (abs(Arilux.rf_timings[i] - (delay *3)) < delayTolerance && abs(Arilux.rf_timings[i +1] - delay) < delayTolerance) {