From d7d71cd9c858a8cd521f47b03c4027d86b9f2b63 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Fri, 22 Apr 2022 08:40:29 +0200 Subject: [PATCH 01/13] Add flowmeter (YF-DN50 and similary) --- CHANGELOG.md | 1 + tasmota/berry/include/be_gpio_defines.h | 1 + tasmota/i18n.h | 1 + tasmota/language/af_AF.h | 9 +- tasmota/language/bg_BG.h | 9 +- tasmota/language/cs_CZ.h | 9 +- tasmota/language/de_DE.h | 9 +- tasmota/language/el_GR.h | 9 +- tasmota/language/en_GB.h | 7 + tasmota/language/es_ES.h | 9 +- tasmota/language/fr_FR.h | 9 +- tasmota/language/fy_NL.h | 9 +- tasmota/language/he_HE.h | 9 +- tasmota/language/hu_HU.h | 6 + tasmota/language/it_IT.h | 6 + tasmota/language/ko_KO.h | 9 +- tasmota/language/nl_NL.h | 9 +- tasmota/language/pl_PL.h | 9 +- tasmota/language/pt_BR.h | 9 +- tasmota/language/pt_PT.h | 9 +- tasmota/language/ro_RO.h | 9 +- tasmota/language/ru_RU.h | 9 +- tasmota/language/sk_SK.h | 9 +- tasmota/language/sv_SE.h | 9 +- tasmota/language/tr_TR.h | 9 +- tasmota/language/uk_UA.h | 9 +- tasmota/language/vi_VN.h | 9 +- tasmota/language/zh_CN.h | 9 +- tasmota/language/zh_TW.h | 9 +- tasmota/settings.h | 6 +- tasmota/tasmota_template.h | 8 + tasmota/xsns_96_flowmeter.ino | 257 ++++++++++++++++++++++++ tools/lv_gpio/lv_gpio_enum.h | 2 + 33 files changed, 476 insertions(+), 26 deletions(-) create mode 100644 tasmota/xsns_96_flowmeter.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index b4fafaadc..a74756c3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) +- Support for flow meter ### Changed diff --git a/tasmota/berry/include/be_gpio_defines.h b/tasmota/berry/include/be_gpio_defines.h index ec2271073..b6431945f 100644 --- a/tasmota/berry/include/be_gpio_defines.h +++ b/tasmota/berry/include/be_gpio_defines.h @@ -73,6 +73,7 @@ const be_const_member_t lv_gpio_constants[] = { { "ETH_PHY_POWER", (int32_t) GPIO_ETH_PHY_POWER }, { "EXS_ENABLE", (int32_t) GPIO_EXS_ENABLE }, { "FALLING", FALLING }, + { "FLOWMETER_SIGNAL", (int32_t) GPIO_FLOWMETER_IN }, { "FTC532", (int32_t) GPIO_FTC532 }, { "GPS_RX", (int32_t) GPIO_GPS_RX }, { "GPS_TX", (int32_t) GPIO_GPS_TX }, diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 473bd8b4a..a36001ac9 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -225,6 +225,7 @@ #define D_JSON_RESETTABLE_TOTAL_ACTIVE "ResetTotalActive" #define D_JSON_SIGNALSTRENGTH "SignalStrength" #define D_JSON_CHIPTEMPERATURE "ChipTemperature" +#define D_JSON_FLOW_UNIT "FLowUnit" #define D_RSLT_ENERGY "ENERGY" #define D_RSLT_HASS_STATE "HASS_STATE" diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 6c7934f76..32b04c81c 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 1e6270266..f36280949 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Грешка" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 941dd24a2..32bcea496 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 9218e9537..c82ea0864 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Neue Adresse" #define D_OUT_OF_RANGE "Außerhalb Bereich" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 67481f5a2..2115df377 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index afa9b3a8f..991b51d60 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -866,6 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index b93135578..e6a61f1af 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Cambiando dirección a" #define D_OUT_OF_RANGE "Fuera de Rango" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Clave Correcta" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 5638233b1..56781aaf5 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Positionner l'adresse à" #define D_OUT_OF_RANGE "Hors limites" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Mot-de-passe vérifié" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erreur" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index fc97068d3..a758a583e 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index dc7be8aa0..043401686 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 04b069358..0eb7d874d 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -913,6 +913,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1056,10 @@ #define D_FP_PASSVERIFY "Jelszó ellenőrizve" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Hiba" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 769f43241..7e7ab8830 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -913,6 +913,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Imposta indirizzo a" #define D_OUT_OF_RANGE "Fuori intervallo" @@ -1054,6 +1056,10 @@ #define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Errore" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 2716feea4..de24ea75e 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index a7a1e383a..d7db56006 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Nieuw adres" #define D_OUT_OF_RANGE "Buiten beriek" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Wachtwoord herkend" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 6bec6b159..9c6532741 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Ustawiam adres na" #define D_OUT_OF_RANGE "Poza zakresem" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Zweryfikowano poprawnie" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Błąd" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 15b574f64..ba1b8d5d4 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "W/h" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Senha verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index b664cf3cf..1ac353e61 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index cb709f185..bc28c0959 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index e45388a22..713dca26f 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "А" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "Вт" #define D_UNIT_WATTHOUR "ВтЧ" #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index d376dc26c..17bc2c417 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index dbd138ff5..28d584288 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index bcb341725..e05adff5b 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index b13930560..8022a2302 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "А" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "Вт" #define D_UNIT_WATTHOUR "Вт/г" #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 0f4e5f563..f04d1196e 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 89ad958ca..d209c207c 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 767df5857..3cf448b2e 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "安培" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "瓦特" #define D_UNIT_WATTHOUR "瓦小時" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/settings.h b/tasmota/settings.h index f8b961527..264b50494 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -351,7 +351,7 @@ typedef union { uint8_t data; struct { uint8_t spare0 : 1; - uint8_t spare1 : 1; + uint8_t flowmeter_unit : 1; // Sensor96 9,x - unit l/min (0) or m³/h (1) uint8_t bh1750_2_resolution : 2; uint8_t bh1750_1_resolution : 2; // Sensor10 1,2,3 uint8_t hx711_json_weight_change : 1; // Sensor34 8,x - Enable JSON message on weight change @@ -779,10 +779,10 @@ typedef struct { uint8_t tcp_config; // F5F uint8_t light_step_pixels; // F60 - uint8_t free_f61[27]; // F61 - Decrement if adding new Setting variables just above and below + uint8_t free_f61[23]; // F61 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below - + uint16_t flowmeter_calibration[2]; // F78 int32_t energy_kWhexport_ph[3]; // F7C uint32_t eth_ipv4_address[5]; // F88 uint32_t energy_kWhtotal; // F9C diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index b576027b3..0a8f428dc 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -187,6 +187,7 @@ enum UserSelectablePins { GPIO_RESET, // Generic reset GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface GPIO_SDIO_CMD, GPIO_SDIO_CLK, GPIO_SDIO_D0, GPIO_SDIO_D1, GPIO_SDIO_D2, GPIO_SDIO_D3, // SD Card SDIO interface, including 1-bit and 4-bit modes + GPIO_FLOWMETER_IN, // Flow Meter Pin GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -418,12 +419,14 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDIO_D1 "|" D_SENSOR_SDIO_D2 "|" D_SENSOR_SDIO_D3 "|" + D_SENSOR_FLOWMETER "|" ; const char kSensorNamesFixed[] PROGMEM = D_SENSOR_USER; #define MAX_MAX31865S 6 +#define MAX_FLOWMETER 2 #define MAX_A4988_MSS 3 #define MAX_WEBCAM_DATA 8 #define MAX_WEBCAM_HSD 3 @@ -973,6 +976,11 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_CM11_TXD), // CM110x Serial interface AGPIO(GPIO_CM11_RXD), // CM110x Serial interface #endif + +#if defined(USE_FLOWMETER) + AGPIO(GPIO_FLOWMETER_IN) + MAX_FLOWMETER, // Flow meter Pin +#endif + /*-------------------------------------------------------------------------------------------*\ * ESP32 specifics \*-------------------------------------------------------------------------------------------*/ diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino new file mode 100644 index 000000000..80478e125 --- /dev/null +++ b/tasmota/xsns_96_flowmeter.ino @@ -0,0 +1,257 @@ +/* + xsns_96_flowmeter.ino - flowmeter support for Tasmota + Up to two flowmeter YF-DN50 and similary supported + (f = 1 Hz up to 5 kHz) + + Copyright (C) 2022 Norbert Richter + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_FLOWMETER + +#define XSNS_96 96 + +#define FLOWMETER_WEIGHT_AVG_SAMPLE 20 // samples +#define FLOWMETER_MIN_FREQ 1 // Hz + +// The Arduino standard GPIO routines are not enough, +// must use some from the Espressif SDK as well +extern "C" { +#include "gpio.h" +} + + +#ifdef USE_WEBSERVER +const char HTTP_SNS_FLOWMETER[] PROGMEM = + "{s}" D_FLOWMETER_NAME "-%d " D_FLOWMETER_RATE "{m}%*_f %s{e}" + ; +#endif // USE_WEBSERVER + + +int32_t flowmeter_period[MAX_FLOWMETER] = {0}; +float flowmeter_period_avg[MAX_FLOWMETER] = {0}; +uint32_t flowmeter_count[MAX_FLOWMETER] = {0}; +volatile uint32_t flowmeter_last_irq[MAX_FLOWMETER] = {0}; + +bool flowmeter_valuesread = false; + + +void IRAM_ATTR FlowMeterIR(uint16_t irq) +{ + uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); + uint32_t time = micros(); + uint32_t i = irq; + if (irq < MAX_FLOWMETER) { + if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[i] = time - flowmeter_last_irq[i]; + } else { + flowmeter_period[i] = 0; + } + flowmeter_valuesread = true; + flowmeter_last_irq[i] = time; + } +} +// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: +void IRAM_ATTR FlowMeter1IR(void) +{ + FlowMeterIR(0); +} +void IRAM_ATTR FlowMeter2IR(void) +{ + FlowMeterIR(1); +} + +void FlowMeterRead(void) +{ + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + if ((micros() - flowmeter_last_irq[i]) >= (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[i] = 0; + flowmeter_period_avg[i] = 0; + } + + // exponentially weighted average + if (flowmeter_count[i] <= FLOWMETER_WEIGHT_AVG_SAMPLE) { + flowmeter_count[i]++; + } + flowmeter_period_avg[i] -= flowmeter_period_avg[i] / flowmeter_count[i]; + flowmeter_period_avg[i] += float(flowmeter_period[i]) / flowmeter_count[i]; + } +} + +void FlowMeterInit(void) +{ + void (* irq_service[MAX_FLOWMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; + + flowmeter_valuesread = false; + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + pinMode(Pin(GPIO_FLOWMETER_IN, i), INPUT); + attachInterrupt(Pin(GPIO_FLOWMETER_IN, i), irq_service[i], RISING); + } +} + +void FlowMeterShow(bool json) +{ + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + float flowmeter_period_float = 0; + float flowmeter_rate_float = 0; + float flowmeter_period_avg_float = 0; + float flowmeter_rate_avg_float = 0; + float flowmeter_factor = 1.0; + float flowmeter_unit_factor = Settings->SensorBits1.flowmeter_unit ? 500 : 8333;; + + if (Settings->flowmeter_calibration[i]) { + flowmeter_factor = (float)Settings->flowmeter_calibration[i] / 1000; + } + + if (flowmeter_period[i]) { + flowmeter_period_float = (float)flowmeter_period[i] / 1000; + flowmeter_period_avg_float = flowmeter_period_avg[i] / 1000; + + flowmeter_rate_float = flowmeter_unit_factor / (float)flowmeter_period[i] * (flowmeter_factor * 1000); + flowmeter_rate_avg_float = flowmeter_unit_factor / flowmeter_period_avg[i] * (flowmeter_factor * 1000); + } + + if (PinUsed(GPIO_FLOWMETER_IN, i)) { + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_PERIOD "\":%*_f,\"" D_JSON_FLOWRATE "\":%*_f}"), + i+1, + Settings->flag2.frequency_resolution, &flowmeter_period_float, + Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float + ); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_FLOWMETER, + i+1, + Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float, + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); +#endif // USE_WEBSERVER + } + } + if (json) { + ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); + } + } +} + + + +/*********************************************************************************************\ + * Supported commands for Sensor96: + * + * Sensor96 - Show current settings + * Sensor96 1 - Set sensor 1 factor (x 1000) - to set to 0.2 enter 'Sensor96 1 200' + * Sensor96 2 - Set sensor 2 factor (x 1000) + * Sensor96 9 0|1 - Show flow value in l/min (0) or m³/h (1) + * + * Flowmeter calibration: + * - get the current displayed flow rate (D) + * - get the current (c) + * - measure the real flow rate (M) + * - new = M / (c * D) + * + * Example: + * - displayed flow rate = 254.39 l/min (D) + * - current = 1.0 (c) + * - real flow rate = 83.42 l/min (M) + * + * new = M / (c * D) = 83.42 / (1 * 254.39) = 0.328 + * Cmd: Sensor96 x 328 +\*********************************************************************************************/ + +bool FlowMeterCommand(void) { + bool show_parms = true; + char argument[XdrvMailbox.data_len]; + + long value = 0; + for (uint32_t ca = 0; ca < XdrvMailbox.data_len; ca++) { + if ((' ' == XdrvMailbox.data[ca]) || ('=' == XdrvMailbox.data[ca])) { XdrvMailbox.data[ca] = ','; } + } + bool any_value = (strchr(XdrvMailbox.data, ',') != nullptr); + if (any_value) { + value = strtol(ArgV(argument, 2), nullptr, 10); + } + + switch (XdrvMailbox.payload) { + case 1: // Calibration value + case 2: // Calibration value + if (any_value) { + Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; + ResponseCmndNumber(value); + show_parms = false; + } + break; + case 9: // Unit + if (any_value) { + Settings->SensorBits1.flowmeter_unit = value & 1; + ResponseCmndNumber(value & 1); + show_parms = false; + } + break; + } + + if (show_parms) { + Response_P(PSTR("{\"Sensor%d\":{"), XSNS_96); + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1.0; + ResponseAppend_P(PSTR("\"" D_JSON_POWERFACTOR "-%d\":%3_f,"), i+1, &flowmeter_factor); + } + ResponseAppend_P(PSTR("\"" D_JSON_FLOW_UNIT "\":\"%s\"}}"), + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); + } + + return true; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns96(uint8_t function) +{ + bool result = false; + + if (PinUsed(GPIO_FLOWMETER_IN, GPIO_ANY)) { + switch (function) { + case FUNC_INIT: + FlowMeterInit(); + break; + case FUNC_EVERY_250_MSECOND: + FlowMeterRead(); + break; + case FUNC_COMMAND_SENSOR: + if (XSNS_96 == XdrvMailbox.index) { + result = FlowMeterCommand(); + } + break; + case FUNC_JSON_APPEND: + FlowMeterShow(true); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + FlowMeterShow(false); + break; +#endif // USE_WEBSERVER + + } + } + return result; +} + +#endif // USE_FLOWMETER diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index 19e517add..f6ded405d 100644 --- a/tools/lv_gpio/lv_gpio_enum.h +++ b/tools/lv_gpio/lv_gpio_enum.h @@ -299,4 +299,6 @@ BL6523_RX = GPIO_BL6523_RX ADE7880_IRQ = GPIO_ADE7880_IRQ RESET = GPIO_RESET +FLOWMETER_SIGNAL = GPIO_FLOWMETER_IN + SENSOR_END = GPIO_SENSOR_END From abc4f74fbcbaa722f11e7ad0c935a1dc7ba5ac43 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Tue, 26 Apr 2022 14:52:26 +0200 Subject: [PATCH 02/13] Refactor flowmeter calc --- tasmota/xsns_96_flowmeter.ino | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 80478e125..1923fb6e9 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -105,30 +105,17 @@ void FlowMeterInit(void) void FlowMeterShow(bool json) { for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_period_float = 0; - float flowmeter_rate_float = 0; - float flowmeter_period_avg_float = 0; float flowmeter_rate_avg_float = 0; - float flowmeter_factor = 1.0; - float flowmeter_unit_factor = Settings->SensorBits1.flowmeter_unit ? 500 : 8333;; - - if (Settings->flowmeter_calibration[i]) { - flowmeter_factor = (float)Settings->flowmeter_calibration[i] / 1000; - } if (flowmeter_period[i]) { - flowmeter_period_float = (float)flowmeter_period[i] / 1000; - flowmeter_period_avg_float = flowmeter_period_avg[i] / 1000; - - flowmeter_rate_float = flowmeter_unit_factor / (float)flowmeter_period[i] * (flowmeter_factor * 1000); - flowmeter_rate_avg_float = flowmeter_unit_factor / flowmeter_period_avg[i] * (flowmeter_factor * 1000); + flowmeter_rate_avg_float = + ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) / flowmeter_period_avg[i] * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); } if (PinUsed(GPIO_FLOWMETER_IN, i)) { if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_PERIOD "\":%*_f,\"" D_JSON_FLOWRATE "\":%*_f}"), + ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_FLOWRATE "\":%*_f}"), i+1, - Settings->flag2.frequency_resolution, &flowmeter_period_float, Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float ); #ifdef USE_WEBSERVER @@ -141,11 +128,11 @@ void FlowMeterShow(bool json) #endif // USE_WEBSERVER } } - if (json) { - ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE - ); - } + } + if (json) { + ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); } } From fb796187c2baba3843b61e12d3e758d7dfadda9b Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:20:30 +0200 Subject: [PATCH 03/13] Flowmeter integration --- BUILDS.md | 1 + tasmota/my_user_config.h | 2 ++ tasmota/support_features.ino | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/BUILDS.md b/BUILDS.md index 44b82d93a..4b3681d80 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -216,6 +216,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_HRE | - | - / x | - | x | - | - | | USE_A4988_STEPPER | - | - / - | - | - | - | - | | USE_NEOPOOL | - | - / - | - | - | - | - | +| USE_FLOWMETER | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_DISPLAY | - | - / - | - | - | - | x | diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 6a197c5d5..3fdeca42c 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -948,6 +948,8 @@ //#define USE_NEOPOOL // Add support for Sugar Valley NeoPool Controller - also known under brands Hidrolife, Aquascenic, Oxilife, Bionet, Hidroniser, UVScenic, Station, Brilix, Bayrol and Hay (+6k flash, +60 mem) // #define NEOPOOL_MODBUS_ADDRESS 1 // Any modbus address +//#define FLOWMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) + // -- Thermostat control ---------------------------- //#define USE_THERMOSTAT // Add support for Thermostat #define THERMOSTAT_CONTROLLER_OUTPUTS 1 // Number of outputs to be controlled independently diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index c2e6535c7..b1ac73281 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -806,7 +806,9 @@ void ResponseAppendFeatures(void) #ifdef USE_IMPROV feature8 |= 0x04000000; // xdrv_62_improv.ino #endif -// feature8 |= 0x08000000; +#ifdef USE_FLOWMETER + feature8 |= 0x08000000; // nsns_96_flowmeter.ino +#endif // feature8 |= 0x10000000; // feature8 |= 0x20000000; From 732359a885be6261120e3d3f32af4b54c5169a77 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:22:46 +0200 Subject: [PATCH 04/13] Refactor ISR --- tasmota/xsns_96_flowmeter.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 1923fb6e9..2bfd21845 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -50,18 +50,18 @@ bool flowmeter_valuesread = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { - uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); - GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); uint32_t time = micros(); - uint32_t i = irq; + // uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); + // GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); + // uint32_t i = irq; if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[i] = time - flowmeter_last_irq[i]; + if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[irq] = time - flowmeter_last_irq[irq]; } else { - flowmeter_period[i] = 0; + flowmeter_period[irq] = 0; } flowmeter_valuesread = true; - flowmeter_last_irq[i] = time; + flowmeter_last_irq[irq] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: From f192284660d4c42ac32544e2c41c4e4bef0e984c Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:23:27 +0200 Subject: [PATCH 05/13] Refactor Sensor cmnd --- tasmota/xsns_96_flowmeter.ino | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 2bfd21845..13df5a0a8 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -142,9 +142,9 @@ void FlowMeterShow(bool json) * Supported commands for Sensor96: * * Sensor96 - Show current settings + * Sensor96 0 0|1 - Show flow value in l/min (0) or m³/h (1) * Sensor96 1 - Set sensor 1 factor (x 1000) - to set to 0.2 enter 'Sensor96 1 200' * Sensor96 2 - Set sensor 2 factor (x 1000) - * Sensor96 9 0|1 - Show flow value in l/min (0) or m³/h (1) * * Flowmeter calibration: * - get the current displayed flow rate (D) @@ -175,21 +175,21 @@ bool FlowMeterCommand(void) { } switch (XdrvMailbox.payload) { - case 1: // Calibration value - case 2: // Calibration value - if (any_value) { - Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; - ResponseCmndNumber(value); - show_parms = false; - } - break; - case 9: // Unit + case 0: // Unit if (any_value) { Settings->SensorBits1.flowmeter_unit = value & 1; ResponseCmndNumber(value & 1); show_parms = false; } break; + case 1: // Sensor calibration value + case 2: + if (any_value) { + Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; + ResponseCmndNumber(value); + show_parms = false; + } + break; } if (show_parms) { From 96a36b7bdb85b1e92e48784740653f68b0897ee4 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:28:01 +0200 Subject: [PATCH 06/13] Revert "Refactor ISR" This reverts commit 9033ada3c70c6214770de05c573139c90e08678f. --- tasmota/xsns_96_flowmeter.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 13df5a0a8..f30feb7f7 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -50,18 +50,18 @@ bool flowmeter_valuesread = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { + uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); uint32_t time = micros(); - // uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); - // GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); - // uint32_t i = irq; + uint32_t i = irq; if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[irq] = time - flowmeter_last_irq[irq]; + if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[i] = time - flowmeter_last_irq[i]; } else { - flowmeter_period[irq] = 0; + flowmeter_period[i] = 0; } flowmeter_valuesread = true; - flowmeter_last_irq[irq] = time; + flowmeter_last_irq[i] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: From 52757cb8a4ac0ab07c3fb123bc7cf608135bd1df Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:32:09 +0200 Subject: [PATCH 07/13] Refactor ISR --- tasmota/xsns_96_flowmeter.ino | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index f30feb7f7..f57675b6e 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -51,17 +51,16 @@ bool flowmeter_valuesread = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); - GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); uint32_t time = micros(); - uint32_t i = irq; + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[i] = time - flowmeter_last_irq[i]; + if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[irq] = time - flowmeter_last_irq[irq]; } else { - flowmeter_period[i] = 0; + flowmeter_period[irq] = 0; } flowmeter_valuesread = true; - flowmeter_last_irq[i] = time; + flowmeter_last_irq[irq] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: From ff3adb9bf03347a7a40a4350786a50aa48705fb6 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 14:03:05 +0200 Subject: [PATCH 08/13] Add flow rate value source type --- tasmota/i18n.h | 1 - tasmota/xsns_96_flowmeter.ino | 60 +++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index a36001ac9..473bd8b4a 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -225,7 +225,6 @@ #define D_JSON_RESETTABLE_TOTAL_ACTIVE "ResetTotalActive" #define D_JSON_SIGNALSTRENGTH "SignalStrength" #define D_JSON_CHIPTEMPERATURE "ChipTemperature" -#define D_JSON_FLOW_UNIT "FLowUnit" #define D_RSLT_ENERGY "ENERGY" #define D_RSLT_HASS_STATE "HASS_STATE" diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index f57675b6e..67c755dda 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -2,6 +2,7 @@ xsns_96_flowmeter.ino - flowmeter support for Tasmota Up to two flowmeter YF-DN50 and similary supported (f = 1 Hz up to 5 kHz) + Uses the FreqRes resolution Copyright (C) 2022 Norbert Richter @@ -21,17 +22,22 @@ #ifdef USE_FLOWMETER +// The Arduino standard GPIO routines are not enough, +// must use some from the Espressif SDK as well +// extern "C" { +// #include "gpio.h" +// } + #define XSNS_96 96 #define FLOWMETER_WEIGHT_AVG_SAMPLE 20 // samples #define FLOWMETER_MIN_FREQ 1 // Hz -// The Arduino standard GPIO routines are not enough, -// must use some from the Espressif SDK as well -extern "C" { -#include "gpio.h" -} - +#define D_JSON_FLOWMETER_RATE "Rate" +#define D_JSON_FLOWMETER_VALUE "Value" +#define D_JSON_FLOWMETER_UNIT "Unit" +#define D_JSON_FLOWMETER_VALUE_AVG "average" +#define D_JSON_FLOWMETER_VALUE_RAW "raw" #ifdef USE_WEBSERVER const char HTTP_SNS_FLOWMETER[] PROGMEM = @@ -46,7 +52,7 @@ uint32_t flowmeter_count[MAX_FLOWMETER] = {0}; volatile uint32_t flowmeter_last_irq[MAX_FLOWMETER] = {0}; bool flowmeter_valuesread = false; - +bool flowmeter_raw_value = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { @@ -63,7 +69,7 @@ void IRAM_ATTR FlowMeterIR(uint16_t irq) flowmeter_last_irq[irq] = time; } } -// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: +// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way void IRAM_ATTR FlowMeter1IR(void) { FlowMeterIR(0); @@ -103,20 +109,27 @@ void FlowMeterInit(void) void FlowMeterShow(bool json) { + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "\":{\"" D_JSON_FLOWMETER_RATE "\":[")); + } + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { float flowmeter_rate_avg_float = 0; if (flowmeter_period[i]) { flowmeter_rate_avg_float = - ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) / flowmeter_period_avg[i] * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); + ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) + / (flowmeter_raw_value ? flowmeter_period[i] : flowmeter_period_avg[i]) + * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); } if (PinUsed(GPIO_FLOWMETER_IN, i)) { if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_FLOWRATE "\":%*_f}"), - i+1, + ResponseAppend_P(PSTR("%s%*_f"), + i ? PSTR(",") : PSTR(""), Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float ); + #ifdef USE_WEBSERVER } else { WSContentSend_PD(HTTP_SNS_FLOWMETER, @@ -125,11 +138,15 @@ void FlowMeterShow(bool json) Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); #endif // USE_WEBSERVER + } } } if (json) { - ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), + flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}"), Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } @@ -144,6 +161,7 @@ void FlowMeterShow(bool json) * Sensor96 0 0|1 - Show flow value in l/min (0) or m³/h (1) * Sensor96 1 - Set sensor 1 factor (x 1000) - to set to 0.2 enter 'Sensor96 1 200' * Sensor96 2 - Set sensor 2 factor (x 1000) + * Sensor96 9 0|1 - Value mode: Switch between displaying avg(0) / raw(1) readings (not permanently) * * Flowmeter calibration: * - get the current displayed flow rate (D) @@ -189,15 +207,25 @@ bool FlowMeterCommand(void) { show_parms = false; } break; + case 9: // avg/raw values + if (any_value) { + flowmeter_raw_value = value & 1; + ResponseCmndNumber(value & 1); + show_parms = false; + } + break; } if (show_parms) { - Response_P(PSTR("{\"Sensor%d\":{"), XSNS_96); + Response_P(PSTR("{\"Sensor%d\":{\"" D_JSON_POWERFACTOR "\":["), XSNS_96); for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1.0; - ResponseAppend_P(PSTR("\"" D_JSON_POWERFACTOR "-%d\":%3_f,"), i+1, &flowmeter_factor); + float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1; + ResponseAppend_P(PSTR("%s%3_f"), i ? PSTR(",") : PSTR(""), &flowmeter_factor); } - ResponseAppend_P(PSTR("\"" D_JSON_FLOW_UNIT "\":\"%s\"}}"), + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), + flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}}"), Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } From b1933f7c0e695ebf0f6e6819e717c87b7037e24e Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 16:49:16 +0200 Subject: [PATCH 09/13] Rename flowratemeter --- BUILDS.md | 2 +- CHANGELOG.md | 2 +- tasmota/berry/include/be_gpio_defines.h | 2 +- tasmota/language/af_AF.h | 7 +- tasmota/language/bg_BG.h | 7 +- tasmota/language/cs_CZ.h | 7 +- tasmota/language/de_DE.h | 7 +- tasmota/language/el_GR.h | 7 +- tasmota/language/en_GB.h | 7 +- tasmota/language/es_ES.h | 7 +- tasmota/language/fr_FR.h | 7 +- tasmota/language/fy_NL.h | 7 +- tasmota/language/he_HE.h | 7 +- tasmota/language/hu_HU.h | 5 +- tasmota/language/it_IT.h | 5 +- tasmota/language/ko_KO.h | 7 +- tasmota/language/nl_NL.h | 7 +- tasmota/language/pl_PL.h | 7 +- tasmota/language/pt_BR.h | 7 +- tasmota/language/pt_PT.h | 7 +- tasmota/language/ro_RO.h | 7 +- tasmota/language/ru_RU.h | 7 +- tasmota/language/sk_SK.h | 7 +- tasmota/language/sv_SE.h | 7 +- tasmota/language/tr_TR.h | 7 +- tasmota/language/uk_UA.h | 7 +- tasmota/language/vi_VN.h | 7 +- tasmota/language/zh_CN.h | 7 +- tasmota/language/zh_TW.h | 7 +- tasmota/my_user_config.h | 2 +- tasmota/settings.h | 4 +- tasmota/support_features.ino | 4 +- tasmota/tasmota_template.h | 10 +- ...lowmeter.ino => xsns_96_flowratemeter.ino} | 140 +++++++++--------- tools/lv_gpio/lv_gpio_enum.h | 2 +- 35 files changed, 161 insertions(+), 185 deletions(-) rename tasmota/{xsns_96_flowmeter.ino => xsns_96_flowratemeter.ino} (52%) diff --git a/BUILDS.md b/BUILDS.md index 4b3681d80..c3d70ad51 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -216,7 +216,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_HRE | - | - / x | - | x | - | - | | USE_A4988_STEPPER | - | - / - | - | - | - | - | | USE_NEOPOOL | - | - / - | - | - | - | - | -| USE_FLOWMETER | - | - / - | - | - | - | - | +| USE_FLOWRATEMETER | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_DISPLAY | - | - / - | - | - | - | x | diff --git a/CHANGELOG.md b/CHANGELOG.md index a74756c3a..deb2e5f28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) -- Support for flow meter +- Support for flowrate meters like YF-DN50 and similary ### Changed diff --git a/tasmota/berry/include/be_gpio_defines.h b/tasmota/berry/include/be_gpio_defines.h index b6431945f..6b66aace8 100644 --- a/tasmota/berry/include/be_gpio_defines.h +++ b/tasmota/berry/include/be_gpio_defines.h @@ -73,7 +73,7 @@ const be_const_member_t lv_gpio_constants[] = { { "ETH_PHY_POWER", (int32_t) GPIO_ETH_PHY_POWER }, { "EXS_ENABLE", (int32_t) GPIO_EXS_ENABLE }, { "FALLING", FALLING }, - { "FLOWMETER_SIGNAL", (int32_t) GPIO_FLOWMETER_IN }, + { "FLOWRATEMETER_SIGNAL", (int32_t) GPIO_FLOWRATEMETER_IN }, { "FTC532", (int32_t) GPIO_FTC532 }, { "GPS_RX", (int32_t) GPIO_GPS_RX }, { "GPS_TX", (int32_t) GPIO_GPS_TX }, diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 32b04c81c..e421316cc 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowmeter" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index f36280949..0e3a49ac0 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Грешка" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 32bcea496..69d11e2d8 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index c82ea0864..2581479ef 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Durchflussmesser" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 2115df377..2586f53fd 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 991b51d60..750e68227 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index e6a61f1af..30fc163f9 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Clave Correcta" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 56781aaf5..387bb189f 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Mot-de-passe vérifié" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erreur" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index a758a583e..3526a45e0 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 043401686..f0af2f18b 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 0eb7d874d..c93e4f809 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -1056,9 +1056,8 @@ #define D_FP_PASSVERIFY "Jelszó ellenőrizve" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Hiba" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 7e7ab8830..9197025a6 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -1056,9 +1056,8 @@ #define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Errore" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index de24ea75e..f2182dde3 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index d7db56006..5b13fe1eb 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Wachtwoord herkend" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 9c6532741..c46c699ee 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Zweryfikowano poprawnie" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Błąd" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index ba1b8d5d4..1b05ad513 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Senha verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 1ac353e61..c5200a61d 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index bc28c0959..095f2a777 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 713dca26f..66b3ded98 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "А" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 17bc2c417..2205db29e 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 28d584288..6727802c7 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index e05adff5b..7e0782f36 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 8022a2302..0d9238bc7 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "А" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index f04d1196e..98194eae9 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index d209c207c..d8631eee4 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 3cf448b2e..81616bcfc 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "安培" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 3fdeca42c..47dfef80b 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -948,7 +948,7 @@ //#define USE_NEOPOOL // Add support for Sugar Valley NeoPool Controller - also known under brands Hidrolife, Aquascenic, Oxilife, Bionet, Hidroniser, UVScenic, Station, Brilix, Bayrol and Hay (+6k flash, +60 mem) // #define NEOPOOL_MODBUS_ADDRESS 1 // Any modbus address -//#define FLOWMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) +//#define FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) // -- Thermostat control ---------------------------- //#define USE_THERMOSTAT // Add support for Thermostat diff --git a/tasmota/settings.h b/tasmota/settings.h index 264b50494..8a302ad55 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -351,7 +351,7 @@ typedef union { uint8_t data; struct { uint8_t spare0 : 1; - uint8_t flowmeter_unit : 1; // Sensor96 9,x - unit l/min (0) or m³/h (1) + uint8_t flowratemeter_unit : 1; // Sensor96 9,x - unit l/min (0) or m³/h (1) uint8_t bh1750_2_resolution : 2; uint8_t bh1750_1_resolution : 2; // Sensor10 1,2,3 uint8_t hx711_json_weight_change : 1; // Sensor34 8,x - Enable JSON message on weight change @@ -782,7 +782,7 @@ typedef struct { uint8_t free_f61[23]; // F61 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below - uint16_t flowmeter_calibration[2]; // F78 + uint16_t flowratemeter_calibration[2];// F78 int32_t energy_kWhexport_ph[3]; // F7C uint32_t eth_ipv4_address[5]; // F88 uint32_t energy_kWhtotal; // F9C diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index b1ac73281..bf3b17011 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -806,8 +806,8 @@ void ResponseAppendFeatures(void) #ifdef USE_IMPROV feature8 |= 0x04000000; // xdrv_62_improv.ino #endif -#ifdef USE_FLOWMETER - feature8 |= 0x08000000; // nsns_96_flowmeter.ino +#ifdef USE_FLOWRATEMETER + feature8 |= 0x08000000; // xsns_96_flowratemeter.ino #endif // feature8 |= 0x10000000; diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 0a8f428dc..5c6fa8237 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -187,7 +187,7 @@ enum UserSelectablePins { GPIO_RESET, // Generic reset GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface GPIO_SDIO_CMD, GPIO_SDIO_CLK, GPIO_SDIO_D0, GPIO_SDIO_D1, GPIO_SDIO_D2, GPIO_SDIO_D3, // SD Card SDIO interface, including 1-bit and 4-bit modes - GPIO_FLOWMETER_IN, // Flow Meter Pin + GPIO_FLOWRATEMETER_IN, // Flowrate Meter GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -419,14 +419,14 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDIO_D1 "|" D_SENSOR_SDIO_D2 "|" D_SENSOR_SDIO_D3 "|" - D_SENSOR_FLOWMETER "|" + D_SENSOR_FLOWRATEMETER "|" ; const char kSensorNamesFixed[] PROGMEM = D_SENSOR_USER; #define MAX_MAX31865S 6 -#define MAX_FLOWMETER 2 +#define MAX_FLOWRATEMETER 2 #define MAX_A4988_MSS 3 #define MAX_WEBCAM_DATA 8 #define MAX_WEBCAM_HSD 3 @@ -977,8 +977,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_CM11_RXD), // CM110x Serial interface #endif -#if defined(USE_FLOWMETER) - AGPIO(GPIO_FLOWMETER_IN) + MAX_FLOWMETER, // Flow meter Pin +#if defined(USE_FLOWRATEMETER) + AGPIO(GPIO_FLOWRATEMETER_IN) + MAX_FLOWRATEMETER, // Flow meter Pin #endif /*-------------------------------------------------------------------------------------------*\ diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowratemeter.ino similarity index 52% rename from tasmota/xsns_96_flowmeter.ino rename to tasmota/xsns_96_flowratemeter.ino index 67c755dda..b2ff90cab 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowratemeter.ino @@ -1,8 +1,8 @@ /* - xsns_96_flowmeter.ino - flowmeter support for Tasmota - Up to two flowmeter YF-DN50 and similary supported - (f = 1 Hz up to 5 kHz) - Uses the FreqRes resolution + xsns_96_flowratemeter.ino - flowratemeter support for Tasmota + - up to two flowratemeter YF-DN50 and similary + - flow rate frequencies f = 1 Hz up to 5 kHz + - uses the FreqRes resolution Copyright (C) 2022 Norbert Richter @@ -20,7 +20,7 @@ along with this program. If not, see . */ -#ifdef USE_FLOWMETER +#ifdef USE_FLOWRATEMETER // The Arduino standard GPIO routines are not enough, // must use some from the Espressif SDK as well @@ -30,43 +30,45 @@ #define XSNS_96 96 -#define FLOWMETER_WEIGHT_AVG_SAMPLE 20 // samples -#define FLOWMETER_MIN_FREQ 1 // Hz +#define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // samples +#define FLOWRATEMETER_MIN_FREQ 1 // Hz -#define D_JSON_FLOWMETER_RATE "Rate" -#define D_JSON_FLOWMETER_VALUE "Value" -#define D_JSON_FLOWMETER_UNIT "Unit" -#define D_JSON_FLOWMETER_VALUE_AVG "average" -#define D_JSON_FLOWMETER_VALUE_RAW "raw" +#define D_JSON_FLOWRATEMETER_RATE "Rate" +#define D_JSON_FLOWRATEMETER_VALUE "Value" +#define D_JSON_FLOWRATEMETER_UNIT "Unit" +#define D_JSON_FLOWRATEMETER_VALUE_AVG "average" +#define D_JSON_FLOWRATEMETER_VALUE_RAW "raw" #ifdef USE_WEBSERVER -const char HTTP_SNS_FLOWMETER[] PROGMEM = - "{s}" D_FLOWMETER_NAME "-%d " D_FLOWMETER_RATE "{m}%*_f %s{e}" +const char HTTP_SNS_FLOWRATEMETER[] PROGMEM = + "{s}" D_FLOWRATEMETER_NAME "-%d{m}%*_f %s{e}" ; #endif // USE_WEBSERVER -int32_t flowmeter_period[MAX_FLOWMETER] = {0}; -float flowmeter_period_avg[MAX_FLOWMETER] = {0}; -uint32_t flowmeter_count[MAX_FLOWMETER] = {0}; -volatile uint32_t flowmeter_last_irq[MAX_FLOWMETER] = {0}; +int32_t flowratemeter_period[MAX_FLOWRATEMETER] = {0}; +float flowratemeter_period_avg[MAX_FLOWRATEMETER] = {0}; +uint32_t flowratemeter_count[MAX_FLOWRATEMETER] = {0}; +volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {0}; -bool flowmeter_valuesread = false; -bool flowmeter_raw_value = false; +bool flowratemeter_valuesread = false; +bool flowratemeter_raw_value = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { - uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); uint32_t time = micros(); +#if defined(ESP8266) + uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); - if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[irq] = time - flowmeter_last_irq[irq]; +#endif + if (irq < MAX_FLOWRATEMETER) { + if ((time - flowratemeter_last_irq[irq]) < (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period[irq] = time - flowratemeter_last_irq[irq]; } else { - flowmeter_period[irq] = 0; + flowratemeter_period[irq] = 0; } - flowmeter_valuesread = true; - flowmeter_last_irq[irq] = time; + flowratemeter_valuesread = true; + flowratemeter_last_irq[irq] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way @@ -81,61 +83,61 @@ void IRAM_ATTR FlowMeter2IR(void) void FlowMeterRead(void) { - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - if ((micros() - flowmeter_last_irq[i]) >= (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[i] = 0; - flowmeter_period_avg[i] = 0; + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if ((micros() - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period[i] = 0; + flowratemeter_period_avg[i] = 0; } // exponentially weighted average - if (flowmeter_count[i] <= FLOWMETER_WEIGHT_AVG_SAMPLE) { - flowmeter_count[i]++; + if (flowratemeter_count[i] <= FLOWRATEMETER_WEIGHT_AVG_SAMPLE) { + flowratemeter_count[i]++; } - flowmeter_period_avg[i] -= flowmeter_period_avg[i] / flowmeter_count[i]; - flowmeter_period_avg[i] += float(flowmeter_period[i]) / flowmeter_count[i]; + flowratemeter_period_avg[i] -= flowratemeter_period_avg[i] / flowratemeter_count[i]; + flowratemeter_period_avg[i] += float(flowratemeter_period[i]) / flowratemeter_count[i]; } } void FlowMeterInit(void) { - void (* irq_service[MAX_FLOWMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; + void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; - flowmeter_valuesread = false; - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - pinMode(Pin(GPIO_FLOWMETER_IN, i), INPUT); - attachInterrupt(Pin(GPIO_FLOWMETER_IN, i), irq_service[i], RISING); + flowratemeter_valuesread = false; + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + pinMode(Pin(GPIO_FLOWRATEMETER_IN, i), INPUT); + attachInterrupt(Pin(GPIO_FLOWRATEMETER_IN, i), irq_service[i], RISING); } } void FlowMeterShow(bool json) { if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "\":{\"" D_JSON_FLOWMETER_RATE "\":[")); + ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":[")); } - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_rate_avg_float = 0; + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + float flowratemeter_rate_avg_float = 0; - if (flowmeter_period[i]) { - flowmeter_rate_avg_float = - ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) - / (flowmeter_raw_value ? flowmeter_period[i] : flowmeter_period_avg[i]) - * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); + if (flowratemeter_period[i]) { + flowratemeter_rate_avg_float = + ((Settings->SensorBits1.flowratemeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) + / (flowratemeter_raw_value ? flowratemeter_period[i] : flowratemeter_period_avg[i]) + * (Settings->flowratemeter_calibration[i] ? (float)Settings->flowratemeter_calibration[i] : 1000.0); } - if (PinUsed(GPIO_FLOWMETER_IN, i)) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { if (json) { ResponseAppend_P(PSTR("%s%*_f"), i ? PSTR(",") : PSTR(""), - Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float + Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float ); #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_FLOWMETER, + WSContentSend_PD(HTTP_SNS_FLOWRATEMETER, i+1, - Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float, - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float, + Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); #endif // USE_WEBSERVER @@ -143,11 +145,11 @@ void FlowMeterShow(bool json) } } if (json) { - ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), - flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), + flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); - ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}"), - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), + Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } } @@ -194,7 +196,7 @@ bool FlowMeterCommand(void) { switch (XdrvMailbox.payload) { case 0: // Unit if (any_value) { - Settings->SensorBits1.flowmeter_unit = value & 1; + Settings->SensorBits1.flowratemeter_unit = value & 1; ResponseCmndNumber(value & 1); show_parms = false; } @@ -202,14 +204,14 @@ bool FlowMeterCommand(void) { case 1: // Sensor calibration value case 2: if (any_value) { - Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; + Settings->flowratemeter_calibration[XdrvMailbox.payload - 1] = value; ResponseCmndNumber(value); show_parms = false; } break; case 9: // avg/raw values if (any_value) { - flowmeter_raw_value = value & 1; + flowratemeter_raw_value = value & 1; ResponseCmndNumber(value & 1); show_parms = false; } @@ -218,15 +220,15 @@ bool FlowMeterCommand(void) { if (show_parms) { Response_P(PSTR("{\"Sensor%d\":{\"" D_JSON_POWERFACTOR "\":["), XSNS_96); - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1; - ResponseAppend_P(PSTR("%s%3_f"), i ? PSTR(",") : PSTR(""), &flowmeter_factor); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + float flowratemeter_factor = Settings->flowratemeter_calibration[i] ? (float)Settings->flowratemeter_calibration[i] / 1000 : 1; + ResponseAppend_P(PSTR("%s%3_f"), i ? PSTR(",") : PSTR(""), &flowratemeter_factor); } - ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), - flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), + flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); - ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}}"), - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}}"), + Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } @@ -241,7 +243,7 @@ bool Xsns96(uint8_t function) { bool result = false; - if (PinUsed(GPIO_FLOWMETER_IN, GPIO_ANY)) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, GPIO_ANY)) { switch (function) { case FUNC_INIT: FlowMeterInit(); @@ -268,4 +270,4 @@ bool Xsns96(uint8_t function) return result; } -#endif // USE_FLOWMETER +#endif // USE_FLOWRATEMETER diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index f6ded405d..cea920168 100644 --- a/tools/lv_gpio/lv_gpio_enum.h +++ b/tools/lv_gpio/lv_gpio_enum.h @@ -299,6 +299,6 @@ BL6523_RX = GPIO_BL6523_RX ADE7880_IRQ = GPIO_ADE7880_IRQ RESET = GPIO_RESET -FLOWMETER_SIGNAL = GPIO_FLOWMETER_IN +FLOWRATEMETER_SIGNAL = GPIO_FLOWRATEMETER_IN SENSOR_END = GPIO_SENSOR_END From b5a0c5ca79f50e0fc29daa9e77e4ae73f357564c Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:23:34 +0200 Subject: [PATCH 10/13] Fix missing lang definition --- tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + 2 files changed, 2 insertions(+) diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index c93e4f809..fd862bbc8 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -866,6 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 9197025a6..b19f68536 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -866,6 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 - SER" #define D_SENSOR_CM11_TX "CM110x - TX" #define D_SENSOR_CM11_RX "CM110x - RX" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" From 8d9c945ceee82ad090a23d3aa8f7c95c21090df7 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:25:20 +0200 Subject: [PATCH 11/13] Refactor string const --- tasmota/xsns_96_flowratemeter.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xsns_96_flowratemeter.ino b/tasmota/xsns_96_flowratemeter.ino index b2ff90cab..010b21885 100644 --- a/tasmota/xsns_96_flowratemeter.ino +++ b/tasmota/xsns_96_flowratemeter.ino @@ -149,7 +149,7 @@ void FlowMeterShow(bool json) flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), - Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) ); } } @@ -228,7 +228,7 @@ bool FlowMeterCommand(void) { flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}}"), - Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) ); } From 8857698bc7bddf3063a5d40a85df8b8e09b50372 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:32:52 +0200 Subject: [PATCH 12/13] Update module consumtion --- tasmota/my_user_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 47dfef80b..a3344e41f 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -948,7 +948,7 @@ //#define USE_NEOPOOL // Add support for Sugar Valley NeoPool Controller - also known under brands Hidrolife, Aquascenic, Oxilife, Bionet, Hidroniser, UVScenic, Station, Brilix, Bayrol and Hay (+6k flash, +60 mem) // #define NEOPOOL_MODBUS_ADDRESS 1 // Any modbus address -//#define FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) +//#define FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k7 code) // -- Thermostat control ---------------------------- //#define USE_THERMOSTAT // Add support for Thermostat From 0ae8bfe2eb603886056c2238b02e2902349884bf Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:50:41 +0200 Subject: [PATCH 13/13] Refactor names --- tasmota/xsns_96_flowratemeter.ino | 49 ++++++++++++++----------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/tasmota/xsns_96_flowratemeter.ino b/tasmota/xsns_96_flowratemeter.ino index 010b21885..1b727dba0 100644 --- a/tasmota/xsns_96_flowratemeter.ino +++ b/tasmota/xsns_96_flowratemeter.ino @@ -22,15 +22,11 @@ #ifdef USE_FLOWRATEMETER -// The Arduino standard GPIO routines are not enough, -// must use some from the Espressif SDK as well -// extern "C" { -// #include "gpio.h" -// } - #define XSNS_96 96 -#define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // samples + + +#define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // number of samples for smooth weigted average #define FLOWRATEMETER_MIN_FREQ 1 // Hz #define D_JSON_FLOWRATEMETER_RATE "Rate" @@ -39,6 +35,8 @@ #define D_JSON_FLOWRATEMETER_VALUE_AVG "average" #define D_JSON_FLOWRATEMETER_VALUE_RAW "raw" + + #ifdef USE_WEBSERVER const char HTTP_SNS_FLOWRATEMETER[] PROGMEM = "{s}" D_FLOWRATEMETER_NAME "-%d{m}%*_f %s{e}" @@ -54,7 +52,9 @@ volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {0}; bool flowratemeter_valuesread = false; bool flowratemeter_raw_value = false; -void IRAM_ATTR FlowMeterIR(uint16_t irq) + + +void IRAM_ATTR FlowRateMeterIR(uint16_t irq) { uint32_t time = micros(); #if defined(ESP8266) @@ -72,16 +72,16 @@ void IRAM_ATTR FlowMeterIR(uint16_t irq) } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way -void IRAM_ATTR FlowMeter1IR(void) +void IRAM_ATTR FlowRateMeter1IR(void) { - FlowMeterIR(0); + FlowRateMeterIR(0); } -void IRAM_ATTR FlowMeter2IR(void) +void IRAM_ATTR FlowRateMeter2IR(void) { - FlowMeterIR(1); + FlowRateMeterIR(1); } -void FlowMeterRead(void) +void FlowRateMeterRead(void) { for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if ((micros() - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { @@ -98,9 +98,9 @@ void FlowMeterRead(void) } } -void FlowMeterInit(void) +void FlowRateMeterInit(void) { - void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; + void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowRateMeter1IR, FlowRateMeter2IR}; flowratemeter_valuesread = false; for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { @@ -109,7 +109,7 @@ void FlowMeterInit(void) } } -void FlowMeterShow(bool json) +void FlowRateMeterShow(bool json) { if (json) { ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":[")); @@ -140,7 +140,6 @@ void FlowMeterShow(bool json) Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); #endif // USE_WEBSERVER - } } } @@ -154,8 +153,6 @@ void FlowMeterShow(bool json) } } - - /*********************************************************************************************\ * Supported commands for Sensor96: * @@ -179,8 +176,7 @@ void FlowMeterShow(bool json) * new = M / (c * D) = 83.42 / (1 * 254.39) = 0.328 * Cmd: Sensor96 x 328 \*********************************************************************************************/ - -bool FlowMeterCommand(void) { +bool FlowRateMeterCommand(void) { bool show_parms = true; char argument[XdrvMailbox.data_len]; @@ -246,25 +242,24 @@ bool Xsns96(uint8_t function) if (PinUsed(GPIO_FLOWRATEMETER_IN, GPIO_ANY)) { switch (function) { case FUNC_INIT: - FlowMeterInit(); + FlowRateMeterInit(); break; case FUNC_EVERY_250_MSECOND: - FlowMeterRead(); + FlowRateMeterRead(); break; case FUNC_COMMAND_SENSOR: if (XSNS_96 == XdrvMailbox.index) { - result = FlowMeterCommand(); + result = FlowRateMeterCommand(); } break; case FUNC_JSON_APPEND: - FlowMeterShow(true); + FlowRateMeterShow(true); break; #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: - FlowMeterShow(false); + FlowRateMeterShow(false); break; #endif // USE_WEBSERVER - } } return result;