From 475b4f3fe34c7dba8273b05bea62e097f5ee7466 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Sat, 27 Aug 2022 09:27:09 +0200 Subject: [PATCH 1/2] Rework flowmeter --- .../xsns_96_flowratemeter.ino | 250 +++++++++++++----- 1 file changed, 183 insertions(+), 67 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino index 4e43bd6b8..2cbe54947 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino @@ -29,30 +29,34 @@ #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" +#define D_UNIT_CUBIC_METER "m³" + +#define D_JSON_FLOWRATEMETER_RATE "Rate" +#define D_JSON_FLOWRATEMETER_VALUE "Source" +#define D_JSON_FLOWRATEMETER_UNIT "Unit" +#define D_JSON_FLOWRATEMETER_AMOUNT_TODAY "AmountToday" +#define D_JSON_FLOWRATEMETER_AMOUNT_UNIT "AmountUnit" +#define D_JSON_FLOWRATEMETER_DURATION_TODAY "DurationToday" +#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 - +#define FLOWRATEMETER_INVALID (uint32_t)-1 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}; +volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {FLOWRATEMETER_INVALID}; + +int32_t flowratemeter_period_sum[MAX_FLOWRATEMETER]; +int32_t flowratemeter_period_sum_dT[MAX_FLOWRATEMETER]; +int32_t flowratemeter_period_duration[MAX_FLOWRATEMETER]; + -bool flowratemeter_valuesread = false; bool flowratemeter_raw_value = false; +#define FlowRateMeterIsValid(time, meter) flowratemeter_last_irq[meter] != FLOWRATEMETER_INVALID && flowratemeter_last_irq[meter] < time void IRAM_ATTR FlowRateMeterIR(uint16_t irq) { @@ -62,12 +66,16 @@ void IRAM_ATTR FlowRateMeterIR(uint16_t irq) 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; + if (FlowRateMeterIsValid(time, irq)) { + if ((time - flowratemeter_last_irq[irq]) < (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period_sum_dT[irq] = millis(); + flowratemeter_period_sum[irq]++; + flowratemeter_period[irq] = time - flowratemeter_last_irq[irq]; + flowratemeter_period_duration[irq] += flowratemeter_period[irq] / 100; + } else { + flowratemeter_period[irq] = 0; + } } - flowratemeter_valuesread = true; flowratemeter_last_irq[irq] = time; } } @@ -81,20 +89,36 @@ void IRAM_ATTR FlowRateMeter2IR(void) FlowRateMeterIR(1); } +void FlowRateMeterMidnightReset(void) +{ + uint32_t t = millis(); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + flowratemeter_period_sum[i] = 0; + flowratemeter_period_duration[i] = 0; + flowratemeter_period_sum_dT[i] = t; + } +} + 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; - } + uint32_t time = micros(); + if (PinUsed(GPIO_FLOWRATEMETER_IN, i) && FlowRateMeterIsValid(time, i)) { + if ((time - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { + // invalid in case of pulse outage + flowratemeter_period[i] = 0; + flowratemeter_period_avg[i] = 0; + flowratemeter_count[i] = 0; + flowratemeter_last_irq[i] = FLOWRATEMETER_INVALID; + } - // exponentially weighted average - if (flowratemeter_count[i] <= FLOWRATEMETER_WEIGHT_AVG_SAMPLE) { - flowratemeter_count[i]++; + // 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]; } - flowratemeter_period_avg[i] -= flowratemeter_period_avg[i] / flowratemeter_count[i]; - flowratemeter_period_avg[i] += float(flowratemeter_period[i]) / flowratemeter_count[i]; } } @@ -102,7 +126,7 @@ void FlowRateMeterInit(void) { void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowRateMeter1IR, FlowRateMeter2IR}; - flowratemeter_valuesread = false; + FlowRateMeterMidnightReset(); for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { pinMode(Pin(GPIO_FLOWRATEMETER_IN, i), INPUT); @@ -111,50 +135,139 @@ void FlowRateMeterInit(void) } } -void FlowRateMeterShow(bool json) +void FlowRateMeterGetValue(uint32_t meter, float *rate_float, float *amount_today) { - 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 (nullptr != rate_float) { + *rate_float = 0; + if (meter < MAX_FLOWRATEMETER && flowratemeter_period[meter]) { + *rate_float = + (1000000.0 / 60.0 / 2.0) + / (flowratemeter_raw_value ? flowratemeter_period[meter] : flowratemeter_period_avg[meter]) + * (Settings->flowratemeter_calibration[meter] ? (float)Settings->flowratemeter_calibration[meter] : 1000.0); } } - 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) - ); + + if (nullptr != amount_today) { + *amount_today = 0; + if (meter < MAX_FLOWRATEMETER && flowratemeter_period_sum[meter]) { + uint32_t _flowratemeter_period = (uint32_t)((float)flowratemeter_period_sum_dT[meter] / (float)flowratemeter_period_sum[meter] * 1000.0); + float lmin = (((1000000.0 / 60.0) / 2.0) / _flowratemeter_period * (Settings->flowratemeter_calibration[meter] ? (float)Settings->flowratemeter_calibration[meter] : 1000.0)); + *amount_today = (lmin / 60000) * flowratemeter_period_sum_dT[meter]; + } } } +void FlowRateMeterShow(bool json) +{ + uint16_t flowmeter_count = 0; + const char* open_square_bracket; + const char* close_square_bracket; + float flowratemeter_rate_float[MAX_FLOWRATEMETER]; + float floatrate_amount_today[MAX_FLOWRATEMETER]; + + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + FlowRateMeterGetValue(i, &flowratemeter_rate_float[i], &floatrate_amount_today[i]); + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + flowmeter_count++; + } + } + if (flowmeter_count > 1) { + open_square_bracket = PSTR("["); + close_square_bracket = PSTR("]"); + } else { + open_square_bracket = PSTR(""); + close_square_bracket = PSTR(""); + } + + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":%s"), open_square_bracket); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float rate = Settings->SensorBits1.flowratemeter_unit ? flowratemeter_rate_float[i] * 60 / 1000 : flowratemeter_rate_float[i]; + ResponseAppend_P(PSTR("%s%*_f"), i ? PSTR(",") : PSTR(""), Settings->flag2.frequency_resolution, &rate); + } + } + ResponseAppend_P(PSTR("%s,\"" D_JSON_FLOWRATEMETER_AMOUNT_TODAY "\":%s"), close_square_bracket, open_square_bracket); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; + ResponseAppend_P(PSTR("%s%*_f"), i ? PSTR(",") : PSTR(""), Settings->flag2.frequency_resolution, &amount_today); + } + } + ResponseAppend_P(PSTR("%s,\"" D_JSON_FLOWRATEMETER_DURATION_TODAY "\":%s"), close_square_bracket, open_square_bracket); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + ResponseAppend_P(PSTR("%s%ld"), i ? PSTR(",") : PSTR(""), flowratemeter_period_duration[i] / 10000); + } + } + ResponseAppend_P(PSTR("%s,\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), + close_square_bracket, + flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) + ); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_AMOUNT_UNIT "\":\"%s\""), + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBIC_METER) : PSTR(D_UNIT_LITERS)); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE)); +#ifdef USE_WEBSERVER + } else { + // {s} = , {m} = , {e} = + if (flowmeter_count > 1) { + // head + WSContentSend_PD(PSTR("{s}  ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + WSContentSend_PD(PSTR("%d "), + Settings->flag5.gui_table_align ? PSTR("right") : PSTR("center"), + i+1 + ); + } + } + WSContentSend_PD(PSTR(" ")); + } + + // Flowrate + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME "{m} ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float rate = Settings->SensorBits1.flowratemeter_unit ? flowratemeter_rate_float[i] * 60 / 1000 : flowratemeter_rate_float[i]; + WSContentSend_PD(PSTR("%*_f "), + Settings->flag5.gui_table_align ? PSTR("right") : PSTR("center"), + Settings->flag2.frequency_resolution, &rate + ); + } + } + WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE)); + + // Amount today + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Amount Today" "{m} ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; + WSContentSend_PD(PSTR("%*_f "), + Settings->flag5.gui_table_align ? PSTR("right") : PSTR("center"), + Settings->flag2.frequency_resolution, &amount_today + ); + } + } + WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBIC_METER) : PSTR(D_UNIT_LITERS)); + + // Duration today + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Duration Today" "{m} ")); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { + float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; + WSContentSend_PD(PSTR("%s "), + (Settings->flag5.gui_table_align)?PSTR("right"):PSTR("center"), + GetDuration(flowratemeter_period_duration[i] / 10000).c_str() + ); + } + } + WSContentSend_PD(PSTR("{e}")); +#endif // USE_WEBSERVER + } +} + + /*********************************************************************************************\ * Supported commands for Sensor96: * @@ -246,6 +359,9 @@ bool Xsns96(uint8_t function) case FUNC_INIT: FlowRateMeterInit(); break; + case FUNC_SAVE_AT_MIDNIGHT: + FlowRateMeterMidnightReset(); + break; case FUNC_EVERY_250_MSECOND: FlowRateMeterRead(); break; From 2b163ad4ea7f9d80e0c91d727bee77fad6f5e31c Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Tue, 30 Aug 2022 11:46:19 +0200 Subject: [PATCH 2/2] Flowrate meter add flow amount/duration --- CHANGELOG.md | 1 + tasmota/language/af_AF.h | 5 ++++- tasmota/language/bg_BG.h | 3 +++ tasmota/language/ca_AD.h | 3 +++ tasmota/language/cs_CZ.h | 3 +++ tasmota/language/de_DE.h | 3 +++ tasmota/language/el_GR.h | 3 +++ tasmota/language/en_GB.h | 3 +++ tasmota/language/es_ES.h | 3 +++ tasmota/language/fr_FR.h | 3 +++ tasmota/language/fy_NL.h | 3 +++ tasmota/language/he_HE.h | 3 +++ tasmota/language/hu_HU.h | 3 +++ tasmota/language/it_IT.h | 3 +++ tasmota/language/ko_KO.h | 3 +++ tasmota/language/nl_NL.h | 3 +++ tasmota/language/pl_PL.h | 3 +++ tasmota/language/pt_BR.h | 3 +++ tasmota/language/pt_PT.h | 3 +++ tasmota/language/ro_RO.h | 3 +++ tasmota/language/ru_RU.h | 3 +++ tasmota/language/sk_SK.h | 3 +++ tasmota/language/sv_SE.h | 3 +++ tasmota/language/tr_TR.h | 3 +++ tasmota/language/uk_UA.h | 3 +++ tasmota/language/vi_VN.h | 3 +++ tasmota/language/zh_CN.h | 3 +++ tasmota/language/zh_TW.h | 3 +++ tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino | 7 ++----- 29 files changed, 85 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2ce50ee4..1e679b257 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - TasmotaModbus library from v3.5.0 to v3.6.0 (#16351) - Button debouncing V3 by adopting switch debounce code (#16339) - Thermostat max allowed temperature from 100 to 200C (#16363) +- Flowrate meter add flow amount/duration, show values in table format ### Fixed - Removed whitespace from JSON values with no decimals (#16365) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index a02170f37..72fe31896 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1076,7 +1077,9 @@ #define D_FP_UNKNOWNERROR "Fout" // Any other error // xsns_96_flowratemeter.ino -#define D_FLOWRATEMETER_NAME "Flowmeter" +#define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 581d0b6fc..949dbdb16 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index 6dfeec7e9..bbdb4eee1 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Posant l'adreça a" #define D_OUT_OF_RANGE "Fora de rang" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Cabal" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 8cc9a3255..71d42ddfc 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 44c63ba50..e9a9f6609 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Neue Adresse" #define D_OUT_OF_RANGE "Außerhalb Bereich" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Durchflussmesser" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Menge heute" +#define D_FLOWRATEMETER_DURATION_TODAY "Dauer heute" // 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 ab3479641..028c9a49d 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 25d605ab3..60b9e8942 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 c0209fe37..e9a5c46fe 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Cambiando dirección a" #define D_OUT_OF_RANGE "Fuera de Rango" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 21dcf9060..b94af9891 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Positionner l'adresse à" #define D_OUT_OF_RANGE "Hors limites" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 0212d2f2c..fbe031e89 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 9f0a2df84..6c5cbb225 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 b748b0dbc..d31d0957d 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 560cb299f..e54d71f59 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "W/m²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/ora" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Imposta indirizzo a" #define D_OUT_OF_RANGE "Fuori intervallo" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Portata" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 40ebaec62..92400dfe5 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 2b69901e2..729aa5e0e 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Nieuw adres" #define D_OUT_OF_RANGE "Buiten beriek" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 992419ee1..fa9c391c2 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Ustawiam adres na" #define D_OUT_OF_RANGE "Poza zakresem" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 763efdea3..b845055a4 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 2d216a4a6..4b03eb70b 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 8d2d409e2..93f2381b1 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 e5f0a0e81..81e66fa2c 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 c24ab53cb..f1a60f325 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 c36612aed..fa52fe7fe 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 319791d99..90337d4cb 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 ea736ffea..8258e3a0a 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -934,6 +934,7 @@ #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" #define D_UNIT_LITER_PER_MINUTE "l/min" #define D_UNIT_CUBICMETER_PER_HOUR "m³/h" +#define D_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 26de9f0a7..3422ab65d 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 e74e51008..2a8158b8c 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // 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 2fe003a1c..00b247f74 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -934,6 +934,7 @@ #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_UNIT_CUBIC_METER "m³" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1077,6 +1078,8 @@ // xsns_96_flowratemeter.ino #define D_FLOWRATEMETER_NAME "Flowrate" +#define D_FLOWRATEMETER_AMOUNT_TODAY "Amount Today" +#define D_FLOWRATEMETER_DURATION_TODAY "Duration Today" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino index 2cbe54947..16a635e9e 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino @@ -25,12 +25,9 @@ #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_UNIT_CUBIC_METER "m³" - #define D_JSON_FLOWRATEMETER_RATE "Rate" #define D_JSON_FLOWRATEMETER_VALUE "Source" #define D_JSON_FLOWRATEMETER_UNIT "Unit" @@ -239,7 +236,7 @@ void FlowRateMeterShow(bool json) WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE)); // Amount today - WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Amount Today" "{m} ")); + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " " D_FLOWRATEMETER_AMOUNT_TODAY "{m} ")); for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i]; @@ -252,7 +249,7 @@ void FlowRateMeterShow(bool json) WSContentSend_PD(PSTR("%s{e}"), Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBIC_METER) : PSTR(D_UNIT_LITERS)); // Duration today - WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " Duration Today" "{m} ")); + WSContentSend_PD(PSTR("{s}" D_FLOWRATEMETER_NAME " " D_FLOWRATEMETER_DURATION_TODAY "{m} ")); for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { float amount_today = Settings->SensorBits1.flowratemeter_unit ? floatrate_amount_today[i] / 1000 : floatrate_amount_today[i];