From 24709b9f6daa33899a41225c586ea7f8d46716b1 Mon Sep 17 00:00:00 2001 From: Matteo Albinola Date: Sun, 26 Apr 2020 09:43:52 +0200 Subject: [PATCH 1/6] Add windmeter sensor --- 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/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/zh-CN.h | 1 + tasmota/language/zh-TW.h | 1 + tasmota/my_user_config.h | 2 + tasmota/settings.h | 5 + tasmota/support_features.ino | 3 + tasmota/tasmota_configurations.h | 1 + tasmota/tasmota_template.h | 7 +- tasmota/xsns_68_windmeter.ino | 340 +++++++++++++++++++++++++++++++ 29 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 tasmota/xsns_68_windmeter.ino diff --git a/tasmota/language/bg-BG.h b/tasmota/language/bg-BG.h index 5a771ec11..51610bcd4 100644 --- a/tasmota/language/bg-BG.h +++ b/tasmota/language/bg-BG.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h index de709d07e..0e6afa2f1 100644 --- a/tasmota/language/cs-CZ.h +++ b/tasmota/language/cs-CZ.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h index 675ea9786..40a5a1091 100644 --- a/tasmota/language/de-DE.h +++ b/tasmota/language/de-DE.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h index 19c0a0c56..e844e9115 100644 --- a/tasmota/language/el-GR.h +++ b/tasmota/language/el-GR.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h index 4da4ba276..cd0de6bd6 100644 --- a/tasmota/language/en-GB.h +++ b/tasmota/language/en-GB.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h index e074dcf6b..3dd94ec03 100644 --- a/tasmota/language/es-ES.h +++ b/tasmota/language/es-ES.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h index a00ef34a1..25d26e97a 100644 --- a/tasmota/language/fr-FR.h +++ b/tasmota/language/fr-FR.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h index f86a0abfe..61e2d123f 100644 --- a/tasmota/language/he-HE.h +++ b/tasmota/language/he-HE.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h index 8efaf236d..2be5f074c 100644 --- a/tasmota/language/hu-HU.h +++ b/tasmota/language/hu-HU.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h index 4f1cfbe17..68c380d06 100644 --- a/tasmota/language/it-IT.h +++ b/tasmota/language/it-IT.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL - RX" #define D_SENSOR_ELECTRIQ_MOODL "MOODL - TX" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h index 75925b2d3..1bb064ab6 100644 --- a/tasmota/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h index 7a3ad605d..0488ee915 100644 --- a/tasmota/language/nl-NL.h +++ b/tasmota/language/nl-NL.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h index 5dba67103..e13dc3270 100644 --- a/tasmota/language/pl-PL.h +++ b/tasmota/language/pl-PL.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h index 58bc33d91..12f8b9e72 100644 --- a/tasmota/language/pt-BR.h +++ b/tasmota/language/pt-BR.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h index e31997ecb..7b5f44107 100644 --- a/tasmota/language/pt-PT.h +++ b/tasmota/language/pt-PT.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro-RO.h b/tasmota/language/ro-RO.h index 0d29cd8dd..a369fd1f3 100644 --- a/tasmota/language/ro-RO.h +++ b/tasmota/language/ro-RO.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h index 12696e0bf..22b1cd780 100644 --- a/tasmota/language/ru-RU.h +++ b/tasmota/language/ru-RU.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h index 93c02cddd..230b88051 100644 --- a/tasmota/language/sk-SK.h +++ b/tasmota/language/sk-SK.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h index 9fdd52c5d..fac7577d2 100644 --- a/tasmota/language/sv-SE.h +++ b/tasmota/language/sv-SE.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h index 2d568bf4a..902d9298e 100644 --- a/tasmota/language/tr-TR.h +++ b/tasmota/language/tr-TR.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk-UA.h b/tasmota/language/uk-UA.h index 64f97093c..fcf8e146e 100644 --- a/tasmota/language/uk-UA.h +++ b/tasmota/language/uk-UA.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h index b98006123..154fc3474 100644 --- a/tasmota/language/zh-CN.h +++ b/tasmota/language/zh-CN.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "安" diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h index d4fa149d5..b3ebcc1c2 100644 --- a/tasmota/language/zh-TW.h +++ b/tasmota/language/zh-TW.h @@ -666,6 +666,7 @@ #define D_SENSOR_HRXL_RX "HRXL Rx" #define D_SENSOR_ELECTRIQ_MOODL "MOODL Tx" #define D_SENSOR_AS3935 "AS3935" +#define D_SENSOR_WINDMETER_SPEED "WindMeter Speed" // Units #define D_UNIT_AMPERE "安" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e20a653a8..deafedfe8 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -660,6 +660,8 @@ #define USE_TASMOTA_SLAVE_FLASH_SPEED 57600 // Usually 57600 for 3.3V variants and 115200 for 5V variants #define USE_TASMOTA_SLAVE_SERIAL_SPEED 57600 // Depends on the sketch that is running on the Uno/Pro Mini +//#define USE_WINDMETER // Add support for analog anemometer + // -- End of general directives ------------------- /*********************************************************************************************\ diff --git a/tasmota/settings.h b/tasmota/settings.h index 7ea3b5e3e..481faa2ba 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -525,7 +525,12 @@ struct { uint8_t zb_free_byte; // F33 uint16_t pms_wake_interval; // F34 uint8_t config_version; // F36 +// uint16_t windmeter_radius; // F37 +// uint8_t windmeter_pulses_x_rot; // F39 +// uint16_t windmeter_pulse_debounce; // F3A +// int16_t windmeter_speed_factor; // F3C +// uint8_t free_f37[122]; // F3E - Decrement if adding new Setting variables just above and below uint8_t free_f37[129]; // F37 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index aa02d676e..454e13bac 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -554,6 +554,9 @@ void GetFeatures(void) #ifdef USE_PING feature6 |= 0x00000080; // xdrv_38_ping.ino #endif +//#ifdef USE_WINDMETER +// feature6 |= 0x00000100; // xsns_68_windmeter.ino +//#endif // feature6 |= 0x00000100; // feature6 |= 0x00000200; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index dfb2434e3..3fc3cc0e0 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -183,6 +183,7 @@ #define USE_HRE // Add support for Badger HR-E Water Meter (+1k4 code) //#define USE_A4988_STEPPER // Add support for A4988/DRV8825 stepper-motor-driver-circuit (+10k5 code) //#define USE_ARDUINO_SLAVE // Add support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) +//#define USE_WINDMETER // Add support for analog anemometer #undef DEBUG_THEO // Disable debug code #undef USE_DEBUG_DRIVER // Disable debug code #endif // FIRMWARE_SENSORS diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index ae95705c7..8a55c0f8d 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -228,6 +228,7 @@ enum UserSelectablePins { GPIO_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX GPIO_AS3935, GPIO_PMS5003_TX, // Plantower PMS5003 Serial interface + GPIO_WINDMETER_SPEED, // WindMeter speed counter pin GPIO_SENSOR_END }; // Programmer selectable GPIO functionality @@ -315,7 +316,8 @@ const char kSensorNames[] PROGMEM = D_SENSOR_CC1101_GDO0 "|" D_SENSOR_CC1101_GDO2 "|" D_SENSOR_HRXL_RX "|" D_SENSOR_ELECTRIQ_MOODL "|" - D_SENSOR_AS3935 "|" D_SENSOR_PMS5003_TX + D_SENSOR_AS3935 "|" D_SENSOR_PMS5003_TX "|" + D_SENSOR_WINDMETER_SPEED ; const char kSensorNamesFixed[] PROGMEM = @@ -663,6 +665,9 @@ const uint8_t kGpioNiceList[] PROGMEM = { #ifdef USE_AS3935 GPIO_AS3935, #endif +#ifdef USE_WINDMETER + GPIO_WINDMETER_SPEED, +#endif }; /********************************************************************************************/ diff --git a/tasmota/xsns_68_windmeter.ino b/tasmota/xsns_68_windmeter.ino new file mode 100644 index 000000000..f926faf5a --- /dev/null +++ b/tasmota/xsns_68_windmeter.ino @@ -0,0 +1,340 @@ +/* + xsns_68_windmeter.ino - Analog wind sensor support for Tasmota + + Copyright (C) 2020 Matteo Albinola + (inspired by great works of Thomas Eckerstorfer, Norbert Richter, Maarten Damen 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_WINDMETER +/*********************************************************************************************\ + * WindMeter sensor (speed) +\*********************************************************************************************/ + +#define XSNS_68 68 + +#define D_WINDMETER_NAME "WindMeter" + +#define WINDMETER_DEF_RADIUS 61 // Radius in millimeters (calculated by measuring the distance from the centre to the edge of one of the cups) +#define WINDMETER_DEF_PULSES_X_ROT 1 // Number of pulses for a complete rotation +#define WINDMETER_DEF_PULSE_DEBOUNCE 10 // Pulse counter debounce time (milliseconds) +#define WINDMETER_DEF_COMP_FACTOR 1.18 // Compensation factor +#define WINDMETER_WEIGHT_AVG_SAMPLE 150 // No of samples to take + +#ifdef USE_WEBSERVER +#define D_WINDMETER_WIND_AVG "∅" +#define D_WINDMETER_WIND_ANGLE "∠" +#define D_WINDMETER_WIND_DEGREE "°" +const char HTTP_SNS_WINDMETER[] PROGMEM = + "{s}" D_WINDMETER_NAME " " D_TX20_WIND_SPEED "{m}%s %s{e}" +#ifndef USE_WINDMETER_NOSTATISTICS + "{s}" D_WINDMETER_NAME " " D_TX20_WIND_SPEED " " D_WINDMETER_WIND_AVG "{m}%s %s{e}" + "{s}" D_WINDMETER_NAME " " D_TX20_WIND_SPEED_MIN "{m}%s %s{e}" + "{s}" D_WINDMETER_NAME " " D_TX20_WIND_SPEED_MAX "{m}%s %s{e}" +#endif // USE_WINDMETER_NOSTATISTICS +// "{s}WindMeter " D_TX20_WIND_DIRECTION "{m}%s %s" D_WINDMETER_WIND_DEGREE "{e}" +//#ifndef USE_WINDMETER_NOSTATISTICS +// "{s}WindMeter " D_TX20_WIND_DIRECTION " " D_WINDMETER_WIND_AVG "{m}%s %s" D_WINDMETER_WIND_DEGREE "{e}" +// "{s}WindMeter " D_TX20_WIND_DIRECTION " " D_WINDMETER_WIND_ANGLE "{m}%s" D_WINDMETER_WIND_DEGREE " (%s,%s)" D_WINDMETER_WIND_DEGREE; +//#endif // USE_WINDMETER_NOSTATISTICS + ; +#endif // USE_WEBSERVER + +// float saves 48 byte +float const windmeter_pi = 3.1415926535897932384626433; // Pi +float const windmeter_2pi = windmeter_pi * 2; + +struct WINDMETER { + uint32_t counter_time; + unsigned long counter = 0; + //uint32_t speed_time; + float speed = 0; +#ifndef USE_WINDMETER_NOSTATISTICS + float speed_min = 0; + float speed_max = 0; + float speed_avg = 0; + uint32_t samples_count = 0; + uint32_t avg_samples_no; +#endif // USE_WINDMETER_NOSTATISTICS +} WindMeter; + +struct WINDMETER_SETTINGS { + uint16_t windmeter_radius; + uint8_t windmeter_pulses_x_rot; + uint16_t windmeter_pulse_debounce; + int16_t windmeter_speed_factor; +} WindMeterSettings; + +#ifndef ARDUINO_ESP8266_RELEASE_2_3_0 // Fix core 2.5.x ISR not in IRAM Exception +void WindMeterUpdateSpeed(void) ICACHE_RAM_ATTR; +#endif // ARDUINO_ESP8266_RELEASE_2_3_0 + +void WindMeterUpdateSpeed(void) +{ + uint32_t time = micros(); + uint32_t time_diff = time - WindMeter.counter_time; + if (time_diff > WindMeterSettings.windmeter_pulse_debounce * 1000) { + WindMeter.counter_time = time; + WindMeter.counter++; + AddLog_P2(LOG_LEVEL_DEBUG, PSTR("WMET: Counter %d"), WindMeter.counter); + } +} + +/********************************************************************************************/ + +void WindMeterInit(void) +{ + if (!Settings.flag2.speed_conversion) { + Settings.flag2.speed_conversion = 2; // 0 = none, 1 = m/s, 2 = km/h, 3 = kn, 4 = mph, 5 = ft/s, 6 = yd/s + } + if (!WindMeterSettings.windmeter_radius) { + WindMeterSettings.windmeter_radius = WINDMETER_DEF_RADIUS; + } + if (!WindMeterSettings.windmeter_pulses_x_rot) { + WindMeterSettings.windmeter_pulses_x_rot = WINDMETER_DEF_PULSES_X_ROT; + } + if (!WindMeterSettings.windmeter_pulse_debounce) { + WindMeterSettings.windmeter_pulse_debounce = WINDMETER_DEF_PULSE_DEBOUNCE; + } + if (!WindMeterSettings.windmeter_speed_factor) { + WindMeterSettings.windmeter_speed_factor = (int16_t)(WINDMETER_DEF_COMP_FACTOR * 1000); + } + +#ifndef USE_WINDMETER_NOSTATISTICS + WindMeterResetStatData(); + WindMeterCheckSampleCount(); +#endif // USE_WINDMETER_NOSTATISTICS + + pinMode(pin[GPIO_WINDMETER_SPEED], INPUT_PULLUP); + attachInterrupt(pin[GPIO_WINDMETER_SPEED], WindMeterUpdateSpeed, FALLING); +} + +void WindMeterEverySecond(void) +{ + //uint32_t time = micros(); + //uint32_t delta_time = time - WindMeter.speed_time; + //AddLog_P2(LOG_LEVEL_INFO, PSTR("delta_time: %d"), delta_time); + + // speed = ( (pulses / pulses_per_rotation) * (2 * pi * radius) ) / delta_time + WindMeter.speed = ((WindMeter.counter / WindMeterSettings.windmeter_pulses_x_rot) * (windmeter_2pi * ((float)WindMeterSettings.windmeter_radius / 1000))) * ((float)WindMeterSettings.windmeter_speed_factor / 1000); + //WindMeter.speed = (((WindMeter.counter / WindMeterSettings.windmeter_pulses_x_rot) * (windmeter_2pi * ((float)WindMeterSettings.windmeter_radius / 1000))) / ((float)delta_time / 1000000)) * ((float)WindMeterSettings.windmeter_speed_factor / 1000); + WindMeter.counter = 0; + //WindMeter.speed_time = time; + + //char speed_string[FLOATSZ]; + //dtostrfd(WindMeter.speed, 2, speed_string); + //char uspeed_string[FLOATSZ]; + //dtostrfd(ConvertSpeed(WindMeter.speed), 2, uspeed_string); + //AddLog_P2(LOG_LEVEL_DEBUG, PSTR("WMET: Speed %s [m/s] - %s [unit]"), speed_string, uspeed_string); + +#ifndef USE_WINDMETER_NOSTATISTICS + if (WindMeter.speed < WindMeter.speed_min) { + WindMeter.speed_min = WindMeter.speed; + } + if (WindMeter.speed > WindMeter.speed_max) { + WindMeter.speed_max = WindMeter.speed; + } + + // exponentially weighted average is not quite as smooth as the arithmetic average + // but close enough to the moving average and does not require the regular reset + // of the divider with the associated jump in avg values after period is over + if (WindMeter.samples_count <= WindMeter.avg_samples_no) { + WindMeter.samples_count++; + } + WindMeter.speed_avg -= WindMeter.speed_avg / WindMeter.samples_count; + WindMeter.speed_avg += float(WindMeter.speed) / WindMeter.samples_count; + + WindMeterCheckSampleCount(); + if (0==Settings.tele_period) { + WindMeterResetStatData(); + } +#endif // USE_WINDMETER_NOSTATISTICS +} + +void WindMeterResetStatData(void) +{ + WindMeter.speed_min = WindMeter.speed; + WindMeter.speed_max = WindMeter.speed; + //WindMeter.direction_min = WindMeter.direction; + //WindMeter.direction_max = WindMeter.direction; +} + +void WindMeterCheckSampleCount(void) +{ + uint32_t prev_avg_samples_no = WindMeter.avg_samples_no; + if (Settings.tele_period) { + // number for avg samples = teleperiod value if set + WindMeter.avg_samples_no = Settings.tele_period; + } else { + // otherwise use default number of samples for this driver + WindMeter.avg_samples_no = WINDMETER_WEIGHT_AVG_SAMPLE; + } + if (prev_avg_samples_no != WindMeter.avg_samples_no) { + WindMeter.speed_avg = WindMeter.speed; + WindMeter.samples_count = 0; + } +} + +void WindMeterShow(bool json) +{ + char speed_string[FLOATSZ]; + dtostrfd(ConvertSpeed(WindMeter.speed), 2, speed_string); +#ifndef USE_WINDMETER_NOSTATISTICS + char speed_min_string[FLOATSZ]; + dtostrfd(ConvertSpeed(WindMeter.speed_min), 2, speed_min_string); + char speed_max_string[FLOATSZ]; + dtostrfd(ConvertSpeed(WindMeter.speed_max), 2, speed_max_string); + char speed_avg_string[FLOATSZ]; + dtostrfd(ConvertSpeed(WindMeter.speed_avg), 2, speed_avg_string); + //char direction_avg_string[FLOATSZ]; + //dtostrfd(WindMeter.direction_avg, 1, direction_avg_string); + //char direction_avg_cardinal_string[4]; + //GetTextIndexed(direction_avg_cardinal_string, sizeof(direction_avg_cardinal_string), int((WindMeter.direction_avg/22.5f)+0.5f) % 16, kWindMeterDirections); + //char direction_range_string[FLOATSZ]; + //dtostrfd(Tx2xNormalize(WindMeter.direction_max-WindMeter.direction_min)*22.5, 1, direction_range_string); + //char direction_min_string[FLOATSZ]; + //dtostrfd(Tx2xNormalize(WindMeter.direction_min)*22.5, 1, direction_min_string); + //char direction_max_string[FLOATSZ]; + //dtostrfd(Tx2xNormalize(WindMeter.direction_max)*22.5, 1, direction_max_string); +#endif // USE_WINDMETER_NOSTATISTICS + + if (json) { +#ifndef USE_WINDMETER_NOSTATISTICS + ResponseAppend_P(PSTR(",\"" D_WINDMETER_NAME "\":{\"" D_JSON_SPEED "\":{\"Act\":%s,\"Avg\":%s,\"Min\":%s,\"Max\":%s},\"Dir\":{\"Card\":\"%s\",\"Deg\":%s,\"Avg\":%s,\"AvgCard\":\"%s\",\"Min\":%s,\"Max\":%s,\"Range\":%s}}"), + speed_string, + speed_avg_string, + speed_min_string, + speed_max_string, + "n/a", //direction_cardinal_string, + "n/a", //direction_string, + "n/a", //direction_avg_string, + "n/a", //direction_avg_cardinal_string, + "n/a", //direction_min_string, + "n/a", //direction_max_string, + "n/a" //direction_range_string + ); +#else // USE_WINDMETER_NOSTATISTICS + ResponseAppend_P(PSTR(",\"" D_WINDMETER_NAME "\":{\"" D_JSON_SPEED "\":{\"Act\":%s},\"Dir\":{\"Card\":\"%s\",\"Deg\":%s}}"), + speed_string, + "n/a", //wind_direction_cardinal_string, + "n/a" //wind_direction_string + ); +#endif // USE_WINDMETER_NOSTATISTICS +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_WINDMETER, + speed_string, + SpeedUnit().c_str(), +#ifndef USE_WINDMETER_NOSTATISTICS + speed_avg_string, + SpeedUnit().c_str(), + speed_min_string, + SpeedUnit().c_str(), + speed_max_string, + SpeedUnit().c_str(), +#endif // USE_WINDMETER_NOSTATISTICS + "n/a", //wind_direction_cardinal_string, + "n/a" //wind_direction_string +#ifndef USE_WINDMETER_NOSTATISTICS + ,"n/a", //,wind_direction_avg_cardinal_string, + "n/a", //wind_direction_avg_string, + "n/a", //wind_direction_range_string, + "n/a", //wind_direction_min_string, + "n/a" //wind_direction_max_string +#endif // USE_WINDMETER_NOSTATISTICS + ); +#endif // USE_WEBSERVER + } +} + +/*********************************************************************************************\ + * Commands +\*********************************************************************************************/ + +bool Xsns68Cmnd(void) +{ + bool serviced = true; + bool show_parms = true; + char sub_string[XdrvMailbox.data_len +1]; + switch (XdrvMailbox.payload) { + case 1: + if (strstr(XdrvMailbox.data, ",") != nullptr) { + WindMeterSettings.windmeter_radius = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + } + break; + case 2: + if (strstr(XdrvMailbox.data, ",") != nullptr) { + WindMeterSettings.windmeter_pulses_x_rot = (uint8_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + } + break; + case 3: + if (strstr(XdrvMailbox.data, ",") != nullptr) { + WindMeterSettings.windmeter_pulse_debounce = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + } + break; + case 4: + if (strstr(XdrvMailbox.data, ",") != nullptr) { + WindMeterSettings.windmeter_speed_factor = (int16_t)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2)) * 1000); + } + break; + } + + if (show_parms) { + char speed_factor_string[FLOATSZ]; + dtostrfd((float)WindMeterSettings.windmeter_speed_factor / 1000, 3, speed_factor_string); + Response_P(PSTR("{\"" D_WINDMETER_NAME "\":{\"Radius\":%d,\"PulsesPerRot\":%d,\"PulseDebounce\":%d,\"SpeedFactor\":%s}}"), + WindMeterSettings.windmeter_radius, WindMeterSettings.windmeter_pulses_x_rot, WindMeterSettings.windmeter_pulse_debounce, speed_factor_string); + } + return serviced; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns68(uint8_t function) +{ + bool result = false; + if (pin[GPIO_WINDMETER_SPEED] < 99) { + switch (function) { + case FUNC_INIT: + WindMeterInit(); + break; + case FUNC_EVERY_SECOND: + WindMeterEverySecond(); + break; +#ifndef USE_WINDMETER_NOSTATISTICS + case FUNC_AFTER_TELEPERIOD: + WindMeterResetStatData(); + break; +#endif // USE_WINDMETER_NOSTATISTICS + case FUNC_JSON_APPEND: + WindMeterShow(true); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + WindMeterShow(false); + break; +#endif // USE_WEBSERVER + case FUNC_COMMAND_SENSOR: + if (XSNS_68 == XdrvMailbox.index) { + result = Xsns68Cmnd(); + } + } + } + return result; +} + +#endif // USE_WINDMETER From b9aa6fe19df437196d343ded087c4701e427de08 Mon Sep 17 00:00:00 2001 From: Matteo Albinola Date: Sun, 26 Apr 2020 19:21:10 +0200 Subject: [PATCH 2/6] Add configuration persistence fixing variable alignment problem --- tasmota/settings.h | 11 +++++----- tasmota/xsns_68_windmeter.ino | 41 +++++++++++++++-------------------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 481faa2ba..f6a270092 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -525,13 +525,12 @@ struct { uint8_t zb_free_byte; // F33 uint16_t pms_wake_interval; // F34 uint8_t config_version; // F36 -// uint16_t windmeter_radius; // F37 -// uint8_t windmeter_pulses_x_rot; // F39 -// uint16_t windmeter_pulse_debounce; // F3A -// int16_t windmeter_speed_factor; // F3C + uint8_t windmeter_pulses_x_rot; // F37 + uint16_t windmeter_radius; // F38 + uint16_t windmeter_pulse_debounce; // F3A + int16_t windmeter_speed_factor; // F3C -// uint8_t free_f37[122]; // F3E - Decrement if adding new Setting variables just above and below - uint8_t free_f37[129]; // F37 - Decrement if adding new Setting variables just above and below + uint8_t free_f3e[122]; // F3E - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below uint16_t pulse_counter_debounce_low; // FB8 diff --git a/tasmota/xsns_68_windmeter.ino b/tasmota/xsns_68_windmeter.ino index f926faf5a..db938a47c 100644 --- a/tasmota/xsns_68_windmeter.ino +++ b/tasmota/xsns_68_windmeter.ino @@ -70,13 +70,6 @@ struct WINDMETER { #endif // USE_WINDMETER_NOSTATISTICS } WindMeter; -struct WINDMETER_SETTINGS { - uint16_t windmeter_radius; - uint8_t windmeter_pulses_x_rot; - uint16_t windmeter_pulse_debounce; - int16_t windmeter_speed_factor; -} WindMeterSettings; - #ifndef ARDUINO_ESP8266_RELEASE_2_3_0 // Fix core 2.5.x ISR not in IRAM Exception void WindMeterUpdateSpeed(void) ICACHE_RAM_ATTR; #endif // ARDUINO_ESP8266_RELEASE_2_3_0 @@ -85,7 +78,7 @@ void WindMeterUpdateSpeed(void) { uint32_t time = micros(); uint32_t time_diff = time - WindMeter.counter_time; - if (time_diff > WindMeterSettings.windmeter_pulse_debounce * 1000) { + if (time_diff > Settings.windmeter_pulse_debounce * 1000) { WindMeter.counter_time = time; WindMeter.counter++; AddLog_P2(LOG_LEVEL_DEBUG, PSTR("WMET: Counter %d"), WindMeter.counter); @@ -99,17 +92,17 @@ void WindMeterInit(void) if (!Settings.flag2.speed_conversion) { Settings.flag2.speed_conversion = 2; // 0 = none, 1 = m/s, 2 = km/h, 3 = kn, 4 = mph, 5 = ft/s, 6 = yd/s } - if (!WindMeterSettings.windmeter_radius) { - WindMeterSettings.windmeter_radius = WINDMETER_DEF_RADIUS; + if (!Settings.windmeter_radius) { + Settings.windmeter_radius = WINDMETER_DEF_RADIUS; } - if (!WindMeterSettings.windmeter_pulses_x_rot) { - WindMeterSettings.windmeter_pulses_x_rot = WINDMETER_DEF_PULSES_X_ROT; + if (!Settings.windmeter_pulses_x_rot) { + Settings.windmeter_pulses_x_rot = WINDMETER_DEF_PULSES_X_ROT; } - if (!WindMeterSettings.windmeter_pulse_debounce) { - WindMeterSettings.windmeter_pulse_debounce = WINDMETER_DEF_PULSE_DEBOUNCE; + if (!Settings.windmeter_pulse_debounce) { + Settings.windmeter_pulse_debounce = WINDMETER_DEF_PULSE_DEBOUNCE; } - if (!WindMeterSettings.windmeter_speed_factor) { - WindMeterSettings.windmeter_speed_factor = (int16_t)(WINDMETER_DEF_COMP_FACTOR * 1000); + if (!Settings.windmeter_speed_factor) { + Settings.windmeter_speed_factor = (int16_t)(WINDMETER_DEF_COMP_FACTOR * 1000); } #ifndef USE_WINDMETER_NOSTATISTICS @@ -128,8 +121,8 @@ void WindMeterEverySecond(void) //AddLog_P2(LOG_LEVEL_INFO, PSTR("delta_time: %d"), delta_time); // speed = ( (pulses / pulses_per_rotation) * (2 * pi * radius) ) / delta_time - WindMeter.speed = ((WindMeter.counter / WindMeterSettings.windmeter_pulses_x_rot) * (windmeter_2pi * ((float)WindMeterSettings.windmeter_radius / 1000))) * ((float)WindMeterSettings.windmeter_speed_factor / 1000); - //WindMeter.speed = (((WindMeter.counter / WindMeterSettings.windmeter_pulses_x_rot) * (windmeter_2pi * ((float)WindMeterSettings.windmeter_radius / 1000))) / ((float)delta_time / 1000000)) * ((float)WindMeterSettings.windmeter_speed_factor / 1000); + WindMeter.speed = ((WindMeter.counter / Settings.windmeter_pulses_x_rot) * (windmeter_2pi * ((float)Settings.windmeter_radius / 1000))) * ((float)Settings.windmeter_speed_factor / 1000); + //WindMeter.speed = (((WindMeter.counter / Settings.windmeter_pulses_x_rot) * (windmeter_2pi * ((float)Settings.windmeter_radius / 1000))) / ((float)delta_time / 1000000)) * ((float)Settings.windmeter_speed_factor / 1000); WindMeter.counter = 0; //WindMeter.speed_time = time; @@ -271,31 +264,31 @@ bool Xsns68Cmnd(void) switch (XdrvMailbox.payload) { case 1: if (strstr(XdrvMailbox.data, ",") != nullptr) { - WindMeterSettings.windmeter_radius = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + Settings.windmeter_radius = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); } break; case 2: if (strstr(XdrvMailbox.data, ",") != nullptr) { - WindMeterSettings.windmeter_pulses_x_rot = (uint8_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + Settings.windmeter_pulses_x_rot = (uint8_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); } break; case 3: if (strstr(XdrvMailbox.data, ",") != nullptr) { - WindMeterSettings.windmeter_pulse_debounce = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + Settings.windmeter_pulse_debounce = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); } break; case 4: if (strstr(XdrvMailbox.data, ",") != nullptr) { - WindMeterSettings.windmeter_speed_factor = (int16_t)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2)) * 1000); + Settings.windmeter_speed_factor = (int16_t)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2)) * 1000); } break; } if (show_parms) { char speed_factor_string[FLOATSZ]; - dtostrfd((float)WindMeterSettings.windmeter_speed_factor / 1000, 3, speed_factor_string); + dtostrfd((float)Settings.windmeter_speed_factor / 1000, 3, speed_factor_string); Response_P(PSTR("{\"" D_WINDMETER_NAME "\":{\"Radius\":%d,\"PulsesPerRot\":%d,\"PulseDebounce\":%d,\"SpeedFactor\":%s}}"), - WindMeterSettings.windmeter_radius, WindMeterSettings.windmeter_pulses_x_rot, WindMeterSettings.windmeter_pulse_debounce, speed_factor_string); + Settings.windmeter_radius, Settings.windmeter_pulses_x_rot, Settings.windmeter_pulse_debounce, speed_factor_string); } return serviced; } From bdb5d92d85e92a7468e3cb5c5e3b7fedc314ccc4 Mon Sep 17 00:00:00 2001 From: Matteo Albinola Date: Mon, 27 Apr 2020 09:38:39 +0200 Subject: [PATCH 3/6] Add variable for tele updates --- tasmota/settings.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 1eeadca7b..c1efb59d7 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -529,8 +529,9 @@ struct { uint16_t windmeter_radius; // F38 uint16_t windmeter_pulse_debounce; // F3A int16_t windmeter_speed_factor; // F3C + uint8_t windmeter_tele_on_change; // F3E - uint8_t free_f3e[122]; // F3E - Decrement if adding new Setting variables just above and below + uint8_t free_f3f[121]; // F3F - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below uint16_t pulse_counter_debounce_low; // FB8 From e23b43f9798cf484df850d2365163bc5e7fdcc2e Mon Sep 17 00:00:00 2001 From: Matteo Albinola Date: Tue, 28 Apr 2020 14:02:05 +0200 Subject: [PATCH 4/6] Add option for triggering a tele update under conditions --- tasmota/settings.h | 2 +- tasmota/xsns_68_windmeter.ino | 46 +++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index c1efb59d7..0cf2bd9cf 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -529,7 +529,7 @@ struct { uint16_t windmeter_radius; // F38 uint16_t windmeter_pulse_debounce; // F3A int16_t windmeter_speed_factor; // F3C - uint8_t windmeter_tele_on_change; // F3E + uint8_t windmeter_tele_pchange; // F3E uint8_t free_f3f[121]; // F3F - Decrement if adding new Setting variables just above and below diff --git a/tasmota/xsns_68_windmeter.ino b/tasmota/xsns_68_windmeter.ino index db938a47c..b0342984e 100644 --- a/tasmota/xsns_68_windmeter.ino +++ b/tasmota/xsns_68_windmeter.ino @@ -31,6 +31,7 @@ #define WINDMETER_DEF_PULSES_X_ROT 1 // Number of pulses for a complete rotation #define WINDMETER_DEF_PULSE_DEBOUNCE 10 // Pulse counter debounce time (milliseconds) #define WINDMETER_DEF_COMP_FACTOR 1.18 // Compensation factor +#define WINDMETER_DEF_TELE_PCHANGE 255 // Minimum percentage change between current and last reported speed in order to trigger a new tele message (0...100, 255 means off) #define WINDMETER_WEIGHT_AVG_SAMPLE 150 // No of samples to take #ifdef USE_WEBSERVER @@ -61,6 +62,7 @@ struct WINDMETER { unsigned long counter = 0; //uint32_t speed_time; float speed = 0; + float last_tele_speed = 0; #ifndef USE_WINDMETER_NOSTATISTICS float speed_min = 0; float speed_max = 0; @@ -104,6 +106,9 @@ void WindMeterInit(void) if (!Settings.windmeter_speed_factor) { Settings.windmeter_speed_factor = (int16_t)(WINDMETER_DEF_COMP_FACTOR * 1000); } + if (!Settings.windmeter_tele_pchange) { + Settings.windmeter_tele_pchange = WINDMETER_DEF_TELE_PCHANGE; + } #ifndef USE_WINDMETER_NOSTATISTICS WindMeterResetStatData(); @@ -154,6 +159,22 @@ void WindMeterEverySecond(void) WindMeterResetStatData(); } #endif // USE_WINDMETER_NOSTATISTICS + + if (WindMeterShouldTriggerTele()) { + WindMeterTriggerTele(); + } +} + +bool WindMeterShouldTriggerTele() +{ + if (Settings.windmeter_tele_pchange > 100) { + return false; + } else if (WindMeter.last_tele_speed == 0) { + return WindMeter.speed > 0; + } else { + float perc_change = (WindMeter.speed / WindMeter.last_tele_speed) -1; + return (perc_change * ((perc_change < 0) ? -100 : 100)) >= Settings.windmeter_tele_pchange; + } } void WindMeterResetStatData(void) @@ -204,6 +225,7 @@ void WindMeterShow(bool json) #endif // USE_WINDMETER_NOSTATISTICS if (json) { + WindMeter.last_tele_speed = WindMeter.speed; #ifndef USE_WINDMETER_NOSTATISTICS ResponseAppend_P(PSTR(",\"" D_WINDMETER_NAME "\":{\"" D_JSON_SPEED "\":{\"Act\":%s,\"Avg\":%s,\"Min\":%s,\"Max\":%s},\"Dir\":{\"Card\":\"%s\",\"Deg\":%s,\"Avg\":%s,\"AvgCard\":\"%s\",\"Min\":%s,\"Max\":%s,\"Range\":%s}}"), speed_string, @@ -252,6 +274,17 @@ void WindMeterShow(bool json) } } +void WindMeterTriggerTele(void) +{ + mqtt_data[0] = '\0'; + if (MqttShowSensor()) { + MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); +#ifdef USE_RULES + RulesTeleperiod(); // Allow rule based HA messages +#endif // USE_RULES + } +} + /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -282,13 +315,22 @@ bool Xsns68Cmnd(void) Settings.windmeter_speed_factor = (int16_t)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2)) * 1000); } break; + case 5: + if (strstr(XdrvMailbox.data, ",") != nullptr) { + Settings.windmeter_tele_pchange = (uint8_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); + } + break; } if (show_parms) { char speed_factor_string[FLOATSZ]; dtostrfd((float)Settings.windmeter_speed_factor / 1000, 3, speed_factor_string); - Response_P(PSTR("{\"" D_WINDMETER_NAME "\":{\"Radius\":%d,\"PulsesPerRot\":%d,\"PulseDebounce\":%d,\"SpeedFactor\":%s}}"), - Settings.windmeter_radius, Settings.windmeter_pulses_x_rot, Settings.windmeter_pulse_debounce, speed_factor_string); + char tele_pchange_string[4] = "off"; + if (Settings.windmeter_tele_pchange <= 100) { + itoa(Settings.windmeter_tele_pchange, tele_pchange_string, 10); + } + Response_P(PSTR("{\"" D_WINDMETER_NAME "\":{\"Radius\":%d,\"PulsesPerRot\":%d,\"PulseDebounce\":%d,\"SpeedFactor\":%s,\"TeleTriggerMin%Change\":%s}}"), + Settings.windmeter_radius, Settings.windmeter_pulses_x_rot, Settings.windmeter_pulse_debounce, speed_factor_string, tele_pchange_string); } return serviced; } From 8975bfb310787e97a241d236723424408bbc6c12 Mon Sep 17 00:00:00 2001 From: Matteo Albinola Date: Tue, 28 Apr 2020 18:09:10 +0200 Subject: [PATCH 5/6] Uncomment feature lines --- tasmota/support_features.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 454e13bac..fcaedf423 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -554,9 +554,9 @@ void GetFeatures(void) #ifdef USE_PING feature6 |= 0x00000080; // xdrv_38_ping.ino #endif -//#ifdef USE_WINDMETER -// feature6 |= 0x00000100; // xsns_68_windmeter.ino -//#endif +#ifdef USE_WINDMETER + feature6 |= 0x00000100; // xsns_68_windmeter.ino +#endif // feature6 |= 0x00000100; // feature6 |= 0x00000200; From 0153601dc24fc52ab9b62c0b6f2bf3800afe70f6 Mon Sep 17 00:00:00 2001 From: Matteo Albinola Date: Sat, 2 May 2020 15:22:37 +0200 Subject: [PATCH 6/6] Support new pin handling changes --- tasmota/xsns_68_windmeter.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xsns_68_windmeter.ino b/tasmota/xsns_68_windmeter.ino index b0342984e..4738cfd9b 100644 --- a/tasmota/xsns_68_windmeter.ino +++ b/tasmota/xsns_68_windmeter.ino @@ -115,8 +115,8 @@ void WindMeterInit(void) WindMeterCheckSampleCount(); #endif // USE_WINDMETER_NOSTATISTICS - pinMode(pin[GPIO_WINDMETER_SPEED], INPUT_PULLUP); - attachInterrupt(pin[GPIO_WINDMETER_SPEED], WindMeterUpdateSpeed, FALLING); + pinMode(Pin(GPIO_WINDMETER_SPEED), INPUT_PULLUP); + attachInterrupt(Pin(GPIO_WINDMETER_SPEED), WindMeterUpdateSpeed, FALLING); } void WindMeterEverySecond(void) @@ -342,7 +342,7 @@ bool Xsns68Cmnd(void) bool Xsns68(uint8_t function) { bool result = false; - if (pin[GPIO_WINDMETER_SPEED] < 99) { + if (PinUsed(GPIO_WINDMETER_SPEED)) { switch (function) { case FUNC_INIT: WindMeterInit();