From a466c5abf33386c3dda34696e11ae975c7ac6649 Mon Sep 17 00:00:00 2001
From: Theo Arends <11044339+arendst@users.noreply.github.com>
Date: Fri, 8 Oct 2021 13:59:11 +0200
Subject: [PATCH] Add support for HM330X
Add support for HM330X SeedStudio Grove Particule sensor (#13250)
---
BUILDS.md | 2 +
CHANGELOG.md | 1 +
I2CDEVICES.md | 1 +
RELEASENOTES.md | 1 +
tasmota/language/af_AF.h | 1 +
tasmota/language/bg_BG.h | 1 +
tasmota/language/cs_CZ.h | 1 +
tasmota/language/de_DE.h | 1 +
tasmota/language/el_GR.h | 1 +
tasmota/language/en_GB.h | 1 +
tasmota/language/es_ES.h | 1 +
tasmota/language/fr_FR.h | 1 +
tasmota/language/fy_NL.h | 1 +
tasmota/language/he_HE.h | 1 +
tasmota/language/hu_HU.h | 1 +
tasmota/language/it_IT.h | 1 +
tasmota/language/ko_KO.h | 1 +
tasmota/language/nl_NL.h | 1 +
tasmota/language/pl_PL.h | 1 +
tasmota/language/pt_BR.h | 1 +
tasmota/language/pt_PT.h | 1 +
tasmota/language/ro_RO.h | 1 +
tasmota/language/ru_RU.h | 1 +
tasmota/language/sk_SK.h | 1 +
tasmota/language/sv_SE.h | 1 +
tasmota/language/tr_TR.h | 1 +
tasmota/language/uk_UA.h | 1 +
tasmota/language/vi_VN.h | 1 +
tasmota/language/zh_CN.h | 1 +
tasmota/language/zh_TW.h | 1 +
tasmota/my_user_config.h | 5 +
tasmota/support_features.ino | 4 +-
tasmota/tasmota_template.h | 13 +-
tasmota/xsns_93_hm330x.ino | 361 +++++++++++++++++++++++++++++++++++
tools/decode-status.py | 10 +-
35 files changed, 415 insertions(+), 9 deletions(-)
create mode 100644 tasmota/xsns_93_hm330x.ino
diff --git a/BUILDS.md b/BUILDS.md
index 1998788c232f..4a55f149831f 100644
--- a/BUILDS.md
+++ b/BUILDS.md
@@ -160,6 +160,8 @@ m = minimal, l = lite, t = tasmota, k = knx, s = sensors, i = ir, d = display
| USE_SEESAW_SOIL | - | - | - / - | - | - | - | - |
| USE_TOF10120 | - | - | - / - | - | - | - | - |
| USE_AM2320 | - | - | - / - | - | - | - | - |
+| USE_T67XX | - | - | - / - | - | - | - | - |
+| USE_HM330X | - | - | - / - | - | - | - | - |
| | | | | | | | |
| Feature or Sensor | m | l | t | k | s | i | d | Remarks
| USE_SPI | - | - | - / - | - | - | - | x |
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f9b2cafdff20..5045a43eec3c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file.
- Commands ``EnergyUsage`` and ``EnergyExport`` to (re)set energy usage and export values
- Berry add module ``import persist``
- Support for BL0942 energy monitor (#13259)
+- Support for HM330X SeedStudio Grove Particule sensor (#13250)
### Breaking Changed
- ESP32 LVGL updated to v8.0.2
diff --git a/I2CDEVICES.md b/I2CDEVICES.md
index 5264557caec7..07094954b564 100644
--- a/I2CDEVICES.md
+++ b/I2CDEVICES.md
@@ -96,3 +96,4 @@ Index | Define | Driver | Device | Address(es) | Description
60 | USE_AM2320 | xsns_88 | AM2320 | 0x5C | Temperature and Humidity sensor
61 | USE_T67XX | xsns_89 | T67XX | 0x15 | CO2 sensor
62 | USE_SCD40 | xsns_92 | SCD40 | 0x62 | CO2 sensor Sensirion SCD40/SCD41
+ 63 | USE_HM330X | xsns_93 | HM330X | 0x40 | Particule sensor
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 1d0532b24659..6c9f57403bc9 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -126,6 +126,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
- Support for Sensirion SCD40/SCD41 CO2 sensor [#13139](https://github.com/arendst/Tasmota/issues/13139)
- Support for BL0939 energy monitor as used in ESP32 based Sonoff Dual R3 V2 Pow [#13195](https://github.com/arendst/Tasmota/issues/13195)
- Support for BL0942 energy monitor [#13259](https://github.com/arendst/Tasmota/issues/13259)
+- Support for HM330X SeedStudio Grove Particule sensor [#13250](https://github.com/arendst/Tasmota/issues/13250)
- Initial support for Tasmota Mesh (TasMesh) providing node/broker communication using ESP-NOW [#11939](https://github.com/arendst/Tasmota/issues/11939)
- Initial support for Wi-Fi extender [#12784](https://github.com/arendst/Tasmota/issues/12784)
- Rule event support as JSON payload [#12496](https://github.com/arendst/Tasmota/issues/12496)
diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h
index c2c99390859d..90f07ad0033d 100644
--- a/tasmota/language/af_AF.h
+++ b/tasmota/language/af_AF.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 535490e2e8cc..ac51c3ef688a 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -711,6 +711,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index 5869c70b82e3..61f2a502e109 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index 19801605e0fa..e17fc15a69bf 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index 40924a999ced..cbddc2e29c7d 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index c2dd499b8bd6..55275c9bbc6f 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index 867b6c5382f3..ecfd956e85da 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index 3274dc358d29..f8f91108fc52 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 TX"
#define D_SENSOR_PN532_RX "PN532 RX"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h
index c8de5552825d..2d181d0e4954 100644
--- a/tasmota/language/fy_NL.h
+++ b/tasmota/language/fy_NL.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index 0f26efe5e711..ef306ac58a6e 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index f2d13f08c178..cfb08ce4e80b 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 2655f28856e9..88f2dd216b91 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -710,6 +710,7 @@
#define D_SENSOR_CSE7761_RX "CSE7761 - RX"
#define D_SENSOR_CSE7766_TX "CSE7766 - TX"
#define D_SENSOR_CSE7766_RX "CSE7766 - RX"
+#define D_SENSOR_HM330X_SET "HM330X - SET"
#define D_SENSOR_PN532_TX "PN532 - TX"
#define D_SENSOR_PN532_RX "PN532 - RX"
#define D_SENSOR_SM16716_CLK "SM16716 - CLK"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index 2b866a3bf00c..8f0335fac447 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index d14b74087918..3097e59b781b 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index 713df76ad75b..599e96d476d8 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index 70c596063185..fff1c23316c3 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index b430481e3527..2952e153ab5a 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index b0c62eb4df28..ac695b69943d 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index e25356cae223..b5e1435c1636 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index 824ddac76a3d..f483d3eb7e4a 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index fa394a22ed7c..8bd50eda5cad 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index 3730512bcda2..c05701137a69 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index 423eb770bf78..4ce422a8dbb4 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index abec88be90bc..c7b8b84f1702 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index 3461ccae1b53..22c0e684c2b7 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 10ec030fe7c1..61054f7bf6fd 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -712,6 +712,7 @@
#define D_SENSOR_CSE7766_RX "CSE7766 Rx"
#define D_SENSOR_BL0939_RX "BL0939 Rx"
#define D_SENSOR_BL0942_RX "BL0942 Rx"
+#define D_SENSOR_HM330X_SET "HM330X SET"
#define D_SENSOR_PN532_TX "PN532 Tx"
#define D_SENSOR_PN532_RX "PN532 Rx"
#define D_SENSOR_SM16716_CLK "SM16716 CLK"
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index a5d87ceae045..69d7a1ac2613 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -653,6 +653,11 @@
// #define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2k5 code)
// #define USE_AM2320 // [I2cDriver60] Enable AM2320 temperature and humidity Sensor (I2C address 0x5C) (+1k code)
// #define USE_T67XX // [I2cDriver61] Enable Telaire T67XX CO2 sensor (I2C address 0x15) (+1k3 code)
+// #define USE_HM330X // [I2cDriver63] Enable support for SeedStudio Grove Particule sensor (I2C address 0x40) (+1k5 code)
+// #define HM330X_DEFAULT_ADDRESS 0x40 // Option: change default I2C address for HM330X used in SeedSTudio Particucle Sensor
+// #define HM330X_WARMUP_DELAY 30 // Option: change warmup delay during which data are not read from sensor after a power up
+// #define HM330X_HIDE_OUT_OF_DATE false // Option: change to true to hide data from web GUI and SENSOR while sensor is asleep
+
// #define USE_DISPLAY // Add I2C Display Support (+2k code)
#define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0
#define USE_DISPLAY_LCD // [DisplayModel 1] [I2cDriver3] Enable Lcd display (I2C addresses 0x27 and 0x3F) (+6k code)
diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino
index 16827dc02510..6a2d73b37a23 100644
--- a/tasmota/support_features.ino
+++ b/tasmota/support_features.ino
@@ -771,7 +771,9 @@ void ResponseAppendFeatures(void)
#if defined(USE_I2C) && defined(USE_SCD40)
feature8 |= 0x00004000; // xsns_92_scd40.ino
#endif
-// feature8 |= 0x00008000;
+#if defined(USE_I2C) && defined(USE_HM330X)
+ feature8 |= 0x00008000;
+#endif
// feature8 |= 0x00010000;
// feature8 |= 0x00020000;
diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h
index f363d068f7dc..8b5ffae8ad93 100644
--- a/tasmota/tasmota_template.h
+++ b/tasmota/tasmota_template.h
@@ -174,6 +174,7 @@ enum UserSelectablePins {
GPIO_VINDRIKTNING_RX, // IKEA VINDRIKTNING Serial interface
GPIO_BL0939_RX, // BL0939 Serial interface (Dual R3 v2)
GPIO_BL0942_RX, // BL0942 Serial interface
+ GPIO_HM330X_SET, // HM330X SET pin (sleep when low)
GPIO_SENSOR_END };
enum ProgramSelectablePins {
@@ -367,7 +368,8 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_HRG15_TX "|" D_SENSOR_HRG15_RX "|"
D_SENSOR_VINDRIKTNING_RX "|"
D_SENSOR_BL0939_RX "|"
- D_SENSOR_BL0942_RX
+ D_SENSOR_BL0942_RX "|"
+ D_SENSOR_HM330X_SET
;
const char kSensorNamesFixed[] PROGMEM =
@@ -755,6 +757,12 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_PMS5003_TX), // Plantower PMS5003 Serial interface
AGPIO(GPIO_PMS5003_RX), // Plantower PMS5003 Serial interface
#endif
+#ifdef USE_VINDRIKTNING
+ AGPIO(GPIO_VINDRIKTNING_RX),
+#endif
+#ifdef USE_HM330X
+ AGPIO(GPIO_HM330X_SET), // HM330X Sleep pin (active low)
+#endif
#if defined(USE_TX20_WIND_SENSOR) || defined(USE_TX23_WIND_SENSOR) || defined(USE_WS2300_WIND_SENSOR)
AGPIO(GPIO_TX2X_TXD_BLACK), // TX20/TX23 Transmission Pin
#endif
@@ -805,9 +813,6 @@ const uint16_t kGpioNiceList[] PROGMEM = {
AGPIO(GPIO_HRG15_TX),
AGPIO(GPIO_HRG15_RX),
#endif
-#ifdef USE_VINDRIKTNING
- AGPIO(GPIO_VINDRIKTNING_RX),
-#endif
/*-------------------------------------------------------------------------------------------*\
* Other sensors
diff --git a/tasmota/xsns_93_hm330x.ino b/tasmota/xsns_93_hm330x.ino
new file mode 100644
index 000000000000..3ddc51ccb848
--- /dev/null
+++ b/tasmota/xsns_93_hm330x.ino
@@ -0,0 +1,361 @@
+/*
+ xsns_92_hm330x.ino - Driver for Seedstudio Grove HM3301 particle sensor
+
+ Copyright (C) 2021 Barbudor, SeedStudio
+
+ 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