diff --git a/BUILDS.md b/BUILDS.md index 44b82d93a..c3d70ad51 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_FLOWRATEMETER | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_DISPLAY | - | - / - | - | - | - | x | diff --git a/CHANGELOG.md b/CHANGELOG.md index b4fafaadc..deb2e5f28 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 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 ec2271073..6b66aace8 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 }, + { "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 6c7934f76..e421316cc 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowmeter" + // 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..0e3a49ac0 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Грешка" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..69d11e2d8 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..2581479ef 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Durchflussmesser" + // 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..2586f53fd 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..750e68227 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..30fc163f9 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Clave Correcta" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..387bb189f 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Mot-de-passe vérifié" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erreur" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..3526a45e0 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..f0af2f18b 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..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" @@ -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,9 @@ #define D_FP_PASSVERIFY "Jelszó ellenőrizve" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Hiba" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..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" @@ -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 "Imposta indirizzo a" #define D_OUT_OF_RANGE "Fuori intervallo" @@ -1054,6 +1057,9 @@ #define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Errore" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..f2182dde3 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..5b13fe1eb 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Wachtwoord herkend" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..c46c699ee 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Zweryfikowano poprawnie" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Błąd" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..1b05ad513 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Senha verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..c5200a61d 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..095f2a777 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..66b3ded98 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..2205db29e 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..6727802c7 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..7e0782f36 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..0d9238bc7 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..98194eae9 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..d8631eee4 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // 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..81616bcfc 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_FLOWRATEMETER "Flowrate" // 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,9 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 6a197c5d5..a3344e41f 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 FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k7 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/settings.h b/tasmota/settings.h index f8b961527..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 spare1 : 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 @@ -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 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 c2e6535c7..bf3b17011 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_FLOWRATEMETER + feature8 |= 0x08000000; // xsns_96_flowratemeter.ino +#endif // feature8 |= 0x10000000; // feature8 |= 0x20000000; diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index b576027b3..5c6fa8237 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_FLOWRATEMETER_IN, // Flowrate Meter 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_FLOWRATEMETER "|" ; const char kSensorNamesFixed[] PROGMEM = D_SENSOR_USER; #define MAX_MAX31865S 6 +#define MAX_FLOWRATEMETER 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_FLOWRATEMETER) + AGPIO(GPIO_FLOWRATEMETER_IN) + MAX_FLOWRATEMETER, // Flow meter Pin +#endif + /*-------------------------------------------------------------------------------------------*\ * ESP32 specifics \*-------------------------------------------------------------------------------------------*/ diff --git a/tasmota/xsns_96_flowratemeter.ino b/tasmota/xsns_96_flowratemeter.ino new file mode 100644 index 000000000..1b727dba0 --- /dev/null +++ b/tasmota/xsns_96_flowratemeter.ino @@ -0,0 +1,268 @@ +/* + 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 + + 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_FLOWRATEMETER + +#define XSNS_96 96 + + + +#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" +#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_FLOWRATEMETER[] PROGMEM = + "{s}" D_FLOWRATEMETER_NAME "-%d{m}%*_f %s{e}" + ; +#endif // USE_WEBSERVER + + +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 flowratemeter_valuesread = false; +bool flowratemeter_raw_value = false; + + + +void IRAM_ATTR FlowRateMeterIR(uint16_t irq) +{ + 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); +#endif + if (irq < MAX_FLOWRATEMETER) { + if ((time - flowratemeter_last_irq[irq]) < (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period[irq] = time - flowratemeter_last_irq[irq]; + } else { + flowratemeter_period[irq] = 0; + } + flowratemeter_valuesread = true; + flowratemeter_last_irq[irq] = time; + } +} +// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way +void IRAM_ATTR FlowRateMeter1IR(void) +{ + FlowRateMeterIR(0); +} +void IRAM_ATTR FlowRateMeter2IR(void) +{ + FlowRateMeterIR(1); +} + +void FlowRateMeterRead(void) +{ + 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 (flowratemeter_count[i] <= FLOWRATEMETER_WEIGHT_AVG_SAMPLE) { + flowratemeter_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 FlowRateMeterInit(void) +{ + void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowRateMeter1IR, FlowRateMeter2IR}; + + 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 FlowRateMeterShow(bool json) +{ + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":[")); + } + + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + float flowratemeter_rate_avg_float = 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_FLOWRATEMETER_IN, i)) { + if (json) { + ResponseAppend_P(PSTR("%s%*_f"), + i ? PSTR(",") : PSTR(""), + Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float + ); + +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_FLOWRATEMETER, + i+1, + 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 + } + } + } + if (json) { + 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_FLOWRATEMETER_UNIT "\":\"%s\"}"), + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) + ); + } +} + +/*********************************************************************************************\ + * 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 - Value mode: Switch between displaying avg(0) / raw(1) readings (not permanently) + * + * 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 FlowRateMeterCommand(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 0: // Unit + if (any_value) { + Settings->SensorBits1.flowratemeter_unit = value & 1; + ResponseCmndNumber(value & 1); + show_parms = false; + } + break; + case 1: // Sensor calibration value + case 2: + if (any_value) { + Settings->flowratemeter_calibration[XdrvMailbox.payload - 1] = value; + ResponseCmndNumber(value); + show_parms = false; + } + break; + case 9: // avg/raw values + if (any_value) { + flowratemeter_raw_value = value & 1; + ResponseCmndNumber(value & 1); + show_parms = false; + } + break; + } + + if (show_parms) { + Response_P(PSTR("{\"Sensor%d\":{\"" D_JSON_POWERFACTOR "\":["), XSNS_96); + 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_FLOWRATEMETER_VALUE "\":\"%s\""), + 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 ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) + ); + } + + return true; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns96(uint8_t function) +{ + bool result = false; + + if (PinUsed(GPIO_FLOWRATEMETER_IN, GPIO_ANY)) { + switch (function) { + case FUNC_INIT: + FlowRateMeterInit(); + break; + case FUNC_EVERY_250_MSECOND: + FlowRateMeterRead(); + break; + case FUNC_COMMAND_SENSOR: + if (XSNS_96 == XdrvMailbox.index) { + result = FlowRateMeterCommand(); + } + break; + case FUNC_JSON_APPEND: + FlowRateMeterShow(true); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + FlowRateMeterShow(false); + break; +#endif // USE_WEBSERVER + } + } + return result; +} + +#endif // USE_FLOWRATEMETER diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index 19e517add..cea920168 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 +FLOWRATEMETER_SIGNAL = GPIO_FLOWRATEMETER_IN + SENSOR_END = GPIO_SENSOR_END