From a6310780ee665394edb5c9b570acef4155f1b6a8 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 25 Aug 2021 15:24:55 +0200 Subject: [PATCH 01/31] Fix Sonoff L1 Lite MusicSync mode Fix unable to disable MusicSync mode on Sonoff L1 Lite regression from 9.3.0 (#12930) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xlgt_05_sonoff_l1.ino | 18 +++++++++--------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d62165be9..2efdb2ef2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file. - Shelly 2.5 negative power values on relay 1 regression from 9.5.0.5 - Wiegand support for keypad zero key in single key mode using ``SetOption124 1`` (#12960) - Hass and Tasmota discovery prefix topic notifications (#12972) +- Unable to disable MusicSync mode on Sonoff L1 Lite regression from 9.3.0 (#12930) ## [9.5.0.6] 20210820 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0f236ebfd..13c750ec0 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -169,5 +169,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Neopool communication error [#12813](https://github.com/arendst/Tasmota/issues/12813) - WDT reset on shutters with stepper motors during deceleration [#12849](https://github.com/arendst/Tasmota/issues/12849) - Negative power values for ADE7953 based devices like Shelly EM [#12874](https://github.com/arendst/Tasmota/issues/12874) +- Unable to disable MusicSync mode on Sonoff L1 Lite regression from 9.3.0 [#12930](https://github.com/arendst/Tasmota/issues/12930) - Wiegand support for keypad zero key in single key mode using ``SetOption124 1`` [#12960](https://github.com/arendst/Tasmota/issues/12960) - Hass and Tasmota discovery prefix topic notifications [#12972](https://github.com/arendst/Tasmota/issues/12972) diff --git a/tasmota/xlgt_05_sonoff_l1.ino b/tasmota/xlgt_05_sonoff_l1.ino index f120bbd79..299c054f0 100644 --- a/tasmota/xlgt_05_sonoff_l1.ino +++ b/tasmota/xlgt_05_sonoff_l1.ino @@ -250,19 +250,19 @@ bool SnfL1SetChannels(void) { } if (!power_changed && !dimmer_changed && !color_changed && (Snfl1.old_music_sync == Settings->sbflag1.sonoff_l1_music_sync)) { return true; } - uint32_t mode = SONOFF_L1_MODE_COLORFUL; - if (Settings->sbflag1.sonoff_l1_music_sync) { - mode = SONOFF_L1_MODE_SYNC_TO_MUSIC; - } - - snprintf_P(Snfl1.buffer, SONOFF_L1_BUFFER_SIZE, PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"switch\":\"%s\",\"light_type\":1,\"colorR\":%d,\"colorG\":%d,\"colorB\":%d,\"bright\":%d,\"mode\":%d,\"sensitive\":%d,\"speed\":%d"), + uint32_t mode = (Settings->sbflag1.sonoff_l1_music_sync) ? SONOFF_L1_MODE_SYNC_TO_MUSIC : SONOFF_L1_MODE_COLORFUL; + snprintf_P(Snfl1.buffer, SONOFF_L1_BUFFER_SIZE, PSTR("AT+UPDATE=\"sequence\":\"%d%03d\",\"switch\":\"%s\",\"light_type\":1,\"colorR\":%d,\"colorG\":%d,\"colorB\":%d,\"bright\":%d,\"mode\":%d"), LocalTime(), millis()%1000, Snfl1.power ? "on" : "off", Snfl1.color[0], Snfl1.color[1], Snfl1.color[2], Snfl1.dimmer, - mode, - Snfl1.sensitive, - Snfl1.speed); + mode); + if (SONOFF_L1_MODE_SYNC_TO_MUSIC == mode) { + snprintf_P(Snfl1.buffer, SONOFF_L1_BUFFER_SIZE, PSTR("%s,\"sensitive\":%d,\"speed\":%d"), + Snfl1.buffer, + Snfl1.sensitive, + Snfl1.speed); + } #ifdef SONOFF_L1_START_DELAY static bool first_call = true; From 7ad29750635b489b7a8400370ed6a8c53e14a397 Mon Sep 17 00:00:00 2001 From: Wouter Breukink Date: Sun, 8 Aug 2021 21:19:44 +0100 Subject: [PATCH 02/31] Added support for Hydreon RG-15 Rain Sensor --- tasmota/language/af_AF.h | 2 + tasmota/language/bg_BG.h | 2 + tasmota/language/cs_CZ.h | 2 + tasmota/language/de_DE.h | 2 + tasmota/language/el_GR.h | 2 + tasmota/language/en_GB.h | 2 + tasmota/language/es_ES.h | 2 + tasmota/language/fr_FR.h | 2 + tasmota/language/fy_NL.h | 2 + tasmota/language/he_HE.h | 2 + tasmota/language/hu_HU.h | 2 + tasmota/language/it_IT.h | 2 + tasmota/language/ko_KO.h | 2 + tasmota/language/nl_NL.h | 2 + tasmota/language/pl_PL.h | 2 + tasmota/language/pt_BR.h | 2 + tasmota/language/pt_PT.h | 2 + tasmota/language/ro_RO.h | 2 + tasmota/language/ru_RU.h | 2 + tasmota/language/sk_SK.h | 2 + tasmota/language/sv_SE.h | 2 + tasmota/language/tr_TR.h | 2 + tasmota/language/uk_UA.h | 2 + tasmota/language/vi_VN.h | 2 + tasmota/language/zh_CN.h | 2 + tasmota/language/zh_TW.h | 2 + tasmota/tasmota_template.h | 6 + tasmota/xsns_90_hrg15.ino | 233 +++++++++++++++++++++++++++++++++++++ 28 files changed, 291 insertions(+) create mode 100644 tasmota/xsns_90_hrg15.ino diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 9cf907e22..3de656a31 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 59af27f2c..a48eb1002 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -835,6 +835,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 6bffd8849..132db487a 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index d0fccd6ca..625354541 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index e71ee964a..9ce804712 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 40986f104..daa138c52 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 239cb2ac7..4c62fdb4b 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index a63b252c0..2a6ee9205 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 3984dc0c5..466f5d019 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index eba8fa655..ef070a454 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index f7d51de3e..40dd559c3 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 8d76ab9d3..1dcb99651 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "Effetto hall" #define D_SENSOR_EPD_DATA "EPD - Dati" #define D_SENSOR_MCP2515_CS "MCP2515 - CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 5da66f819..0e0ba113e 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 54ed3cc5b..ca755b4aa 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index d90d6099a..af637038c 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "Efekt Halla" #define D_SENSOR_EPD_DATA "EPD Dane" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index e7b0a938f..e1054caf0 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "Efeito Hall" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 4eeb9eb28..6cc66ce12 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "Efeito Hall" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index e3ec62390..8b7bc46cd 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 9f58134c1..b4167028e 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index ac554d43e..50b299796 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 5d46cb0f5..03d2537b5 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index bfdd34f63..6d53258de 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 25ffd199c..5a21b20a9 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 59efb8330..c36fb29b1 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 036f4c352..97533a1c2 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 18540574f..f7b4437f7 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -836,6 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" +#define D_SENSOR_HRG15_RX "HRG15 RX" +#define D_SENSOR_HRG15_TX "HRG15 TX" // Units #define D_UNIT_AMPERE "安培" diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index fb7220586..94e7f6f2d 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -170,6 +170,7 @@ enum UserSelectablePins { GPIO_I2S_IN_DATA, GPIO_I2S_IN_CLK, GPIO_I2S_IN_SLCT, GPIO_INTERRUPT, GPIO_MCP2515_CS, // MCP2515 Chip Select + GPIO_HRG15_RX, GPIO_HRG15_TX, // Hydreon RG-15 rain sensor serial interface GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -360,6 +361,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_I2S_IN_DATA "|" D_SENSOR_I2S_IN_CLK "|" D_SENSOR_I2S_IN_SLCT "|" D_SENSOR_INTERRUPT "|" D_SENSOR_MCP2515_CS "|" + D_SENSOR_HRG15_RX "|" D_SENSOR_HRG15_TX ; const char kSensorNamesFixed[] PROGMEM = @@ -791,6 +793,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_AS608_TX), AGPIO(GPIO_AS608_RX), #endif +#ifdef USE_HRG15 + AGPIO(GPIO_HRG15_RX), + AGPIO(GPIO_HRG15_TX), +#endif /*-------------------------------------------------------------------------------------------*\ * Other sensors diff --git a/tasmota/xsns_90_hrg15.ino b/tasmota/xsns_90_hrg15.ino new file mode 100644 index 000000000..adf7461c0 --- /dev/null +++ b/tasmota/xsns_90_hrg15.ino @@ -0,0 +1,233 @@ +/* + xsns_90-hrg15.ino - Hydreon RG-15 support for Tasmota + + Copyright (c) 2021 Wouter Breukink + + 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_HRG15 +/*********************************************************************************************\ + * Hydreon RG-15 + * See https://rainsensors.com/products/rg-15/ +\*********************************************************************************************/ + +#define XSNS_90 90 + +#define RG15_NAME "RG-15" +#define RG15_BAUDRATE 9600 +#define RG15_READ_TIMEOUT 500 +#define RG15_EVENT_TIMEOUT 60 + +#include + +#ifdef USE_WEBSERVER +const char HTTP_RG15[] PROGMEM = + // {s} = , {m} = , {e} = + "{s}" RG15_NAME " " D_JSON_ACTIVE "{m}%2_f " D_UNIT_MILLIMETER "{e}" + "{s}" RG15_NAME " " D_JSON_EVENT "{m}%2_f " D_UNIT_MILLIMETER "{e}" + "{s}" RG15_NAME " " D_JSON_TOTAL "{m}%2_f " D_UNIT_MILLIMETER "{e}" + "{s}" RG15_NAME " " D_JSON_FLOWRATE "{m}%2_f " D_UNIT_MILLIMETER "/" D_UNIT_HOUR "{e}"; +#endif // USE_WEBSERVER + +TasmotaSerial *HydreonSerial; + +struct RG15 { + uint16_t time = RG15_EVENT_TIMEOUT; + uint8_t ready = 1; + uint8_t received = 0; + float acc = 0.0f; + float event = 0.0f; + float total = 0.0f; + float rate = 0.0f; +} Rg15; + +void Rg15Init(void) +{ + Rg15.ready = 0; + if (PinUsed(GPIO_HRG15_RX) && PinUsed(GPIO_HRG15_TX)) { + HydreonSerial = new TasmotaSerial(Pin(GPIO_HRG15_RX), Pin(GPIO_HRG15_TX)); + if (HydreonSerial->begin(RG15_BAUDRATE)) { + if (HydreonSerial->hardwareSerial()) { ClaimSerial(); } + + HydreonSerial->println('R'); + + Rg15.ready = 1; + } + } +} + +bool Rg15Poll(void) { + + // Trigger the first update + if (! Rg15.received) { + HydreonSerial->println('R'); + } + + if (! HydreonSerial->available()) { + + // Check if the rain event has timed out, reset rate to 0 + if (++Rg15.time == RG15_EVENT_TIMEOUT) { + Rg15.acc = 0; + Rg15.rate = 0; + MqttPublishSensor(); + } + + return false; + } + + // Now read what's available + char rg15_buffer[255]; + + while (HydreonSerial->available()) { + Rg15ReadLine(rg15_buffer); + AddLog(LOG_LEVEL_DEBUG_MORE,PSTR("%s:" D_JSON_SERIALRECEIVED " = %s"),"HRG", rg15_buffer); + + Rg15Process(rg15_buffer); + } + + MqttPublishSensor(); + + return true; +} + +bool Rg15ReadLine(char* buffer) +{ + char c; + uint8_t i = 0; + uint32_t cmillis = millis(); + + while (1) { + if (HydreonSerial->available()) { + c = HydreonSerial->read(); + buffer[i++] = c; + + if (c == 10) { break; } // New line ends the message + if (i == 254) { break; } // Overflow + } + + if ((millis() - cmillis) > RG15_READ_TIMEOUT) { + return false; + } + } + + buffer[i-2] = '\0'; + return true; +} + +void Rg15Process(char* buffer) { + + // Process payload, example: Acc 0.01 mm, EventAcc 2.07 mm, TotalAcc 54.85 mm, RInt 2.89 mmph + Rg15.received = 1; + Rg15.acc = Rg15Parse(buffer, "Acc"); + Rg15.event = Rg15Parse(buffer, "EventAcc"); + Rg15.total = Rg15Parse(buffer, "TotalAcc"); + Rg15.rate = Rg15Parse(buffer, "RInt"); + + if (Rg15.acc > 0.0f) { + Rg15.time = 0; // We have some data, so the rain event is on-going + } +} + +float Rg15Parse(char* buffer, const char* item) { + char* start = strstr(buffer, item); + if (start != nullptr) { + char* end = strstr(start, " mm"); + char tmp = end[0]; + end[0] = '\0'; + float result = CharToFloat (start + strlen(item)); + end[0] = tmp; + return result; + } else { + return 0.0f; + } +} + +bool Rg15Command(void) { + bool serviced = true; + + if (XdrvMailbox.data_len == 1) { + char *send = XdrvMailbox.data; + HydreonSerial->println(send); + HydreonSerial->flush(); + + if (send[0] == 'k' || send[0] == 'K' || send[0] == 'o' || send[0] == 'O') { + ResponseCmndDone(); + return serviced; + } + + char rg15_buffer[255]; + if (Rg15ReadLine(rg15_buffer)) { + Response_P(PSTR("{\"" D_JSON_SERIALRECEIVED "\":%s\"}"), rg15_buffer); + Rg15Process(rg15_buffer); + } + } + + return serviced; +} + +void Rg15Show(bool json) +{ + if (!Rg15.received) { + return; + } + + if (json) { + ResponseAppend_P(PSTR(",\"" RG15_NAME "\":{\"" D_JSON_ACTIVE "\":%2_f, \"" D_JSON_EVENT "\":%2_f, \"" D_JSON_TOTAL "\":%2_f, \"" D_JSON_FLOWRATE "\":%2_f}"), &Rg15.acc, &Rg15.event, &Rg15.total, &Rg15.rate); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_RG15, &Rg15.acc, &Rg15.event, &Rg15.total, &Rg15.rate); +#endif // USE_WEBSERVER + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns90(uint8_t function) +{ + + bool result = false; + + if (Rg15.ready) + { + switch (function) + { + case FUNC_INIT: + Rg15Init(); + break; + case FUNC_COMMAND_SENSOR: + if (XSNS_90 == XdrvMailbox.index) { + Rg15Command(); + } + break; + case FUNC_EVERY_SECOND: + Rg15Poll(); + break; + case FUNC_JSON_APPEND: + Rg15Show(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Rg15Show(0); + break; +#endif // USE_WEBSERVER + } + } + + return result; +} + +#endif // USE_HRG15 \ No newline at end of file From a4e36d8224059212ccb127af907b209dc6b27679 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 25 Aug 2021 16:40:03 +0200 Subject: [PATCH 03/31] Add command ``Subscribe2 ...`` Add command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" (#12858) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xdrv_10_rules.ino | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2efdb2ef2..6317047c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Turn HTTP API (command ``SetOption128 1``) default on for backward compatibility - Support for IEM3155 Wattmeter (#12940) - Berry support for vararg +- Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" (#12858) ### Changed - Shelly EM template needs to use GPIO ADE7953_IRQ_2 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 13c750ec0..73091dd66 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -120,6 +120,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for CAN bus and Freedom Won Battery Management System by Marius Bezuidenhout [#12651](https://github.com/arendst/Tasmota/issues/12651) - Optional IP filter to command ``TCPStart`` [#12806](https://github.com/arendst/Tasmota/issues/12806) - Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) +- Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" [#12858](https://github.com/arendst/Tasmota/issues/12858) - Support for IEM3155 Wattmeter [#12940](https://github.com/arendst/Tasmota/issues/12940) ### Changed diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index a4d454040..9e2652d06 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -1171,7 +1171,11 @@ void CmndSubscribe(void) subscription_item.Key = key; subscriptions.add(subscription_item); + if (2 == XdrvMailbox.index) { + topic = subscription_item.Topic; // Do not append "/#"" + } MqttSubscribe(topic.c_str()); + events.concat(event_name + "," + topic + (key.length()>0 ? "," : "") + key); From d4f444a85af216ffc0cc1cb8c22fc92685a0b265 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 25 Aug 2021 17:25:11 +0200 Subject: [PATCH 04/31] Add support for Hydreon RG-15 Solid State Rain sensor Add support for Hydreon RG-15 Solid State Rain sensor (#12974) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/language/af_AF.h | 4 ++-- tasmota/language/bg_BG.h | 4 ++-- tasmota/language/cs_CZ.h | 4 ++-- tasmota/language/de_DE.h | 4 ++-- tasmota/language/el_GR.h | 4 ++-- tasmota/language/en_GB.h | 4 ++-- tasmota/language/es_ES.h | 4 ++-- tasmota/language/fr_FR.h | 4 ++-- tasmota/language/fy_NL.h | 4 ++-- tasmota/language/he_HE.h | 4 ++-- tasmota/language/hu_HU.h | 4 ++-- tasmota/language/it_IT.h | 4 ++-- tasmota/language/ko_KO.h | 4 ++-- tasmota/language/nl_NL.h | 4 ++-- tasmota/language/pl_PL.h | 4 ++-- tasmota/language/pt_BR.h | 4 ++-- tasmota/language/pt_PT.h | 4 ++-- tasmota/language/ro_RO.h | 4 ++-- tasmota/language/ru_RU.h | 4 ++-- tasmota/language/sk_SK.h | 4 ++-- tasmota/language/sv_SE.h | 4 ++-- tasmota/language/tr_TR.h | 4 ++-- tasmota/language/uk_UA.h | 4 ++-- tasmota/language/vi_VN.h | 4 ++-- tasmota/language/zh_CN.h | 4 ++-- tasmota/language/zh_TW.h | 4 ++-- tasmota/my_user_config.h | 1 + tasmota/support_features.ino | 5 +++-- tasmota/tasmota_configurations.h | 1 + tasmota/tasmota_configurations_ESP32.h | 1 + tasmota/tasmota_template.h | 6 +++--- tasmota/xsns_90_hrg15.ino | 6 +++--- tools/decode-status.py | 4 ++-- 35 files changed, 68 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6317047c5..a6c34906a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for IEM3155 Wattmeter (#12940) - Berry support for vararg - Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" (#12858) +- Support for Hydreon RG-15 Solid State Rain sensor (#12974) ### Changed - Shelly EM template needs to use GPIO ADE7953_IRQ_2 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 73091dd66..4af686e81 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -122,6 +122,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Inital support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784) - Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" [#12858](https://github.com/arendst/Tasmota/issues/12858) - Support for IEM3155 Wattmeter [#12940](https://github.com/arendst/Tasmota/issues/12940) +- Support for Hydreon RG-15 Solid State Rain sensor [#12974](https://github.com/arendst/Tasmota/issues/12974) ### Changed - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 3de656a31..18d3fd4b8 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index a48eb1002..6b256c80c 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -835,8 +835,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 132db487a..c37b21952 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 625354541..29ab0818d 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 9ce804712..e49a964ea 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index daa138c52..ba6b11cd0 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 4c62fdb4b..d41a70ac1 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 2a6ee9205..ec04ab26b 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 466f5d019..7b2e0b366 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index ef070a454..68f324a8c 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 40dd559c3..7455ee7f6 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 1dcb99651..7fe20f02d 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "Effetto hall" #define D_SENSOR_EPD_DATA "EPD - Dati" #define D_SENSOR_MCP2515_CS "MCP2515 - CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 0e0ba113e..86f9c0ea3 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index ca755b4aa..46243e5e7 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index af637038c..7d2ccf154 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "Efekt Halla" #define D_SENSOR_EPD_DATA "EPD Dane" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index e1054caf0..ed2812cc8 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "Efeito Hall" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 6cc66ce12..4853fdd0a 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "Efeito Hall" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 8b7bc46cd..88f9a99f9 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index b4167028e..6642506b1 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 50b299796..7cbb51d2f 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 03d2537b5..9de80ed08 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 6d53258de..6f236ed7f 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 5a21b20a9..68181966b 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index c36fb29b1..11a35daea 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 97533a1c2..3d6475d37 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index f7b4437f7..08ac66206 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -836,8 +836,8 @@ #define D_SENSOR_HALLEFFECT "HallEffect" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_MCP2515_CS "MCP2515 CS" -#define D_SENSOR_HRG15_RX "HRG15 RX" -#define D_SENSOR_HRG15_TX "HRG15 TX" +#define D_SENSOR_HRG15_RX "HRG15 Rx" +#define D_SENSOR_HRG15_TX "HRG15 Tx" // Units #define D_UNIT_AMPERE "安培" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 1dbb347cb..bb6a5a45d 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -743,6 +743,7 @@ //#define USE_AS608 // Add support for AS608 optical and R503 capacitive fingerprint sensor (+3k code) // #define USE_AS608_MESSAGES // Add verbose error messages (+0k4 code) //#define USE_TFMINIPLUS // Add support for TFmini Plus (TFmini, TFmini-S) LiDAR modules via UART interface (+0k8) +//#define USE_HRG15 // Add support for Hydreon RG-15 Solid State Rain sensor (+1k5 code) // -- Power monitoring sensors -------------------- #define USE_ENERGY_SENSOR // Add support for Energy Monitors (+14k code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index ec5bc7bdd..68008637c 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -762,8 +762,9 @@ void ResponseAppendFeatures(void) #ifdef USE_INFLUXDB feature8 |= 0x00000800; // xdrv_59_influxdb.ino #endif - -// feature8 |= 0x00001000; +#ifdef USE_HRG15 + feature8 |= 0x00001000; // xsns_90_hrg15.ino +#endif // feature8 |= 0x00002000; // feature8 |= 0x00004000; // feature8 |= 0x00008000; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 6530cdbc3..bdcb005cc 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -188,6 +188,7 @@ // #define USE_PROJECTOR_CTRL_OPTOMA // Use codes for OPTOMA //#define USE_AS608 // Add support for AS608 optical and R503 capacitive fingerprint sensor (+3k4 code) //#define USE_TFMINIPLUS // Add suppoer for TFmini Plus (TFmini, TFmini-S) LiDAR modules via UART interface +//#define USE_HRG15 // Add support for Hydreon RG-15 Solid State Rain sensor (+1k5 code) #define USE_ENERGY_SENSOR // Add energy sensors (-14k code) #define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code) diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index 5f944082d..c25f42de9 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -476,6 +476,7 @@ // #define USE_PROJECTOR_CTRL_OPTOMA // Use codes for OPTOMA //#define USE_AS608 // Add support for AS608 optical and R503 capacitive fingerprint sensor (+3k4 code) //#define USE_TFMINIPLUS // Add support for TFmini Plus (TFmini, TFmini-S) LiDAR modules via UART interface +//#define USE_HRG15 // Add support for Hydreon RG-15 Solid State Rain sensor (+1k5 code) #define USE_ENERGY_SENSOR // Add energy sensors (-14k code) #define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 94e7f6f2d..acede8653 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -170,7 +170,7 @@ enum UserSelectablePins { GPIO_I2S_IN_DATA, GPIO_I2S_IN_CLK, GPIO_I2S_IN_SLCT, GPIO_INTERRUPT, GPIO_MCP2515_CS, // MCP2515 Chip Select - GPIO_HRG15_RX, GPIO_HRG15_TX, // Hydreon RG-15 rain sensor serial interface + GPIO_HRG15_TX, GPIO_HRG15_RX, // Hydreon RG-15 rain sensor serial interface GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -361,7 +361,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_I2S_IN_DATA "|" D_SENSOR_I2S_IN_CLK "|" D_SENSOR_I2S_IN_SLCT "|" D_SENSOR_INTERRUPT "|" D_SENSOR_MCP2515_CS "|" - D_SENSOR_HRG15_RX "|" D_SENSOR_HRG15_TX + D_SENSOR_HRG15_TX "|" D_SENSOR_HRG15_RX ; const char kSensorNamesFixed[] PROGMEM = @@ -794,8 +794,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_AS608_RX), #endif #ifdef USE_HRG15 - AGPIO(GPIO_HRG15_RX), AGPIO(GPIO_HRG15_TX), + AGPIO(GPIO_HRG15_RX), #endif /*-------------------------------------------------------------------------------------------*\ diff --git a/tasmota/xsns_90_hrg15.ino b/tasmota/xsns_90_hrg15.ino index adf7461c0..f7ba63721 100644 --- a/tasmota/xsns_90_hrg15.ino +++ b/tasmota/xsns_90_hrg15.ino @@ -1,7 +1,7 @@ /* xsns_90-hrg15.ino - Hydreon RG-15 support for Tasmota - Copyright (c) 2021 Wouter Breukink + Copyright (c) 2021 Wouter Breukink 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 @@ -93,7 +93,7 @@ bool Rg15Poll(void) { while (HydreonSerial->available()) { Rg15ReadLine(rg15_buffer); AddLog(LOG_LEVEL_DEBUG_MORE,PSTR("%s:" D_JSON_SERIALRECEIVED " = %s"),"HRG", rg15_buffer); - + Rg15Process(rg15_buffer); } @@ -127,7 +127,7 @@ bool Rg15ReadLine(char* buffer) } void Rg15Process(char* buffer) { - + // Process payload, example: Acc 0.01 mm, EventAcc 2.07 mm, TotalAcc 54.85 mm, RInt 2.89 mmph Rg15.received = 1; Rg15.acc = Rg15Parse(buffer, "Acc"); diff --git a/tools/decode-status.py b/tools/decode-status.py index b2f54a711..a7c900ed9 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -256,7 +256,7 @@ a_features = [[ "USE_MPU_ACCEL","USE_TFMINIPLUS","USE_CSE7761","USE_BERRY", "USE_BM8563","USE_ENERGY_DUMMY","USE_AM2320","USE_T67XX", "USE_MCP2515","USE_TASMESH","USE_WIFI_RANGE_EXTENDER","USE_INFLUXDB", - "","","","", + "USE_HRG15","","","", "","","","", "","","","", "","","","", @@ -288,7 +288,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20210812 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v20210825 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 454d4601b48a6945cecca2e521fd1e641280f404 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 26 Aug 2021 11:16:28 +0200 Subject: [PATCH 05/31] Add support for IKEA VINDRIKTNING Add support for IKEA VINDRIKTNING particle concentration sensor (#12976) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/language/af_AF.h | 1 + tasmota/language/bg_BG.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/fy_NL.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/vi_VN.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + tasmota/my_user_config.h | 1 + tasmota/support_features.ino | 4 +- tasmota/tasmota_template.h | 7 +- tasmota/xsns_91_vindriktning.ino | 170 +++++++++++++++++++++++++++++++ tools/decode-status.py | 4 +- 33 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 tasmota/xsns_91_vindriktning.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index a6c34906a..336c85abe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Berry support for vararg - Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" (#12858) - Support for Hydreon RG-15 Solid State Rain sensor (#12974) +- Support for IKEA VINDRIKTNING particle concentration sensor (#12976) ### Changed - Shelly EM template needs to use GPIO ADE7953_IRQ_2 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4af686e81..f87825dd6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -123,6 +123,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" [#12858](https://github.com/arendst/Tasmota/issues/12858) - Support for IEM3155 Wattmeter [#12940](https://github.com/arendst/Tasmota/issues/12940) - Support for Hydreon RG-15 Solid State Rain sensor [#12974](https://github.com/arendst/Tasmota/issues/12974) +- Support for IKEA VINDRIKTNING particle concentration sensor [#12976](https://github.com/arendst/Tasmota/issues/12976) ### Changed - Move firmware binaries to https://github.com/arendst/Tasmota-firmware/tree/main/release-firmware diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 18d3fd4b8..766f31d6a 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 6b256c80c..358390bc9 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -837,6 +837,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index c37b21952..be7396a92 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 29ab0818d..fdee2f6c3 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index e49a964ea..d18aa9bce 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index ba6b11cd0..2caab6abc 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index d41a70ac1..c5d98d79e 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index ec04ab26b..bd63fc53f 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 7b2e0b366..86e0fb7d2 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 68f324a8c..efd02b2f4 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 7455ee7f6..3da61ccc6 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 7fe20f02d..2d80dea18 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 - CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 86f9c0ea3..d427966cd 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 46243e5e7..56015b023 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 7d2ccf154..7f9b79727 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index ed2812cc8..83a9d88c3 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 4853fdd0a..831563664 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 88f9a99f9..b1058e60d 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 6642506b1..b6fb1bc35 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 7cbb51d2f..3ac233b00 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 9de80ed08..c026d53b6 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 6f236ed7f..5d2d969b4 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 68181966b..3be6240c2 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 11a35daea..d1e855bec 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 3d6475d37..c9a64adac 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 08ac66206..2074f04f7 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -838,6 +838,7 @@ #define D_SENSOR_MCP2515_CS "MCP2515 CS" #define D_SENSOR_HRG15_RX "HRG15 Rx" #define D_SENSOR_HRG15_TX "HRG15 Tx" +#define D_SENSOR_VINDRIKTNING_RX "VINDRIKTNING" // Units #define D_UNIT_AMPERE "安培" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index bb6a5a45d..9c85c7549 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -744,6 +744,7 @@ // #define USE_AS608_MESSAGES // Add verbose error messages (+0k4 code) //#define USE_TFMINIPLUS // Add support for TFmini Plus (TFmini, TFmini-S) LiDAR modules via UART interface (+0k8) //#define USE_HRG15 // Add support for Hydreon RG-15 Solid State Rain sensor (+1k5 code) +//#define USE_VINDRIKTNING // Add support for IKEA VINDRIKTNING particle concentration sensor (+1k code) // -- Power monitoring sensors -------------------- #define USE_ENERGY_SENSOR // Add support for Energy Monitors (+14k code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 68008637c..114809a00 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -765,7 +765,9 @@ void ResponseAppendFeatures(void) #ifdef USE_HRG15 feature8 |= 0x00001000; // xsns_90_hrg15.ino #endif -// feature8 |= 0x00002000; +#ifdef USE_VINDRIKTNING + feature8 |= 0x00002000; // xsns_91_vindriktning.ino +#endif // feature8 |= 0x00004000; // feature8 |= 0x00008000; diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index acede8653..cb8b664af 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -171,6 +171,7 @@ enum UserSelectablePins { GPIO_INTERRUPT, GPIO_MCP2515_CS, // MCP2515 Chip Select GPIO_HRG15_TX, GPIO_HRG15_RX, // Hydreon RG-15 rain sensor serial interface + GPIO_VINDRIKTNING_RX, // IKEA VINDRIKTNING Serial interface GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -361,7 +362,8 @@ const char kSensorNames[] PROGMEM = D_SENSOR_I2S_IN_DATA "|" D_SENSOR_I2S_IN_CLK "|" D_SENSOR_I2S_IN_SLCT "|" D_SENSOR_INTERRUPT "|" D_SENSOR_MCP2515_CS "|" - D_SENSOR_HRG15_TX "|" D_SENSOR_HRG15_RX + D_SENSOR_HRG15_TX "|" D_SENSOR_HRG15_RX "|" + D_SENSOR_VINDRIKTNING_RX ; const char kSensorNamesFixed[] PROGMEM = @@ -797,6 +799,9 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_HRG15_TX), AGPIO(GPIO_HRG15_RX), #endif +#ifdef USE_VINDRIKTNING + AGPIO(GPIO_VINDRIKTNING_RX), +#endif /*-------------------------------------------------------------------------------------------*\ * Other sensors diff --git a/tasmota/xsns_91_vindriktning.ino b/tasmota/xsns_91_vindriktning.ino new file mode 100644 index 000000000..640eeede9 --- /dev/null +++ b/tasmota/xsns_91_vindriktning.ino @@ -0,0 +1,170 @@ +/* + xsns_91_vindriktning.ino - IKEA vindriktning particle concentration sensor support for Tasmota + + Copyright (C) 2021 Marcel Ritter and Theo Arends + + 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_VINDRIKTNING +/*********************************************************************************************\ + * IKEA VINDRIKTNING particle concentration sensor +\*********************************************************************************************/ + +#define XSNS_91 91 + +#include + +#ifndef MIN_INTERVAL_PERIOD +#define MIN_INTERVAL_PERIOD 60 // minimum interval period in seconds required for passive mode +#endif + +#define VINDRIKTNING_DATASET_SIZE 20 + +TasmotaSerial *VindriktningSerial; + +struct VINDRIKTNING { + uint16_t pm2_5 = 0; + uint16_t pm1_0 = 0; + uint16_t pm10 = 0; + uint8_t type = 1; + uint8_t valid = 0; + bool discovery_triggered = false; +} Vindriktning; + +bool VindriktningReadData(void) { + if (!VindriktningSerial->available()) { + return false; + } + + int serial_in_byte_counter = 0; + uint8_t buffer[VINDRIKTNING_DATASET_SIZE]; + uint8_t crc = 0; + + while (VindriktningSerial->available()) { + uint8_t serial_in_byte = VindriktningSerial->read(); + if (serial_in_byte_counter <= VINDRIKTNING_DATASET_SIZE -1) { + buffer[serial_in_byte_counter++] = serial_in_byte; + crc += serial_in_byte; + } + } + VindriktningSerial->flush(); // Make room for another burst + + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, buffer, VINDRIKTNING_DATASET_SIZE); + + if (serial_in_byte_counter < VINDRIKTNING_DATASET_SIZE) { + AddLog(LOG_LEVEL_DEBUG, PSTR("VDN: Not enough data (%d < 20)"), serial_in_byte_counter); + return false; + } + + if (crc != 0) { + AddLog(LOG_LEVEL_DEBUG, PSTR("VDN: " D_CHECKSUM_FAILURE)); + return false; + } + + // sample data: + // 16 11 0b 00 00 00 0c 00 00 03 cb 00 00 00 0c 01 00 00 00 e7 + // |pm2_5| |pm1_0| |pm10 | | CRC | + Vindriktning.pm2_5 = (buffer[5] << 8) | buffer[6]; + Vindriktning.pm1_0 = (buffer[9] << 8) | buffer[10]; + Vindriktning.pm10 = (buffer[13] << 8) | buffer[14]; + + if (!Vindriktning.discovery_triggered) { + TasmotaGlobal.discovery_counter = 1; // force TasDiscovery() + Vindriktning.discovery_triggered = true; + } + return true; +} + +/*********************************************************************************************/ + +void VindriktningSecond(void) { // Every second + if (VindriktningReadData()) { + Vindriktning.valid = MIN_INTERVAL_PERIOD; + } else { + if (Vindriktning.valid) { + Vindriktning.valid--; + } + } +} + +/*********************************************************************************************/ + +void VindriktningInit(void) { + Vindriktning.type = 0; + if (PinUsed(GPIO_VINDRIKTNING_RX)) { + VindriktningSerial = new TasmotaSerial(Pin(GPIO_VINDRIKTNING_RX), -1, 1); + if (VindriktningSerial->begin(9600)) { + if (VindriktningSerial->hardwareSerial()) { ClaimSerial(); } + Vindriktning.type = 1; + } + } +} + +#ifdef USE_WEBSERVER +const char HTTP_VINDRIKTNING_SNS[] PROGMEM = + "{s}VINDRIKTNING " D_ENVIRONMENTAL_CONCENTRATION " 1.0 " D_UNIT_MICROMETER "{m}%d " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}" + "{s}VINDRIKTNING " D_ENVIRONMENTAL_CONCENTRATION " 2.5 " D_UNIT_MICROMETER "{m}%d " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}" + "{s}VINDRIKTNING " D_ENVIRONMENTAL_CONCENTRATION " 10 " D_UNIT_MICROMETER "{m}%d " D_UNIT_MICROGRAM_PER_CUBIC_METER "{e}"; // {s} = , {m} = , {e} = +#endif // USE_WEBSERVER + +void VindriktningShow(bool json) { + if (Vindriktning.valid) { + if (json) { + ResponseAppend_P(PSTR(",\"VINDRIKTNING\":{\"PM1\":%d,\"PM2.5\":%d,\"PM10\":%d}"), + Vindriktning.pm1_0, Vindriktning.pm2_5, Vindriktning.pm10); +#ifdef USE_DOMOTICZ + if (0 == TasmotaGlobal.tele_period) { + DomoticzSensor(DZ_COUNT, Vindriktning.pm1_0); // PM1.0 + DomoticzSensor(DZ_VOLTAGE, Vindriktning.pm2_5); // PM2.5 + DomoticzSensor(DZ_CURRENT, Vindriktning.pm10); // PM10 + } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_VINDRIKTNING_SNS, Vindriktning.pm1_0, Vindriktning.pm2_5, Vindriktning.pm10); +#endif // USE_WEBSERVER + } + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns91(uint8_t function) { + bool result = false; + + if (Vindriktning.type) { + switch (function) { + case FUNC_EVERY_SECOND: + VindriktningSecond(); + break; + case FUNC_JSON_APPEND: + VindriktningShow(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + VindriktningShow(0); + break; +#endif // USE_WEBSERVER + case FUNC_INIT: + VindriktningInit(); + break; + } + } + return result; +} + +#endif // USE_VINDRIKTNING \ No newline at end of file diff --git a/tools/decode-status.py b/tools/decode-status.py index a7c900ed9..ffbbca5b0 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -256,7 +256,7 @@ a_features = [[ "USE_MPU_ACCEL","USE_TFMINIPLUS","USE_CSE7761","USE_BERRY", "USE_BM8563","USE_ENERGY_DUMMY","USE_AM2320","USE_T67XX", "USE_MCP2515","USE_TASMESH","USE_WIFI_RANGE_EXTENDER","USE_INFLUXDB", - "USE_HRG15","","","", + "USE_HRG15","USE_VINDRIKTNING","","", "","","","", "","","","", "","","","", @@ -288,7 +288,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20210825 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v20210826 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From c17b5a6178f647fca80a63c778a81a4edd1230a2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 26 Aug 2021 11:50:15 +0200 Subject: [PATCH 06/31] Add PMS5003 delayed discovery --- tasmota/xsns_18_pms5003.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasmota/xsns_18_pms5003.ino b/tasmota/xsns_18_pms5003.ino index 604583067..b1cac1a81 100644 --- a/tasmota/xsns_18_pms5003.ino +++ b/tasmota/xsns_18_pms5003.ino @@ -48,6 +48,7 @@ struct PMS5003 { uint8_t valid = 0; uint8_t wake_mode = 1; uint8_t ready = 1; + bool discovery_triggered = false; } Pms; enum PmsCommands @@ -156,6 +157,11 @@ bool PmsReadData(void) #endif // PMS_MODEL_PMS3003 Pms.valid = 10; + if (!Pms.discovery_triggered) { + TasmotaGlobal.discovery_counter = 1; // Force discovery + Pms.discovery_triggered = true; + } + return true; } From 6836f232a3c32cd2c9a3bec27031beb246720d92 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 26 Aug 2021 13:50:05 +0200 Subject: [PATCH 07/31] enable PSRAM if found --- boards/esp32_16M.json | 2 +- boards/esp32_4M.json | 2 +- boards/esp32_8M.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/boards/esp32_16M.json b/boards/esp32_16M.json index 7bcc0db53..69abb9a09 100644 --- a/boards/esp32_16M.json +++ b/boards/esp32_16M.json @@ -4,7 +4,7 @@ "ldscript": "esp32_out.ld" }, "core": "esp32", - "extra_flags": "-DARDUINO_ESP32_DEV -DESP32_16M", + "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DESP32_16M", "f_cpu": "80000000L", "f_flash": "40000000L", "flash_mode": "dout", diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json index 4f549bb3e..f43be6848 100644 --- a/boards/esp32_4M.json +++ b/boards/esp32_4M.json @@ -4,7 +4,7 @@ "ldscript": "esp32_out.ld" }, "core": "esp32", - "extra_flags": "-DARDUINO_ESP32_DEV -DESP32_4M", + "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DESP32_4M", "f_cpu": "80000000L", "f_flash": "40000000L", "flash_mode": "dout", diff --git a/boards/esp32_8M.json b/boards/esp32_8M.json index 616eb16d3..adcd0caaa 100644 --- a/boards/esp32_8M.json +++ b/boards/esp32_8M.json @@ -4,7 +4,7 @@ "ldscript": "esp32_out.ld" }, "core": "esp32", - "extra_flags": "-DARDUINO_ESP32_DEV -DESP32_8M", + "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DESP32_8M", "f_cpu": "80000000L", "f_flash": "40000000L", "flash_mode": "dout", From e2e90cc18a939894142a3ccc7cec0d89acb6937c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 26 Aug 2021 16:36:04 +0200 Subject: [PATCH 08/31] Add commands ``SwitchMode 17`` and ``SwitchMode 18`` Add commands ``SwitchMode 17`` PushHoldMultiDelay and ``SwitchMode 18`` PushHoldMultiDelayInverted adding delayed single press event (#12973) --- CHANGELOG.md | 3 ++- RELEASENOTES.md | 1 + tasmota/support_switch.ino | 38 ++++++++++++++++++++++++++++---------- tasmota/tasmota.h | 3 ++- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 336c85abe..b41715cea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``Subscribe2 ...`` to subscribe to a MQTT topic without appended "/#" (#12858) - Support for Hydreon RG-15 Solid State Rain sensor (#12974) - Support for IKEA VINDRIKTNING particle concentration sensor (#12976) +- Commands ``SwitchMode 17`` PushHoldMultiDelay and ``SwitchMode 18`` PushHoldMultiDelayInverted adding delayed single press event (#12973) ### Changed - Shelly EM template needs to use GPIO ADE7953_IRQ_2 @@ -1037,7 +1038,7 @@ All notable changes to this project will be documented in this file. ## [8.1.0.6] - 20200205 ### Added - Support for sensors DS18x20 and DHT family on Shelly 1 and Shelly 1PM using Shelly Add-On adapter (#7469) -- Commands ``SwitchMode 11`` PushHoldMulti and ``SwitchMode 12`` PushHoldInverted (#7603) +- Commands ``SwitchMode 11`` PushHoldMulti and ``SwitchMode 12`` PushHoldMultiInverted (#7603) - Command ``Buzzer -1`` for infinite mode and command ``Buzzer -2`` for following led mode (#7623) - Support for MI-BLE sensors using HM-10 Bluetooth 4.0 module by Christian Staars (#7683) - BootCount Reset Time as BCResetTime to ``Status 1`` diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f87825dd6..19bace10e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -104,6 +104,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``SetOption127 1`` to force Wi-Fi in no-sleep mode even if ``Sleep 0`` is not enabled - Command ``SetOption128 0|1`` web referer check disabling HTTP API commands if set to 0. Default set to 1 for backward compatibility [#12828](https://github.com/arendst/Tasmota/issues/12828) - Command ``SetSensor1..127 0|1`` to globally disable individual sensor driver +- Commands ``SwitchMode 17`` PushHoldMultiDelay and ``SwitchMode 18`` PushHoldMultiDelayInverted adding delayed single press event [#12973](https://github.com/arendst/Tasmota/issues/12973) - Neopool commands ``NPPHRes``, ``NPCLRes`` and ``NPIonRes`` [#12813](https://github.com/arendst/Tasmota/issues/12813) - Support for second DNS server - Support for (Yeelight) Mi Desk Pro using binary tasmota32solo1.bin diff --git a/tasmota/support_switch.ino b/tasmota/support_switch.ino index 68400e5a9..4b1688c72 100644 --- a/tasmota/support_switch.ino +++ b/tasmota/support_switch.ino @@ -237,17 +237,32 @@ void SwitchHandler(uint32_t mode) { uint32_t mqtt_action = POWER_NONE; uint32_t switchmode = Settings->switchmode[i]; - if (Switch.hold_timer[i] & (((switchmode == PUSHHOLDMULTI) | (switchmode == PUSHHOLDMULTI_INV)) ? SM_TIMER_MASK: SM_NO_TIMER_MASK)) { + bool push_hold_multi_delay = ((PUSHHOLDMULTIDELAY == switchmode) || (PUSHHOLDMULTIDELAY_INV == switchmode)); + if (push_hold_multi_delay) { + switchmode -= (PUSHHOLDMULTIDELAY - PUSHHOLDMULTI); + } + bool push_hold_multi = ((PUSHHOLDMULTI == switchmode) || (PUSHHOLDMULTI_INV == switchmode)); + + if (Switch.hold_timer[i] & ((push_hold_multi) ? SM_TIMER_MASK : SM_NO_TIMER_MASK)) { Switch.hold_timer[i]--; if ((Switch.hold_timer[i] & SM_TIMER_MASK) == loops_per_second * Settings->param[P_HOLD_TIME] / 25) { - if ((switchmode == PUSHHOLDMULTI) & (NOT_PRESSED == Switch.last_state[i])) { - SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT + bool do_sendkey = false; + switch (switchmode) { + case PUSHHOLDMULTI: + do_sendkey = (NOT_PRESSED == Switch.last_state[i]); + break; + case PUSHHOLDMULTI_INV: + do_sendkey = (PRESSED == Switch.last_state[i]); + break; } - if ((switchmode == PUSHHOLDMULTI_INV) & (PRESSED == Switch.last_state[i])) { + if (do_sendkey) { SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT + } else if (push_hold_multi_delay && ((Switch.hold_timer[i] & ~SM_TIMER_MASK) == SM_FIRST_PRESS)) { + switchflag = POWER_TOGGLE; // Toggle with pushbutton + Switch.hold_timer[i] = 0; } } - if (0 == (Switch.hold_timer[i] & (((switchmode == PUSHHOLDMULTI) | (switchmode == PUSHHOLDMULTI_INV)) ? SM_TIMER_MASK: SM_NO_TIMER_MASK))) { + if (0 == (Switch.hold_timer[i] & ((push_hold_multi) ? SM_TIMER_MASK: SM_NO_TIMER_MASK))) { switch (switchmode) { case TOGGLEMULTI: switchflag = POWER_TOGGLE; // Toggle after hold @@ -274,7 +289,6 @@ void SwitchHandler(uint32_t mode) { Switch.hold_timer[i] = loops_per_second * Settings->param[P_HOLD_TIME] / 25; SendKey(KEY_SWITCH, i +1, POWER_INCREMENT); // Execute command via MQTT mqtt_action = POWER_INCREMENT; - } else { Switch.hold_timer[i]= 0; SendKey(KEY_SWITCH, i +1, POWER_CLEAR); // Execute command via MQTT @@ -349,9 +363,11 @@ void SwitchHandler(uint32_t mode) { } } else { if ((Switch.hold_timer[i] & SM_TIMER_MASK) > loops_per_second * Settings->param[P_HOLD_TIME] / 25) { - if((Switch.hold_timer[i] & ~SM_TIMER_MASK) != SM_SECOND_PRESS) { + if ((Switch.hold_timer[i] & ~SM_TIMER_MASK) != SM_SECOND_PRESS) { Switch.hold_timer[i]= SM_FIRST_PRESS; - switchflag = POWER_TOGGLE; // Toggle with pushbutton + if (!push_hold_multi_delay) { + switchflag = POWER_TOGGLE; // Toggle with pushbutton + } } else{ SendKey(KEY_SWITCH, i +1, POWER_100); // Execute command via MQTT @@ -375,9 +391,11 @@ void SwitchHandler(uint32_t mode) { } } else { if ((Switch.hold_timer[i] & SM_TIMER_MASK)> loops_per_second * Settings->param[P_HOLD_TIME] / 25) { - if((Switch.hold_timer[i] & ~SM_TIMER_MASK) != SM_SECOND_PRESS) { + if ((Switch.hold_timer[i] & ~SM_TIMER_MASK) != SM_SECOND_PRESS) { Switch.hold_timer[i]= SM_FIRST_PRESS; - switchflag = POWER_TOGGLE; // Toggle with pushbutton + if (!push_hold_multi_delay) { + switchflag = POWER_TOGGLE; // Toggle with pushbutton + } } else{ SendKey(KEY_SWITCH, i +1, POWER_100); // Execute command via MQTT diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 5a475cc9d..19f485329 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -280,7 +280,8 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D enum WifiConfigOptions {WIFI_RESTART, EX_WIFI_SMARTCONFIG, WIFI_MANAGER, EX_WIFI_WPSCONFIG, WIFI_RETRY, WIFI_WAIT, WIFI_SERIAL, WIFI_MANAGER_RESET_ONLY, MAX_WIFI_OPTION}; enum SwitchModeOptions {TOGGLE, FOLLOW, FOLLOW_INV, PUSHBUTTON, PUSHBUTTON_INV, PUSHBUTTONHOLD, PUSHBUTTONHOLD_INV, PUSHBUTTON_TOGGLE, TOGGLEMULTI, - FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, PUSHON, PUSHON_INV, PUSH_IGNORE, MAX_SWITCH_OPTION}; + FOLLOWMULTI, FOLLOWMULTI_INV, PUSHHOLDMULTI, PUSHHOLDMULTI_INV, PUSHON, PUSHON_INV, PUSH_IGNORE, PUSHNOTUSED, PUSHHOLDMULTIDELAY, + PUSHHOLDMULTIDELAY_INV, MAX_SWITCH_OPTION}; enum LedStateOptions {LED_OFF, LED_POWER, LED_MQTTSUB, LED_POWER_MQTTSUB, LED_MQTTPUB, LED_POWER_MQTTPUB, LED_MQTT, LED_POWER_MQTT, MAX_LED_OPTION}; From 9be8f4fc7a6f7fa87200491389825e818156ed71 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 Aug 2021 18:52:08 +0200 Subject: [PATCH 09/31] Berry fix bug in conditional --- lib/libesp32/Berry/src/be_debug.c | 2 +- lib/libesp32/Berry/src/be_parser.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/libesp32/Berry/src/be_debug.c b/lib/libesp32/Berry/src/be_debug.c index 33db01d36..4c6be85a8 100644 --- a/lib/libesp32/Berry/src/be_debug.c +++ b/lib/libesp32/Berry/src/be_debug.c @@ -111,7 +111,7 @@ void be_print_inst(binstruction ins, int pc) logbuf("%s\tK%d", opc2str(op), IGET_Bx(ins)); break; case OP_CLOSE: case OP_LDNIL: - logbuf("%s\t%d", opc2str(op), IGET_RA(ins)); + logbuf("%s\tR%d", opc2str(op), IGET_RA(ins)); break; case OP_RAISE: logbuf("%s\t%d\t%c%d\t%c%d", opc2str(op), IGET_RA(ins), diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index b04b24383..805a85021 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -97,7 +97,7 @@ static void match_notoken(bparser *parser, btokentype type) } } -/* check that if the expdesc is a symbol, it is avalid one or raise an exception */ +/* check that if the expdesc is a symbol, it is a valid one or raise an exception */ static void check_symbol(bparser *parser, bexpdesc *e) { if (e->type == ETVOID && e->v.s == NULL) { /* error when token is not a symbol */ @@ -106,7 +106,7 @@ static void check_symbol(bparser *parser, bexpdesc *e) } } -/* check that the value in `e` is valid for a variable, i.e. conatins a value or a valid symbol */ +/* check that the value in `e` is valid for a variable, i.e. contains a value or a valid symbol */ static void check_var(bparser *parser, bexpdesc *e) { check_symbol(parser, e); /* check the token is a symbol */ @@ -989,6 +989,7 @@ static void cond_expr(bparser *parser, bexpdesc *e) if (next_type(parser) == OptQuestion) { int jf, jl = NO_JUMP; /* jump list */ bfuncinfo *finfo = parser->finfo; + check_var(parser, e); /* check if valid */ scan_next_token(parser); /* skip '?' */ be_code_jumpbool(finfo, e, bfalse); /* go if true */ jf = e->f; From 538734579496e7bd5edb365e44106c2fe7de9c40 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 Aug 2021 19:30:57 +0200 Subject: [PATCH 10/31] Berry improved `super()` for inheritance --- lib/libesp32/Berry/src/be_baselib.c | 108 +++++++++++++++--- lib/libesp32/Berry/src/be_class.c | 44 +++++--- lib/libesp32/Berry/tests/super_auto.be | 132 ++++++++++++++++++++++ lib/libesp32/Berry/tests/super_leveled.be | 7 +- 4 files changed, 253 insertions(+), 38 deletions(-) create mode 100644 lib/libesp32/Berry/tests/super_auto.be diff --git a/lib/libesp32/Berry/src/be_baselib.c b/lib/libesp32/Berry/src/be_baselib.c index d5d3e56f1..27a650827 100644 --- a/lib/libesp32/Berry/src/be_baselib.c +++ b/lib/libesp32/Berry/src/be_baselib.c @@ -11,6 +11,9 @@ #include "be_mem.h" #include "be_gc.h" #include "be_class.h" +#include "be_vector.h" +#include "be_string.h" +#include "be_map.h" #include #define READLINE_STEP 100 @@ -73,36 +76,105 @@ static int l_input(bvm *vm) return m_readline(vm); } +/* Look in the current class and all super classes for a method corresponding to a specific closure pointer */ +static bclass *find_class_closure(bclass *cl, bclosure *needle) +{ + while (cl) { + bmapnode *node; /* iterate on members of the class */ + bmap *members = be_class_members(cl); + if (members) { /* only iterate if there are members */ + bmapiter iter = be_map_iter(); + while ((node = be_map_next(members, &iter)) != NULL) { + if (var_type(&node->value) == BE_CLOSURE) { /* only native functions are considered */ + bclosure *clos_iter = var_toobj(&node->value); /* retrieve the method's closure */ + if (clos_iter == needle) { + /* we found the closure, we now know its class */ + return cl; + } + } + } + } + cl = be_class_super(cl); /* move to super class */ + } + return NULL; /* not found */ +} + static int l_super(bvm *vm) { int argc = be_top(vm); - if (argc) { + + /* if no argument, or arg 1 is nil, return nil */ + if (argc == 0 || be_isnil(vm, 1)) { + be_return_nil(vm); + } + + /* if arg 1 is a class, simply return super */ + if (be_isclass(vm, 1)) { + be_getsuper(vm, 1); + be_return(vm); + } + + /* arg 1 is an instance */ + if (be_isinstance(vm, 1)) { + binstance *o = var_toobj(be_indexof(vm, 1)); + bclass *target_class = NULL; /* the minimal class expected, or any super class */ + bclass *base_class = NULL; /* current class of the caller, if any */ + + /* if arg 2 is present, it must be a class */ if (argc >= 2) { - if (be_isinstance(vm, 1) && be_isclass(vm, 2)) { - /* leveled super, i.e. fix the parenthood class level */ - binstance *o = var_toobj(be_indexof(vm, 1)); - bclass *bc = var_toobj(be_indexof(vm, 2)); - while (o) { - bclass *c = be_instance_class(o); - if (c == bc) break; /* found */ - o = be_instance_super(o); - } - bvalue *top = be_incrtop(vm); - if (o) { - var_setinstance(top, o); /* return the instance with the specified parent class */ - } else { - var_setnil(top); /* not found, return nil */ - } - be_return(vm); + if (be_isclass(vm, 2)) { + target_class = var_toobj(be_indexof(vm, 2)); + } else if (be_isnil(vm, 2)) { + // ignore, revert to standard super() behavior if second arg is explicit nil } else { be_raise(vm, "type_error", "leveled super() requires 'instance' and 'class' arguments"); } + } + + /* now the more complex part, if arg 1 is an instance */ + /* if instance is the sole argument, try to find if it comes from a method of a class and set 'base_class' accordinly */ + /* later it will be equivalent to passing this class as second argument */ + if (argc == 1) { + /* we look in the callstack for the caller's closure */ + int size = be_stack_count(&vm->callstack); + if (size >= 2) { /* need at least 2 stackframes: current (for super() native) and caller (the one we are interested in) */ + bcallframe *caller = be_vector_at(&vm->callstack, size - 2); /* get the callframe of caller */ + bvalue *func = caller->func; /* function object of caller */ + if (var_type(func) == BE_CLOSURE) { /* only useful if the caller is a Berry closure (i.e. not native) */ + bclosure *clos_ctx = var_toobj(func); /* this is the closure we look for in the class chain */ + base_class = find_class_closure(o->_class, clos_ctx); /* iterate on current and super classes to find where the closure belongs */ + } + } + } + + if (base_class || target_class) { + if (base_class) { + target_class = base_class->super; + if (!target_class) be_return_nil(vm); /* fast exit if top class */ + } + /* leveled super, i.e. fix the parenthood class level */ + if (o) { + o = be_instance_super(o); /* always skip the current class and move to super */ + } + while (o) { + bclass *c = be_instance_class(o); + if (c == target_class) break; /* found */ + o = be_instance_super(o); + } + bvalue *top = be_incrtop(vm); + if (o) { + var_setinstance(top, o); /* return the instance with the specified parent class */ + } else { + var_setnil(top); /* not found, return nil */ + } + be_return(vm); } else { - /* simple use of super */ be_getsuper(vm, 1); be_return(vm); } } + + /* fall through, return nil if we don't know what to do */ be_return_nil(vm); } diff --git a/lib/libesp32/Berry/src/be_class.c b/lib/libesp32/Berry/src/be_class.c index b8e3ea2fb..5441b372b 100644 --- a/lib/libesp32/Berry/src/be_class.c +++ b/lib/libesp32/Berry/src/be_class.c @@ -14,6 +14,7 @@ #include "be_vm.h" #include "be_func.h" #include "be_var.h" +#include #define check_members(vm, c) \ if (!(c)->members) { \ @@ -237,6 +238,11 @@ bbool be_class_newobj(bvm *vm, bclass *c, bvalue *reg, int argc, int mode) return bfalse; } +/* Default empty constructor */ +static int default_init_native_method(bvm *vm) { + be_return_nil(vm); +} + /* Find instance member by name and copy value to `dst` */ /* Input: none of `obj`, `name` and `dst` may not be NULL */ /* Returns the type of the member or BE_NONE if member not found */ @@ -253,22 +259,28 @@ int be_instance_member(bvm *vm, binstance *instance, bstring *name, bvalue *dst) if (obj) { return type; } else { /* if no method found, try virtual */ - /* get method 'member' */ - obj = instance_member(vm, instance, str_literal(vm, "member"), vm->top); - if (obj && basetype(var_type(vm->top)) == BE_FUNCTION) { - bvalue *top = vm->top; - var_setinstance(&top[1], instance); - var_setstr(&top[2], name); - vm->top += 3; /* prevent gc collection results */ - be_dofunc(vm, top, 2); /* call method 'member' */ - vm->top -= 3; - *dst = *vm->top; /* copy result to R(A) */ - if (obj && var_type(dst) == MT_VARIABLE) { - *dst = obj->members[dst->v.i]; - } - type = var_type(dst); - if (type != BE_NIL) { - return type; + /* if 'init' does not exist, create a virtual empty constructor */ + if (strcmp(str(name), "init") == 0) { + var_setntvfunc(dst, default_init_native_method); + return var_type(dst); + } else { + /* get method 'member' */ + obj = instance_member(vm, instance, str_literal(vm, "member"), vm->top); + if (obj && basetype(var_type(vm->top)) == BE_FUNCTION) { + bvalue *top = vm->top; + var_setinstance(&top[1], instance); + var_setstr(&top[2], name); + vm->top += 3; /* prevent gc collection results */ + be_dofunc(vm, top, 2); /* call method 'member' */ + vm->top -= 3; + *dst = *vm->top; /* copy result to R(A) */ + if (obj && var_type(dst) == MT_VARIABLE) { + *dst = obj->members[dst->v.i]; + } + type = var_type(dst); + if (type != BE_NIL) { + return type; + } } } } diff --git a/lib/libesp32/Berry/tests/super_auto.be b/lib/libesp32/Berry/tests/super_auto.be new file mode 100644 index 000000000..8d7ede85f --- /dev/null +++ b/lib/libesp32/Berry/tests/super_auto.be @@ -0,0 +1,132 @@ +#- test for new auto class inference of super() -# + +#- test that we can call init() even if it's not defined -# +class Z end +z=Z() +assert(z.init != nil) +z.init() #- should do nothing -# + +#- check the old way still works -# +class A1 + var a + def init(a) + self.a = a + end +end +class B1:A1 + var b + def init(a,b) + super(self,A1).init(a) + self.b = b + end +end +class C1:B1 + var c + def init(a,b,c) + super(self,B1).init(a,b) + self.c = c + end +end +#- -# +c1=C1(1,2,3) +assert(c1.a == 1) +assert(c1.b == 2) +assert(c1.c == 3) + +#- test simple behavior -# +class A0 var a end +class B0:A0 var b end +class C0:B0 end +c0=C0() +assert(classof(c0) == C0) +assert(classof(super(c0)) == B0) +assert(classof(super(super(c0))) == A0) +assert(super(super(super(c0))) == nil) + +assert(super(C0) == B0) +assert(super(super(C0)) == A0) +assert(super(super(super(C0))) == nil) + +assert(classof(super(c0,B0)) == B0) +assert(classof(super(c0,A0)) == A0) + +#- test auto inference of target superclass -# +class A + var a + def init(a) + self.a = a + end +end +class B:A + var b + def init(a,b) + super(self).init(a) + self.b = b + end +end +class C:B + var c + def init(a,b,c) + super(self).init(a,b) + self.c = c + end +end +#- -# +c=C(1,2,3) + +assert(c.a == 1) +assert(c.b == 2) +assert(c.c == 3)class A +end +class B:A + var b + def init(a,b) super(self).init(a) self.b = b end +end +class C:B + var c + def init(a,b,c) super(self).init(a,b) self.c = c end +end +c=C(1,2,3) + +#- variant if A2 does not have an init() method, still works -# +class A2 + static a=1 +end +class B2:A2 + var b + def init(a,b) super(self).init(a) self.b = b end +end +class C2:B2 + var c + def init(a,b,c) super(self).init(a,b) self.c = c end +end +#- -# +c2=C2(1,2,3) +assert(c2.a == 1) +assert(c2.b == 2) +assert(c2.c == 3) + +#- difference in behavior whether the second arg is provided or not -# +class A3 +end +class B3:A3 + def b1() + return super(self) + end + def b2(c) + return super(self, c) + end +end +class C3:B3 +end +#- -# +b3=B3() +c3=C3() +assert(classof(c3.b1()) == A3) +assert(classof(b3.b1()) == A3) +assert(classof(c3.b2(B3)) == B3) +assert(classof(c3.b2(A3)) == A3) + +assert(classof(c3.b2(nil)) == B3) #- testing super(self,nil) in B3::b2() -# + +assert(c3.b2(C3) == nil) #- if specifying the current class, can't find any relevant class in supers -# \ No newline at end of file diff --git a/lib/libesp32/Berry/tests/super_leveled.be b/lib/libesp32/Berry/tests/super_leveled.be index 09b7a115b..e88914941 100644 --- a/lib/libesp32/Berry/tests/super_leveled.be +++ b/lib/libesp32/Berry/tests/super_leveled.be @@ -26,10 +26,9 @@ assert(classname(super(super(C))) == 'A') assert(super(super(super(C))) == nil) #- super() levele -# -assert(super(a,A) == a) -assert(classname(super(a,A)) == 'A') -assert(classname(super(b,B)) == 'B') -assert(classname(super(c,C)) == 'C') +assert(super(a,A) == nil) +assert(super(b,B) == nil) +assert(super(c,C) == nil) assert(classname(super(c,B)) == 'B') assert(classname(super(c,A)) == 'A') assert(super(c,map) == nil) #- not a parent class -# From 4541438e70934fab005fb96d8297615c46be5606 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 Aug 2021 19:57:03 +0200 Subject: [PATCH 11/31] Berry take into account `bytes()` in gc size --- .../Berry/generate/be_fixed_be_class_bytes.h | 49 +++++++-------- lib/libesp32/Berry/src/be_byteslib.c | 60 +++++++++++-------- lib/libesp32/Berry/src/be_gc.c | 5 +- 3 files changed, 65 insertions(+), 49 deletions(-) diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h index 58ccee454..76f24a936 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h @@ -1,36 +1,37 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_bytes_map) { - { be_const_key(dot_p, -1), be_const_var(0) }, - { be_const_key(seti, 6), be_const_func(m_set) }, - { be_const_key(get, 7), be_const_func(m_getu) }, - { be_const_key(size, 10), be_const_func(m_size) }, - { be_const_key(resize, 1), be_const_func(m_resize) }, - { be_const_key(opt_add, 22), be_const_func(m_merge) }, - { be_const_key(getbits, -1), be_const_closure(getbits_closure) }, - { be_const_key(geti, 16), be_const_func(m_geti) }, - { be_const_key(setitem, -1), be_const_func(m_setitem) }, - { be_const_key(add, -1), be_const_func(m_add) }, - { be_const_key(fromb64, -1), be_const_func(m_fromb64) }, - { be_const_key(opt_neq, -1), be_const_func(m_nequal) }, - { be_const_key(set, -1), be_const_func(m_set) }, - { be_const_key(asstring, -1), be_const_func(m_asstring) }, - { be_const_key(copy, 3), be_const_func(m_copy) }, - { be_const_key(opt_eq, 2), be_const_func(m_equal) }, - { be_const_key(tob64, -1), be_const_func(m_tob64) }, - { be_const_key(setbits, 12), be_const_closure(setbits_closure) }, - { be_const_key(_buffer, -1), be_const_func(m_buffer) }, - { be_const_key(fromstring, 0), be_const_func(m_fromstring) }, - { be_const_key(tostring, 9), be_const_func(m_tostring) }, - { be_const_key(item, 8), be_const_func(m_item) }, - { be_const_key(init, 23), be_const_func(m_init) }, + { be_const_key(deinit, -1), be_const_func(m_deinit) }, { be_const_key(opt_connect, -1), be_const_func(m_connect) }, + { be_const_key(item, 3), be_const_func(m_item) }, + { be_const_key(seti, 22), be_const_func(m_set) }, + { be_const_key(asstring, -1), be_const_func(m_asstring) }, + { be_const_key(getbits, -1), be_const_closure(getbits_closure) }, + { be_const_key(copy, -1), be_const_func(m_copy) }, + { be_const_key(get, -1), be_const_func(m_getu) }, + { be_const_key(_buffer, -1), be_const_func(m_buffer) }, + { be_const_key(fromb64, -1), be_const_func(m_fromb64) }, + { be_const_key(add, -1), be_const_func(m_add) }, + { be_const_key(dot_p, -1), be_const_var(0) }, + { be_const_key(size, 0), be_const_func(m_size) }, + { be_const_key(tostring, -1), be_const_func(m_tostring) }, + { be_const_key(opt_add, 10), be_const_func(m_merge) }, + { be_const_key(resize, -1), be_const_func(m_resize) }, + { be_const_key(setitem, -1), be_const_func(m_setitem) }, + { be_const_key(set, -1), be_const_func(m_set) }, + { be_const_key(geti, -1), be_const_func(m_geti) }, + { be_const_key(init, -1), be_const_func(m_init) }, { be_const_key(clear, -1), be_const_func(m_clear) }, + { be_const_key(opt_neq, 23), be_const_func(m_nequal) }, + { be_const_key(tob64, 24), be_const_func(m_tob64) }, + { be_const_key(opt_eq, -1), be_const_func(m_equal) }, + { be_const_key(fromstring, -1), be_const_func(m_fromstring) }, + { be_const_key(setbits, -1), be_const_closure(setbits_closure) }, }; static be_define_const_map( be_class_bytes_map, - 25 + 26 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/libesp32/Berry/src/be_byteslib.c b/lib/libesp32/Berry/src/be_byteslib.c index 5211a0a4c..e63f1932f 100644 --- a/lib/libesp32/Berry/src/be_byteslib.c +++ b/lib/libesp32/Berry/src/be_byteslib.c @@ -419,26 +419,17 @@ static void buf_add_hex(buf_impl* buf, const char *hex, size_t len) /******************************************************************** ** Wrapping into lib ********************************************************************/ -// typedef int (*bntvfunc)(bvm*); /* native function pointer */ -int free_bytes_buf(bvm* vm) -{ - int argc = be_top(vm); - if (argc > 0) { - buf_impl * buf = (buf_impl*) be_tocomptr(vm, 1); - if (buf != NULL) { - be_os_free(buf); - } - } - be_return_nil(vm); -} -buf_impl * bytes_alloc(int32_t size) +buf_impl * bytes_realloc(bvm *vm, buf_impl *oldbuf, int32_t size) { if (size < 4) { size = 4; } if (size > BYTES_MAX_SIZE) { size = BYTES_MAX_SIZE; } - buf_impl * next = (buf_impl*) be_os_malloc(size + BYTES_OVERHEAD); + size_t oldsize = oldbuf ? oldbuf->size + BYTES_OVERHEAD : 0; + buf_impl * next = (buf_impl*) be_realloc(vm, oldbuf, oldsize, size + BYTES_OVERHEAD); /* malloc */ next->size = size; - next->len = 0; + if (!oldbuf) { + next->len = 0; /* allocate a new buffer */ + } return next; } @@ -467,10 +458,10 @@ static int m_init(bvm *vm) } else if (argc > 1 && be_isstring(vm, 2)) { hex_in = be_tostring(vm, 2); if (hex_in) { - size = strlen(hex_in) / 2 + BYTES_HEADROOM; // allocate headroom + size = strlen(hex_in) / 2 + BYTES_HEADROOM; /* allocate headroom */ } } - buf_impl * buf = bytes_alloc(size); + buf_impl * buf = bytes_realloc(vm, NULL, size); /* allocate new buffer */ if (!buf) { be_throw(vm, BE_MALLOC_FAIL); } @@ -478,22 +469,35 @@ static int m_init(bvm *vm) if (hex_in) { buf_add_hex(buf, hex_in, strlen(hex_in)); } - be_newcomobj(vm, buf, &free_bytes_buf); + be_pushcomptr(vm, buf); be_setmember(vm, 1, ".p"); be_return_nil(vm); } +/* deallocate buffer */ +static int m_deinit(bvm *vm) { +{ + be_getmember(vm, 1, ".p"); + buf_impl * buf = be_tocomptr(vm, -1); + be_pop(vm, 1); + if (buf != NULL) { + be_realloc(vm, buf, buf->size + BYTES_OVERHEAD, 0); + } + be_pushcomptr(vm, NULL); /* push NULL pointer instead, just in case */ + be_setmember(vm, 1, ".p"); + be_return_nil(vm); +} +} + /* grow or shrink to the exact value */ /* stack item 1 must contain the instance */ static buf_impl * _bytes_resize(bvm *vm, buf_impl * buf, size_t new_size) { - buf_impl * new_buf = bytes_alloc(new_size); + buf_impl *new_buf = bytes_realloc(vm, buf, new_size); if (!new_buf) { be_throw(vm, BE_MALLOC_FAIL); } - memmove(buf_get_buf(new_buf), buf_get_buf(buf), buf->len); - new_buf->len = buf->len; - /* replace the .p attribute */ - be_newcomobj(vm, new_buf, &free_bytes_buf); + /* replace the .p attribute since address may have changed */ + be_pushcomptr(vm, new_buf); be_setmember(vm, 1, ".p"); be_pop(vm, 1); /* remove comobj from stack */ /* the old buffer will be garbage collected later */ @@ -504,7 +508,13 @@ static buf_impl * _bytes_resize(bvm *vm, buf_impl * buf, size_t new_size) { /* if grow, then add some headroom */ /* stack item 1 must contain the instance */ static buf_impl * bytes_resize(bvm *vm, buf_impl * buf, size_t new_size) { - if (buf->size >= new_size) { return buf; } /* no resize needed */ + /* when resized to smaller, we introduce a new heurstic */ + /* If the buffer is 64 bytes or smaller, don't shrink */ + /* Shrink buffer only if target size is smaller than half the original size */ + if (buf->size >= new_size) { /* enough room, consider if need to shrink */ + if (buf->size <= 64) { return buf; } /* don't shrink if below 64 bytes */ + if (buf->size < new_size * 2) { return buf; } + } return _bytes_resize(vm, buf, new_size + BYTES_HEADROOM); } @@ -1226,6 +1236,7 @@ void be_load_byteslib(bvm *vm) { ".p", NULL }, { "_buffer", m_buffer }, { "init", m_init }, + { "deinit", m_deinit }, { "tostring", m_tostring }, { "asstring", m_asstring }, { "fromstring", m_fromstring }, @@ -1261,6 +1272,7 @@ class be_class_bytes (scope: global, name: bytes) { .p, var _buffer, func(m_buffer) init, func(m_init) + deinit, func(m_deinit) tostring, func(m_tostring) asstring, func(m_asstring) fromstring, func(m_fromstring) diff --git a/lib/libesp32/Berry/src/be_gc.c b/lib/libesp32/Berry/src/be_gc.c index 8e6ac005e..dc5e2d09c 100644 --- a/lib/libesp32/Berry/src/be_gc.c +++ b/lib/libesp32/Berry/src/be_gc.c @@ -461,7 +461,10 @@ static void destruct_object(bvm *vm, bgcobject *obj) type = be_instance_member(vm, ins, str_literal(vm, "deinit"), vm->top); be_incrtop(vm); if (basetype(type) == BE_FUNCTION) { - be_dofunc(vm, vm->top - 1, 1); + var_setinstance(vm->top, ins); /* push instance on stack as arg 1 */ + be_incrtop(vm); + be_dofunc(vm, vm->top - 2, 1); /* warning, there shoudln't be any exception raised here, or the gc stops */ + be_stackpop(vm, 1); } be_stackpop(vm, 1); } From 55883242748015ffa88479750deec608c4b4f2b2 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 Aug 2021 21:51:19 +0200 Subject: [PATCH 12/31] Berry fix deinit --- lib/libesp32/Berry/src/be_class.c | 14 ++++++++++++++ lib/libesp32/Berry/src/be_class.h | 1 + lib/libesp32/Berry/src/be_gc.c | 2 +- lib/libesp32/Berry/src/be_vm.c | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/Berry/src/be_class.c b/lib/libesp32/Berry/src/be_class.c index 5441b372b..74348fc3f 100644 --- a/lib/libesp32/Berry/src/be_class.c +++ b/lib/libesp32/Berry/src/be_class.c @@ -243,6 +243,20 @@ static int default_init_native_method(bvm *vm) { be_return_nil(vm); } +/* Find instance member by name and copy value to `dst` */ +/* Do not look into virtual members */ +int be_instance_member_simple(bvm *vm, binstance *instance, bstring *name, bvalue *dst) +{ + int type; + be_assert(name != NULL); + binstance * obj = instance_member(vm, instance, name, dst); + type = var_type(dst); + if (obj && type == MT_VARIABLE) { + *dst = obj->members[dst->v.i]; + } + return type; +} + /* Find instance member by name and copy value to `dst` */ /* Input: none of `obj`, `name` and `dst` may not be NULL */ /* Returns the type of the member or BE_NONE if member not found */ diff --git a/lib/libesp32/Berry/src/be_class.h b/lib/libesp32/Berry/src/be_class.h index 3186afd66..6a114f53b 100644 --- a/lib/libesp32/Berry/src/be_class.h +++ b/lib/libesp32/Berry/src/be_class.h @@ -59,6 +59,7 @@ void be_closure_method_bind(bvm *vm, bclass *c, bstring *name, bclosure *cl); int be_class_closure_count(bclass *c); void be_class_upvalue_init(bvm *vm, bclass *c); bbool be_class_newobj(bvm *vm, bclass *c, bvalue *argv, int argc, int mode); +int be_instance_member_simple(bvm *vm, binstance *obj, bstring *name, bvalue *dst); int be_instance_member(bvm *vm, binstance *obj, bstring *name, bvalue *dst); int be_class_member(bvm *vm, bclass *obj, bstring *name, bvalue *dst); bbool be_instance_setmember(bvm *vm, binstance *obj, bstring *name, bvalue *src); diff --git a/lib/libesp32/Berry/src/be_gc.c b/lib/libesp32/Berry/src/be_gc.c index dc5e2d09c..0475de7b3 100644 --- a/lib/libesp32/Berry/src/be_gc.c +++ b/lib/libesp32/Berry/src/be_gc.c @@ -458,7 +458,7 @@ static void destruct_object(bvm *vm, bgcobject *obj) int type; binstance *ins = cast_instance(obj); /* does not GC when creating the string "deinit". */ - type = be_instance_member(vm, ins, str_literal(vm, "deinit"), vm->top); + type = be_instance_member_simple(vm, ins, str_literal(vm, "deinit"), vm->top); be_incrtop(vm); if (basetype(type) == BE_FUNCTION) { var_setinstance(vm->top, ins); /* push instance on stack as arg 1 */ diff --git a/lib/libesp32/Berry/src/be_vm.c b/lib/libesp32/Berry/src/be_vm.c index 49e20517f..70857ef72 100644 --- a/lib/libesp32/Berry/src/be_vm.c +++ b/lib/libesp32/Berry/src/be_vm.c @@ -267,7 +267,7 @@ bbool be_value2bool(bvm *vm, bvalue *v) static void obj_method(bvm *vm, bvalue *o, bstring *attr, bvalue *dst) { binstance *obj = var_toobj(o); - int type = be_instance_member(vm, obj, attr, dst); + int type = be_instance_member_simple(vm, obj, attr, dst); if (basetype(type) != BE_FUNCTION) { vm_error(vm, "attribute_error", "the '%s' object has no method '%s'", From df8fb263e03ec46a7d72e4bc6bf3a86274fd8f5f Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 27 Aug 2021 09:10:29 +0200 Subject: [PATCH 13/31] Berry support for indirect members --- lib/libesp32/Berry/src/be_parser.c | 7 ++ lib/libesp32/Berry/tests/member_indirect.be | 75 +++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 lib/libesp32/Berry/tests/member_indirect.be diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 805a85021..bb455df68 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -792,6 +792,13 @@ static void member_expr(bparser *parser, bexpdesc *e) init_exp(&key, ETSTRING, 0); key.v.s = str; be_code_member(parser->finfo, e, &key); + } else if (next_type(parser) == OptLBK) { + scan_next_token(parser); /* skip '(' */ + bexpdesc key; + expr(parser, &key); + check_var(parser, &key); + match_token(parser, OptRBK); /* skip ')' */ + be_code_member(parser->finfo, e, &key); } else { push_error(parser, "invalid syntax near '%s'", be_token2str(parser->vm, &next_token(parser))); diff --git a/lib/libesp32/Berry/tests/member_indirect.be b/lib/libesp32/Berry/tests/member_indirect.be new file mode 100644 index 000000000..046521acd --- /dev/null +++ b/lib/libesp32/Berry/tests/member_indirect.be @@ -0,0 +1,75 @@ +#- new syntax for indirect members -# + +#- module accessor -# +s_pi = 'pi' + +import math +assert(math.('pi') == math.pi) +assert(math.(s_pi) == math.pi) + +#- module writer -# +m = module("m") + +m.('aa') = 1 +m.('a' + 'b') = 2 +s_ac = 'ac' +m.(s_ac) = 3 +assert(m.aa == 1) +assert(m.ab == 2) +assert(m.ac == 3) +assert(m.('a'+'a') == 1) + +#- class accessor -# +class A1 + static a = 1, b = 2 + static s = "foo" + def f() return 0 end +end +assert(A1.a == 1) +assert(A1.b == 2) +assert(A1.s == "foo") +assert(type(A1.f) == 'function') + +#- instance accessor -# +class A2 + var a, b + static s_a = 'a' + def init(a,b) + self.(self.('s_a')) = a + self.('b') = b + end + def f(x) + return x+1 + end + def g(a,b) + return A2(a,b) + end +end +a = A2(1,2) + +#- reading members -# +assert(a.a == 1) +assert(a.b == 2) +assert(a.(A2.s_a) == 1) +assert(a.('b') == 2) + +#- writing members -# +a.('a') = 10 +a.('bb'[0]) = 11 +assert(a.a == 10) +assert(a.b == 11) + +#- calling methods -# +assert(a.f(1) == 2) +assert(a.('f')(2) == 3) + +#- mulit-level -# +assert(a.('g')(3,4).('a') == 3) +a.('a') = a.g(3,4) +assert(a.a.b == 4) +assert(a.('a').b == 4) +assert(a.('a').('b') == 4) +assert(a.a.('b') == 4) + +a.('a').('b') += 1 +assert(a.a.b == 5) From e1db23b7c58267f63beaed6d30ddcbb29e31114e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 27 Aug 2021 15:50:17 +0200 Subject: [PATCH 14/31] Add Sonoff L1 MusicSync off when a remote button is received Add Sonoff L1 MusicSync off when a remote button is received (#12930) --- tasmota/xlgt_05_sonoff_l1.ino | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasmota/xlgt_05_sonoff_l1.ino b/tasmota/xlgt_05_sonoff_l1.ino index 299c054f0..b8b246b70 100644 --- a/tasmota/xlgt_05_sonoff_l1.ino +++ b/tasmota/xlgt_05_sonoff_l1.ino @@ -182,6 +182,11 @@ bool SnfL1SerialInput(void) { snprintf_P(cmnd_dimmer, sizeof(cmnd_dimmer), PSTR(D_CMND_DIMMER " %d"), dimmer); } + else if (!strncmp(token2, "\"mode\"", 6)) { + uint8_t received_mode = atoi(token3); + Settings->sbflag1.sonoff_l1_music_sync = (SONOFF_L1_MODE_SYNC_TO_MUSIC == received_mode); + } + token = strtok_r(nullptr, ",", &end_str); } From d9e5fea17c4aaf440bdd0880f9e3893ddc166259 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 Aug 2021 16:04:12 +0200 Subject: [PATCH 15/31] add trigger for Tasmota-specials repo --- .github/workflows/Tasmota_build_development.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index f36fec5a8..256ebfb72 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1351,3 +1351,17 @@ jobs: destination_repo: 'arendst/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' + - name: Creat trigger.txt + run: | + echo ${GITHUB_SHA} &> trigger.txt + echo "$( Date: Fri, 27 Aug 2021 16:26:51 +0200 Subject: [PATCH 16/31] revert trigger different repo --- .github/workflows/Tasmota_build_development.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index 256ebfb72..f36fec5a8 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1351,17 +1351,3 @@ jobs: destination_repo: 'arendst/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' - - name: Creat trigger.txt - run: | - echo ${GITHUB_SHA} &> trigger.txt - echo "$( Date: Fri, 27 Aug 2021 16:39:18 +0200 Subject: [PATCH 17/31] Add Sonoff L1 MusicSync off when a color change is requested Add Sonoff L1 MusicSync off when a color change is requested (#12930) --- tasmota/xlgt_05_sonoff_l1.ino | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tasmota/xlgt_05_sonoff_l1.ino b/tasmota/xlgt_05_sonoff_l1.ino index b8b246b70..6be1205f2 100644 --- a/tasmota/xlgt_05_sonoff_l1.ino +++ b/tasmota/xlgt_05_sonoff_l1.ino @@ -286,6 +286,16 @@ bool SnfL1SetChannels(void) { return true; } +bool SnfL1SetChannelsFromFunc(void) { + static bool first_call = true; + if (first_call) { + first_call = false; // Allow MusicSync at init time + } else { + Settings->sbflag1.sonoff_l1_music_sync = 0; // Disable MusicSync on user color change + } + return SnfL1SetChannels(); +} + bool SnfL1ModuleSelected(void) { if (SONOFF_L1 == TasmotaGlobal.module_type) { if (PinUsed(GPIO_RXD) && PinUsed(GPIO_TXD)) { @@ -345,7 +355,7 @@ bool Xlgt05(uint8_t function) result = SnfL1SerialInput(); break; case FUNC_SET_CHANNELS: - result = SnfL1SetChannels(); + result = SnfL1SetChannelsFromFunc(); break; case FUNC_MODULE_INIT: result = SnfL1ModuleSelected(); From db50783dd3b5c6cc659f22015dcce0215e880695 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 Aug 2021 17:14:33 +0200 Subject: [PATCH 18/31] try trigger #2 --- .github/workflows/Tasmota_build_development.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index f36fec5a8..256ebfb72 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1351,3 +1351,17 @@ jobs: destination_repo: 'arendst/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' + - name: Creat trigger.txt + run: | + echo ${GITHUB_SHA} &> trigger.txt + echo "$( Date: Fri, 27 Aug 2021 19:15:25 +0200 Subject: [PATCH 19/31] Berry fix bytecode load/save for static class members --- lib/libesp32/Berry/src/be_bytecode.c | 59 ++++++++++++++++++---------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/lib/libesp32/Berry/src/be_bytecode.c b/lib/libesp32/Berry/src/be_bytecode.c index 0e0cbf723..521317e63 100644 --- a/lib/libesp32/Berry/src/be_bytecode.c +++ b/lib/libesp32/Berry/src/be_bytecode.c @@ -137,14 +137,21 @@ static bstring** save_members(bvm *vm, void *fp, bclass *c, int nvar) } else { /* save method's name and function */ bproto *proto; bvalue *value = &node->value; - be_assert(var_isclosure(value) || var_isproto(value)); + be_assert(var_isclosure(value) || var_isproto(value) || var_isnil(value)); save_string(fp, var_tostr(&node->key)); /* save method name */ if (var_isproto(value)) { /* the method is a prototype */ proto = var_toobj(value); - } else { /* the method is a closure */ - proto = cast(bclosure *, var_toobj(value))->proto; + save_proto(vm, fp, proto); /* only save prototype */ + } else if (var_isclosure(value)) { /* the method is a closure */ + proto = cast(bclosure *, var_toobj(value))->proto; + save_proto(vm, fp, proto); /* only save prototype */ + } else if (var_isnil(value)) { + /* this is a static member (nil default) */ + save_word(fp, 0); /* store a zero byte that will be seen as a zero length method name which is invalid */ + } else { + be_raise(vm, "internal_error", "unsupported member in class"); + return NULL; /* should never be executed */ } - save_proto(vm, fp, proto); /* only save prototype */ } } return vars; @@ -286,7 +293,7 @@ void be_bytecode_save(bvm *vm, const char *filename, bproto *proto) #endif /* BE_USE_BYTECODE_SAVER */ #if BE_USE_BYTECODE_LOADER -static void load_proto(bvm *vm, void *fp, bproto **proto, int info, int version); +static bbool load_proto(bvm *vm, void *fp, bproto **proto, int info, int version); static uint8_t load_byte(void *fp) { @@ -416,8 +423,13 @@ static void load_class(bvm *vm, void *fp, bvalue *v, int version) value = vm->top; var_setproto(value, NULL); be_incrtop(vm); - load_proto(vm, fp, (bproto**)&var_toobj(value), -3, version); - be_method_bind(vm, c, name, var_toobj(value)); + if (load_proto(vm, fp, (bproto**)&var_toobj(value), -3, version)) { + /* actual method */ + be_method_bind(vm, c, name, var_toobj(value)); + } else { + /* no proto, static member set to nil */ + be_member_bind(vm, c, name, bfalse); + } be_stackpop(vm, 2); /* pop the cached string and proto */ } for (count = 0; count < nvar; ++count) { /* load member-variable table */ @@ -509,21 +521,28 @@ static void load_upvals(bvm *vm, void *fp, bproto *proto) } } -static void load_proto(bvm *vm, void *fp, bproto **proto, int info, int version) +static bbool load_proto(bvm *vm, void *fp, bproto **proto, int info, int version) { - *proto = be_newproto(vm); - (*proto)->name = load_string(vm, fp); - (*proto)->source = load_string(vm, fp); - (*proto)->argc = load_byte(fp); - (*proto)->nstack = load_byte(fp); - if (version > 1) { - (*proto)->varg = load_byte(fp); - load_byte(fp); /* discard reserved byte */ + /* first load the name */ + /* if empty, it's a static member so don't allocate an actual proto */ + bstring *name = load_string(vm, fp); + if (str_len(name)) { + *proto = be_newproto(vm); + (*proto)->name = name; + (*proto)->source = load_string(vm, fp); + (*proto)->argc = load_byte(fp); + (*proto)->nstack = load_byte(fp); + if (version > 1) { + (*proto)->varg = load_byte(fp); + load_byte(fp); /* discard reserved byte */ + } + load_bytecode(vm, fp, *proto, info); + load_constant(vm, fp, *proto, version); + load_proto_table(vm, fp, *proto, version); + load_upvals(vm, fp, *proto); + return btrue; } - load_bytecode(vm, fp, *proto, info); - load_constant(vm, fp, *proto, version); - load_proto_table(vm, fp, *proto, version); - load_upvals(vm, fp, *proto); + return bfalse; /* no proto read */ } void load_global_info(bvm *vm, void *fp) From bf9467d7b5210be261e057994056764c9c437d18 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 Aug 2021 23:23:39 +0200 Subject: [PATCH 20/31] Create copycat_master.yml --- .github/workflows/copycat_master.yml | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/copycat_master.yml diff --git a/.github/workflows/copycat_master.yml b/.github/workflows/copycat_master.yml new file mode 100644 index 000000000..0f8c26ebf --- /dev/null +++ b/.github/workflows/copycat_master.yml @@ -0,0 +1,37 @@ +name: Copy_firmware_master + +on: + push: + +copycat: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: copycat tasmota + uses: andstor/copycat-action@v3 + with: + personal_token: ${{ secrets.API_TOKEN_GITHUB }} + src_path: release-firmware/tasmota/. + src_branch: master + dst_path: firmware/release + dst_owner: tasmota + dst_branch: main + dst_repo_name: install + username: workflow + commit_message: "Update from official release" + copycat32: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: copycat tasmota32 + uses: andstor/copycat-action@v3 + with: + personal_token: ${{ secrets.API_TOKEN_GITHUB }} + src_path: release-firmware/tasmota32/. + src_branch: main + dst_path: firmware/release + dst_owner: tasmota + dst_branch: main + dst_repo_name: install + username: workflow + commit_message: "Update from official release" From 1e3427ad89653b658c721aa6ef773c2f9f75a129 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 Aug 2021 23:27:24 +0200 Subject: [PATCH 21/31] Update copycat_master.yml --- .github/workflows/copycat_master.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/copycat_master.yml b/.github/workflows/copycat_master.yml index 0f8c26ebf..1bdb644dc 100644 --- a/.github/workflows/copycat_master.yml +++ b/.github/workflows/copycat_master.yml @@ -2,8 +2,8 @@ name: Copy_firmware_master on: push: - -copycat: +jobs: + copycat: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -19,6 +19,7 @@ copycat: dst_repo_name: install username: workflow commit_message: "Update from official release" + copycat32: runs-on: ubuntu-latest steps: From 61a85b842d98494e81206dd6c407961d1f7ce9dd Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 Aug 2021 23:29:11 +0200 Subject: [PATCH 22/31] Update copycat_master.yml --- .github/workflows/copycat_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/copycat_master.yml b/.github/workflows/copycat_master.yml index 1bdb644dc..60990c867 100644 --- a/.github/workflows/copycat_master.yml +++ b/.github/workflows/copycat_master.yml @@ -29,7 +29,7 @@ jobs: with: personal_token: ${{ secrets.API_TOKEN_GITHUB }} src_path: release-firmware/tasmota32/. - src_branch: main + src_branch: master dst_path: firmware/release dst_owner: tasmota dst_branch: main From 554a155fd232777c8ad35c04f5998cd6ceb01258 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 Aug 2021 23:31:56 +0200 Subject: [PATCH 23/31] Rename copycat_master.yml to copycat_master.yml.off --- .github/workflows/{copycat_master.yml => copycat_master.yml.off} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{copycat_master.yml => copycat_master.yml.off} (100%) diff --git a/.github/workflows/copycat_master.yml b/.github/workflows/copycat_master.yml.off similarity index 100% rename from .github/workflows/copycat_master.yml rename to .github/workflows/copycat_master.yml.off From d40b055f9ee602e79777c4d9733acb15902664e7 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 28 Aug 2021 12:04:25 +0200 Subject: [PATCH 24/31] Update and rename copycat_master.yml.off to copycat_master.yml --- .../workflows/{copycat_master.yml.off => copycat_master.yml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{copycat_master.yml.off => copycat_master.yml} (92%) diff --git a/.github/workflows/copycat_master.yml.off b/.github/workflows/copycat_master.yml similarity index 92% rename from .github/workflows/copycat_master.yml.off rename to .github/workflows/copycat_master.yml index 60990c867..64c443d16 100644 --- a/.github/workflows/copycat_master.yml.off +++ b/.github/workflows/copycat_master.yml @@ -13,7 +13,7 @@ jobs: personal_token: ${{ secrets.API_TOKEN_GITHUB }} src_path: release-firmware/tasmota/. src_branch: master - dst_path: firmware/release + dst_path: firmware/release/. dst_owner: tasmota dst_branch: main dst_repo_name: install @@ -30,7 +30,7 @@ jobs: personal_token: ${{ secrets.API_TOKEN_GITHUB }} src_path: release-firmware/tasmota32/. src_branch: master - dst_path: firmware/release + dst_path: firmware/release/. dst_owner: tasmota dst_branch: main dst_repo_name: install From 447d544d534e3d84e4275082423a9e5432385b80 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 28 Aug 2021 12:07:53 +0200 Subject: [PATCH 25/31] Update copycat_master.yml --- .github/workflows/copycat_master.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/copycat_master.yml b/.github/workflows/copycat_master.yml index 64c443d16..6dda1ebae 100644 --- a/.github/workflows/copycat_master.yml +++ b/.github/workflows/copycat_master.yml @@ -13,7 +13,7 @@ jobs: personal_token: ${{ secrets.API_TOKEN_GITHUB }} src_path: release-firmware/tasmota/. src_branch: master - dst_path: firmware/release/. + dst_path: ./firmware/release/. dst_owner: tasmota dst_branch: main dst_repo_name: install @@ -30,7 +30,7 @@ jobs: personal_token: ${{ secrets.API_TOKEN_GITHUB }} src_path: release-firmware/tasmota32/. src_branch: master - dst_path: firmware/release/. + dst_path: ./firmware/release/. dst_owner: tasmota dst_branch: main dst_repo_name: install From 6444627997d40987d88303d372d1db843565f75b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 28 Aug 2021 12:10:31 +0200 Subject: [PATCH 26/31] Rename copycat_master.yml to copycat_master.yml.off --- .github/workflows/{copycat_master.yml => copycat_master.yml.off} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{copycat_master.yml => copycat_master.yml.off} (100%) diff --git a/.github/workflows/copycat_master.yml b/.github/workflows/copycat_master.yml.off similarity index 100% rename from .github/workflows/copycat_master.yml rename to .github/workflows/copycat_master.yml.off From f3ede20cbb04607958abcc49c6a539e0559473a1 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 28 Aug 2021 12:15:01 +0200 Subject: [PATCH 27/31] Delete copycat_master.yml.off --- .github/workflows/copycat_master.yml.off | 38 ------------------------ 1 file changed, 38 deletions(-) delete mode 100644 .github/workflows/copycat_master.yml.off diff --git a/.github/workflows/copycat_master.yml.off b/.github/workflows/copycat_master.yml.off deleted file mode 100644 index 6dda1ebae..000000000 --- a/.github/workflows/copycat_master.yml.off +++ /dev/null @@ -1,38 +0,0 @@ -name: Copy_firmware_master - -on: - push: -jobs: - copycat: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: copycat tasmota - uses: andstor/copycat-action@v3 - with: - personal_token: ${{ secrets.API_TOKEN_GITHUB }} - src_path: release-firmware/tasmota/. - src_branch: master - dst_path: ./firmware/release/. - dst_owner: tasmota - dst_branch: main - dst_repo_name: install - username: workflow - commit_message: "Update from official release" - - copycat32: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: copycat tasmota32 - uses: andstor/copycat-action@v3 - with: - personal_token: ${{ secrets.API_TOKEN_GITHUB }} - src_path: release-firmware/tasmota32/. - src_branch: master - dst_path: ./firmware/release/. - dst_owner: tasmota - dst_branch: main - dst_repo_name: install - username: workflow - commit_message: "Update from official release" From 6839a7ef8a55595b98a7a3d3fe9ba8eb6c0ed66c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 28 Aug 2021 13:30:39 +0200 Subject: [PATCH 28/31] reduce checkout time for trigger.txt --- .github/workflows/Tasmota_build_development.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index 256ebfb72..bed9c00a2 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1362,6 +1362,6 @@ jobs: with: source_file: 'trigger.txt' destination_repo: 'Jason2866/Tasmota-specials' - destination_branch: 'special_builder' + destination_branch: 'start_build' user_email: 'github-actions@github.com' user_name: 'github-actions' From e3f39bc1b47f28fe6d5c375e8d0d415a238adde1 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 28 Aug 2021 16:55:26 +0200 Subject: [PATCH 29/31] Update Tasmota_build_development.yml --- .github/workflows/Tasmota_build_development.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/Tasmota_build_development.yml b/.github/workflows/Tasmota_build_development.yml index bed9c00a2..63114faf0 100644 --- a/.github/workflows/Tasmota_build_development.yml +++ b/.github/workflows/Tasmota_build_development.yml @@ -1355,13 +1355,13 @@ jobs: run: | echo ${GITHUB_SHA} &> trigger.txt echo "$( Date: Sat, 28 Aug 2021 16:57:43 +0200 Subject: [PATCH 30/31] Update Tasmota_build_master.yml --- .github/workflows/Tasmota_build_master.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 5bc79c06d..0e13d2d63 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1358,3 +1358,17 @@ jobs: destination_repo: 'arendst/Tasmota-firmware' user_email: 'github-actions@github.com' user_name: 'github-actions' + - name: Creat trigger.txt + run: | + echo ${GITHUB_SHA} &> trigger.txt + echo "$( Date: Sun, 29 Aug 2021 16:58:20 +0200 Subject: [PATCH 31/31] Some corrections --- tasmota/language/de_DE.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index fdee2f6c3..2e94554d1 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.5.0.3 + * Updated until v9.5.0.7 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -234,8 +234,8 @@ #define D_SYSLOG_HOST_NOT_FOUND "Syslog-Host nicht gefunden" // settings.ino -#define D_SAVED_TO_FLASH_AT "in Flash gespeichert am" -#define D_LOADED_FROM_FLASH_AT "aus Flash geladen am" +#define D_SAVED_TO_FLASH_AT "in Flash gespeichert an" +#define D_LOADED_FROM_FLASH_AT "aus Flash geladen von" #define D_USE_DEFAULTS "Standard verwenden" #define D_ERASED_SECTOR "gelöschter Sektor" @@ -330,7 +330,7 @@ #define D_MQTT_TLS_ENABLE "MQTT TLS" #define D_HTTP_API "HTTP API" #define D_HTTP_API_ENABLE "HTTP API aktivieren" -#define D_FRIENDLY_NAME "Name [friendly name]" +#define D_FRIENDLY_NAME "Name [Friendly Name]" #define D_BELKIN_WEMO "Belkin WeMo" #define D_HUE_BRIDGE "Hue Bridge" #define D_SINGLE_DEVICE "Einzelnes Gerät" @@ -493,19 +493,19 @@ #define D_ZIGBEE_UNKNWON_ATTRIBUTE "Unbekannter Attribut Name (ignoriert): %s" #define D_ZIGBEE_TOO_MANY_CLUSTERS "Nur eine Cluster id pro Kommando" #define D_ZIGBEE_WRONG_DELIMITER "Falscher Delimeter für Payload" -#define D_ZIGBEE_UNRECOGNIZED_COMMAND "Unerkanntes zigbee Kommando: %s" +#define D_ZIGBEE_UNRECOGNIZED_COMMAND "Unerkanntes Zigbee Kommando: %s" #define D_ZIGBEE_TOO_MANY_COMMANDS "Nur 1 Kommando zulässig (%d)" #define D_ZIGBEE_NO_ATTRIBUTE "Kein Attribut in der Liste" #define D_ZIGBEE_UNSUPPORTED_ATTRIBUTE_TYPE "Nicht unterstützter Attribut Typ" #define D_ZIGBEE_JSON_REQUIRED "Konfiguration muss JSON basiert sein" #define D_ZIGBEE_RESET_1_OR_2 "1 oder 2 für Reset" -#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM gefunden auf Adresse" +#define D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS "ZBBridge EEPROM gefunden an Adresse" #define D_ZIGBEE_RANDOMIZING_ZBCONFIG "Zufällige Zigbee Parameter erstellt, Überprüfung mit 'ZbConfig'" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energie heute" #define D_ENERGY_YESTERDAY "Energie gestern" -#define D_ENERGY_TOTAL "Energie insgesamt" +#define D_ENERGY_TOTAL "Energie gesamt" // xdrv_27_shutter.ino #define D_OPEN "Öffnen" @@ -533,7 +533,7 @@ #define D_CHECKSUM_FAILURE "Prüfsummen-Fehler" // xsns_07_sht1x.ino -#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor hat ACK-Befehl nicht ausgeführt" +#define D_SENSOR_DID_NOT_ACK_COMMAND "Sensor hat Befehl nicht ausgeführt" #define D_SHT1X_FOUND "SHT1X gefunden" // xsns_18_pms5003.ino @@ -945,9 +945,9 @@ #define D_FS_SIZE "Größe" #define D_FS_FREE "Frei" #define D_NEW_FILE "neue-datei.txt" -#define D_CREATE_NEW_FILE "Neue Datei erstellen und bearbeiten" +#define D_CREATE_NEW_FILE "Datei erstellen und bearbeiten" #define D_EDIT_FILE "Datei bearbeiten" -#define D_CONFIRM_FILE_DEL "Löschen der Datei bestätigen" +#define D_CONFIRM_FILE_DEL "Datei löschen bestätigen" //xsns_67_as3935.ino #define D_AS3935_GAIN "Umgebung:" @@ -1017,7 +1017,7 @@ #define D_FP_INVALIDIMAGE "Abbild ungültig" // 0x15 Failed to generate image because of lac of valid primary image #define D_FP_FLASHERR "Flash Schreibfehler" // 0x18 Error when writing flash #define D_FP_INVALIDREG "Ungültige ID-Nummer" // 0x1A Invalid register number -#define D_FP_ADDRCODE "Addresse" // 0x20 Address code +#define D_FP_ADDRCODE "Adresse" // 0x20 Address code #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error