diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h
index 9cf907e22..3de656a31 100644
--- a/tasmota/language/af_AF.h
+++ b/tasmota/language/af_AF.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 59af27f2c..a48eb1002 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -835,6 +835,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index 6bffd8849..132db487a 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index d0fccd6ca..625354541 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index e71ee964a..9ce804712 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index 40986f104..daa138c52 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index 239cb2ac7..4c62fdb4b 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index a63b252c0..2a6ee9205 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h
index 3984dc0c5..466f5d019 100644
--- a/tasmota/language/fy_NL.h
+++ b/tasmota/language/fy_NL.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index eba8fa655..ef070a454 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index f7d51de3e..40dd559c3 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 8d76ab9d3..1dcb99651 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "Effetto hall"
#define D_SENSOR_EPD_DATA "EPD - Dati"
#define D_SENSOR_MCP2515_CS "MCP2515 - CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index 5da66f819..0e0ba113e 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index 54ed3cc5b..ca755b4aa 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index d90d6099a..af637038c 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "Efekt Halla"
#define D_SENSOR_EPD_DATA "EPD Dane"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index e7b0a938f..e1054caf0 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "Efeito Hall"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index 4eeb9eb28..6cc66ce12 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "Efeito Hall"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index e3ec62390..8b7bc46cd 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index 9f58134c1..b4167028e 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "А"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index ac554d43e..50b299796 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index 5d46cb0f5..03d2537b5 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index bfdd34f63..6d53258de 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index 25ffd199c..5a21b20a9 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "А"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index 59efb8330..c36fb29b1 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index 036f4c352..97533a1c2 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "A"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 18540574f..f7b4437f7 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -836,6 +836,8 @@
#define D_SENSOR_HALLEFFECT "HallEffect"
#define D_SENSOR_EPD_DATA "EPD Data"
#define D_SENSOR_MCP2515_CS "MCP2515 CS"
+#define D_SENSOR_HRG15_RX "HRG15 RX"
+#define D_SENSOR_HRG15_TX "HRG15 TX"
// Units
#define D_UNIT_AMPERE "安培"
diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h
index fb7220586..94e7f6f2d 100644
--- a/tasmota/tasmota_template.h
+++ b/tasmota/tasmota_template.h
@@ -170,6 +170,7 @@ enum UserSelectablePins {
GPIO_I2S_IN_DATA, GPIO_I2S_IN_CLK, GPIO_I2S_IN_SLCT,
GPIO_INTERRUPT,
GPIO_MCP2515_CS, // MCP2515 Chip Select
+ GPIO_HRG15_RX, GPIO_HRG15_TX, // Hydreon RG-15 rain sensor serial interface
GPIO_SENSOR_END };
enum ProgramSelectablePins {
@@ -360,6 +361,7 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_I2S_IN_DATA "|" D_SENSOR_I2S_IN_CLK "|" D_SENSOR_I2S_IN_SLCT "|"
D_SENSOR_INTERRUPT "|"
D_SENSOR_MCP2515_CS "|"
+ D_SENSOR_HRG15_RX "|" D_SENSOR_HRG15_TX
;
const char kSensorNamesFixed[] PROGMEM =
@@ -791,6 +793,10 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_AS608_TX),
AGPIO(GPIO_AS608_RX),
#endif
+#ifdef USE_HRG15
+ AGPIO(GPIO_HRG15_RX),
+ AGPIO(GPIO_HRG15_TX),
+#endif
/*-------------------------------------------------------------------------------------------*\
* Other sensors
diff --git a/tasmota/xsns_90_hrg15.ino b/tasmota/xsns_90_hrg15.ino
new file mode 100644
index 000000000..adf7461c0
--- /dev/null
+++ b/tasmota/xsns_90_hrg15.ino
@@ -0,0 +1,233 @@
+/*
+ xsns_90-hrg15.ino - Hydreon RG-15 support for Tasmota
+
+ Copyright (c) 2021 Wouter Breukink
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifdef USE_HRG15
+/*********************************************************************************************\
+ * Hydreon RG-15
+ * See https://rainsensors.com/products/rg-15/
+\*********************************************************************************************/
+
+#define XSNS_90 90
+
+#define RG15_NAME "RG-15"
+#define RG15_BAUDRATE 9600
+#define RG15_READ_TIMEOUT 500
+#define RG15_EVENT_TIMEOUT 60
+
+#include
+
+#ifdef USE_WEBSERVER
+const char HTTP_RG15[] PROGMEM =
+ // {s} = , {m} = | , {e} = |
+ "{s}" RG15_NAME " " D_JSON_ACTIVE "{m}%2_f " D_UNIT_MILLIMETER "{e}"
+ "{s}" RG15_NAME " " D_JSON_EVENT "{m}%2_f " D_UNIT_MILLIMETER "{e}"
+ "{s}" RG15_NAME " " D_JSON_TOTAL "{m}%2_f " D_UNIT_MILLIMETER "{e}"
+ "{s}" RG15_NAME " " D_JSON_FLOWRATE "{m}%2_f " D_UNIT_MILLIMETER "/" D_UNIT_HOUR "{e}";
+#endif // USE_WEBSERVER
+
+TasmotaSerial *HydreonSerial;
+
+struct RG15 {
+ uint16_t time = RG15_EVENT_TIMEOUT;
+ uint8_t ready = 1;
+ uint8_t received = 0;
+ float acc = 0.0f;
+ float event = 0.0f;
+ float total = 0.0f;
+ float rate = 0.0f;
+} Rg15;
+
+void Rg15Init(void)
+{
+ Rg15.ready = 0;
+ if (PinUsed(GPIO_HRG15_RX) && PinUsed(GPIO_HRG15_TX)) {
+ HydreonSerial = new TasmotaSerial(Pin(GPIO_HRG15_RX), Pin(GPIO_HRG15_TX));
+ if (HydreonSerial->begin(RG15_BAUDRATE)) {
+ if (HydreonSerial->hardwareSerial()) { ClaimSerial(); }
+
+ HydreonSerial->println('R');
+
+ Rg15.ready = 1;
+ }
+ }
+}
+
+bool Rg15Poll(void) {
+
+ // Trigger the first update
+ if (! Rg15.received) {
+ HydreonSerial->println('R');
+ }
+
+ if (! HydreonSerial->available()) {
+
+ // Check if the rain event has timed out, reset rate to 0
+ if (++Rg15.time == RG15_EVENT_TIMEOUT) {
+ Rg15.acc = 0;
+ Rg15.rate = 0;
+ MqttPublishSensor();
+ }
+
+ return false;
+ }
+
+ // Now read what's available
+ char rg15_buffer[255];
+
+ while (HydreonSerial->available()) {
+ Rg15ReadLine(rg15_buffer);
+ AddLog(LOG_LEVEL_DEBUG_MORE,PSTR("%s:" D_JSON_SERIALRECEIVED " = %s"),"HRG", rg15_buffer);
+
+ Rg15Process(rg15_buffer);
+ }
+
+ MqttPublishSensor();
+
+ return true;
+}
+
+bool Rg15ReadLine(char* buffer)
+{
+ char c;
+ uint8_t i = 0;
+ uint32_t cmillis = millis();
+
+ while (1) {
+ if (HydreonSerial->available()) {
+ c = HydreonSerial->read();
+ buffer[i++] = c;
+
+ if (c == 10) { break; } // New line ends the message
+ if (i == 254) { break; } // Overflow
+ }
+
+ if ((millis() - cmillis) > RG15_READ_TIMEOUT) {
+ return false;
+ }
+ }
+
+ buffer[i-2] = '\0';
+ return true;
+}
+
+void Rg15Process(char* buffer) {
+
+ // Process payload, example: Acc 0.01 mm, EventAcc 2.07 mm, TotalAcc 54.85 mm, RInt 2.89 mmph
+ Rg15.received = 1;
+ Rg15.acc = Rg15Parse(buffer, "Acc");
+ Rg15.event = Rg15Parse(buffer, "EventAcc");
+ Rg15.total = Rg15Parse(buffer, "TotalAcc");
+ Rg15.rate = Rg15Parse(buffer, "RInt");
+
+ if (Rg15.acc > 0.0f) {
+ Rg15.time = 0; // We have some data, so the rain event is on-going
+ }
+}
+
+float Rg15Parse(char* buffer, const char* item) {
+ char* start = strstr(buffer, item);
+ if (start != nullptr) {
+ char* end = strstr(start, " mm");
+ char tmp = end[0];
+ end[0] = '\0';
+ float result = CharToFloat (start + strlen(item));
+ end[0] = tmp;
+ return result;
+ } else {
+ return 0.0f;
+ }
+}
+
+bool Rg15Command(void) {
+ bool serviced = true;
+
+ if (XdrvMailbox.data_len == 1) {
+ char *send = XdrvMailbox.data;
+ HydreonSerial->println(send);
+ HydreonSerial->flush();
+
+ if (send[0] == 'k' || send[0] == 'K' || send[0] == 'o' || send[0] == 'O') {
+ ResponseCmndDone();
+ return serviced;
+ }
+
+ char rg15_buffer[255];
+ if (Rg15ReadLine(rg15_buffer)) {
+ Response_P(PSTR("{\"" D_JSON_SERIALRECEIVED "\":%s\"}"), rg15_buffer);
+ Rg15Process(rg15_buffer);
+ }
+ }
+
+ return serviced;
+}
+
+void Rg15Show(bool json)
+{
+ if (!Rg15.received) {
+ return;
+ }
+
+ if (json) {
+ ResponseAppend_P(PSTR(",\"" RG15_NAME "\":{\"" D_JSON_ACTIVE "\":%2_f, \"" D_JSON_EVENT "\":%2_f, \"" D_JSON_TOTAL "\":%2_f, \"" D_JSON_FLOWRATE "\":%2_f}"), &Rg15.acc, &Rg15.event, &Rg15.total, &Rg15.rate);
+#ifdef USE_WEBSERVER
+ } else {
+ WSContentSend_PD(HTTP_RG15, &Rg15.acc, &Rg15.event, &Rg15.total, &Rg15.rate);
+#endif // USE_WEBSERVER
+ }
+}
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+bool Xsns90(uint8_t function)
+{
+
+ bool result = false;
+
+ if (Rg15.ready)
+ {
+ switch (function)
+ {
+ case FUNC_INIT:
+ Rg15Init();
+ break;
+ case FUNC_COMMAND_SENSOR:
+ if (XSNS_90 == XdrvMailbox.index) {
+ Rg15Command();
+ }
+ break;
+ case FUNC_EVERY_SECOND:
+ Rg15Poll();
+ break;
+ case FUNC_JSON_APPEND:
+ Rg15Show(1);
+ break;
+#ifdef USE_WEBSERVER
+ case FUNC_WEB_SENSOR:
+ Rg15Show(0);
+ break;
+#endif // USE_WEBSERVER
+ }
+ }
+
+ return result;
+}
+
+#endif // USE_HRG15
\ No newline at end of file