diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h
index 844f16b38..b6ea5bec8 100644
--- a/tasmota/include/tasmota_template.h
+++ b/tasmota/include/tasmota_template.h
@@ -212,6 +212,7 @@ enum UserSelectablePins {
GPIO_GM861_TX, GPIO_GM861_RX, // GM861 Serial interface
GPIO_DINGTIAN_OE, // New version of Dingtian relay board where PL is not shared with OE
GPIO_HDMI_CEC, // Support for HDMI CEC
+ GPIO_HC8_RXD, // HC8 Serial interface
GPIO_SENSOR_END };
// Error as warning to rethink GPIO usage with max 2045
@@ -471,6 +472,7 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_GM861_TX "|" D_SENSOR_GM861_RX "|"
D_GPIO_DINGTIAN_OE "|"
D_SENSOR_HDMI_CEC "|"
+ D_SENSOR_HC8_RX "|"
;
const char kSensorNamesFixed[] PROGMEM =
@@ -959,6 +961,9 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_MHZ_TXD), // MH-Z19 Serial interface
AGPIO(GPIO_MHZ_RXD), // MH-Z19 Serial interface
#endif
+#ifdef USE_HC8
+ AGPIO(GPIO_HC8_RXD), // HC8 Serial interface
+#endif
#ifdef USE_SENSEAIR
AGPIO(GPIO_SAIR_TX), // SenseAir Serial interface
AGPIO(GPIO_SAIR_RX), // SenseAir Serial interface
diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h
index 213a0d520..24d16492a 100644
--- a/tasmota/language/af_AF.h
+++ b/tasmota/language/af_AF.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRontvanger"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 1a761de28..1dc41734d 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h
index 1b4b62aff..6b95db866 100644
--- a/tasmota/language/ca_AD.h
+++ b/tasmota/language/ca_AD.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "Receptor IR"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index 67d93ce26..c5bf8e085 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index f01302bd3..e9f1cdb3e 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index 348be66e8..7745b7744 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index e9ebfa690..df6faf3ce 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index 38be6db00..10b268ad2 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IR Rx"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index 69faa8548..7e096029b 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IR Rx"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h
index b4d28617f..b02cc954e 100644
--- a/tasmota/language/fy_NL.h
+++ b/tasmota/language/fy_NL.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index cc08a426f..15d5bc7fc 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index 58de5690d..594ca2064 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IR vevő"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 26f0b71a5..d75fd4c9b 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IR - RX"
#define D_SENSOR_MHZ_RX "MHZ - RX"
#define D_SENSOR_MHZ_TX "MHZ - TX"
+#define D_SENSOR_HC8_RX "HC8 - Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 - RX"
#define D_SENSOR_PZEM016_RX "PZEM016 - RX"
#define D_SENSOR_PZEM017_RX "PZEM017 - RX"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index ff3a62de7..898fc249d 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index d0b92c201..33311ed0b 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index c0cd0e8e8..155902134 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index 4893a5a55..e7a3f412a 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index a8eb67bff..80113c383 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index 29258cb6e..a3fc84e4d 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index f0d0e23e5..c8880f0ad 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -674,6 +674,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index b11a041ba..662e8cb27 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index 9986715ef..9aa19956e 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index 90e80936b..e2225c4da 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index ebccd0423..a8133f7cb 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index 6beaa9330..fa577673f 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index 552b9054e..c09694c78 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 9028ce8b7..0b3592a9c 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -673,6 +673,7 @@
#define D_SENSOR_IRRECV "IRrecv"
#define D_SENSOR_MHZ_RX "MHZ Rx"
#define D_SENSOR_MHZ_TX "MHZ Tx"
+#define D_SENSOR_HC8_RX "HC8 Rx"
#define D_SENSOR_PZEM004_RX "PZEM004 Rx"
#define D_SENSOR_PZEM016_RX "PZEM016 Rx"
#define D_SENSOR_PZEM017_RX "PZEM017 Rx"
diff --git a/tasmota/tasmota_xsns_sensor/xsns_113_hc8.ino b/tasmota/tasmota_xsns_sensor/xsns_113_hc8.ino
new file mode 100644
index 000000000..79845e837
--- /dev/null
+++ b/tasmota/tasmota_xsns_sensor/xsns_113_hc8.ino
@@ -0,0 +1,146 @@
+/*
+ xsns_113_hc8.ino - HC8 CO2 sensor support for Tasmota
+
+ Copyright (C) 2023 Daniel Maier
+
+ 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_HC8
+/*********************************************************************************************\
+ * HC8 - CO2 sensor
+ *
+ * Hardware Serial will be selected if GPIO1 = [HC8 Rx]
+ */
+
+#define XSNS_113 113
+
+
+/*********************************************************************************************\
+ * Source: https://spezifisch.codeberg.page/posts/2022-08-23/co2-sensor-reverse-engineering/
+ *
+\*********************************************************************************************/
+
+#include
+
+TasmotaSerial *Hc8Serial;
+
+uint16_t hc8_last_ppm = 0;
+bool Hc8Initialized = false;
+
+/*********************************************************************************************/
+
+
+uint8_t Hc8CalculateChecksum(uint8_t *array) {
+ uint8_t checksum = 0;
+ for(int i = 0; i < 15; i++) {
+ checksum += array[i];
+ }
+ return checksum;
+}
+
+void Hc8EverySecond(void)
+{
+ if(!Hc8Initialized)
+ return;
+
+ uint8_t hc8_response[16];
+ if(Hc8Serial->available() >= 16) {
+ while(Hc8Serial->available()) {
+ hc8_response[0] = Hc8Serial->read();
+ if(hc8_response[0] == 0x42)
+ break;
+ }
+
+ for(int i = 1; i < 16; i++) {
+ hc8_response[i] = Hc8Serial->read();
+ }
+
+ if(*(uint16_t*)hc8_response != 0x4d42) {
+ return;
+ }
+
+ uint8_t checksum = Hc8CalculateChecksum(hc8_response);
+ if(hc8_response[15] != checksum) {
+ return;
+ }
+
+ hc8_last_ppm = (hc8_response[6]<<8) | hc8_response[7];
+ }
+}
+
+void Hc8Init(void)
+{
+ if (PinUsed(GPIO_HC8_RXD)) {
+ Hc8Serial = new TasmotaSerial(Pin(GPIO_HC8_RXD), -1, 1);
+ if (Hc8Serial->begin(9600)) {
+ if (Hc8Serial->hardwareSerial()) { ClaimSerial(); }
+ Hc8Initialized = true;
+ }
+ }
+}
+
+void Hc8Show(bool json)
+{
+ char types[4] = "HC8";
+ char model[4] = "HC8";
+
+ if (json) {
+ ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_MODEL "\":\"%s\",\"" D_JSON_CO2 "\":\"%d\"}"),
+ types, model, hc8_last_ppm);
+#ifdef USE_DOMOTICZ
+ if (0 == TasmotaGlobal.tele_period) {
+ DomoticzSensor(DZ_AIRQUALITY, hc8_last_ppm);
+ }
+#endif // USE_DOMOTICZ
+#ifdef USE_WEBSERVER
+ } else {
+ WSContentSend_PD(HTTP_SNS_CO2, types, hc8_last_ppm);
+#endif // USE_WEBSERVER
+ }
+}
+
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+bool Xsns113(uint32_t function)
+{
+ bool result = false;
+ switch (function) {
+ case FUNC_INIT:
+ Hc8Init();
+ break;
+ case FUNC_EVERY_SECOND:
+ Hc8EverySecond();
+ break;
+ case FUNC_COMMAND_SENSOR:
+ if (XSNS_113 == XdrvMailbox.index) {
+ result = true;
+ }
+ break;
+ case FUNC_JSON_APPEND:
+ Hc8Show(1);
+ break;
+#ifdef USE_WEBSERVER
+ case FUNC_WEB_SENSOR:
+ Hc8Show(0);
+ break;
+#endif // USE_WEBSERVER
+ }
+ return result;
+}
+
+#endif // USE_HC8