diff --git a/I2CDEVICES.md b/I2CDEVICES.md
index 57b10538c..cbd00b950 100644
--- a/I2CDEVICES.md
+++ b/I2CDEVICES.md
@@ -86,3 +86,4 @@ Index | Define | Driver | Device | Address(es) | Description
55 | USE_EZOO2 | xsns_78 | EZOO2 | 0x61 - 0x70 | O2 sensor
55 | USE_EZOPRS | xsns_78 | EZOPRS | 0x61 - 0x70 | Pressure sensor
55 | USE_EZOFLO | xsns_78 | EZOFLO | 0x61 - 0x70 | Flow meter sensor
+ 55 | USE_EZODO | xsns_78 | EZODO | 0x61 - 0x70 | Disolved Oxygen sensor
diff --git a/tasmota/i18n.h b/tasmota/i18n.h
index 9649e0ec6..33359eb29 100644
--- a/tasmota/i18n.h
+++ b/tasmota/i18n.h
@@ -53,6 +53,7 @@
#define D_JSON_DARKNESS "Darkness"
#define D_JSON_DATA "Data"
#define D_JSON_DEWPOINT "DewPoint"
+#define D_JSON_DO "DisolvedOxygen"
#define D_JSON_DISTANCE "Distance"
#define D_JSON_DNSSERVER "DNSServer"
#define D_JSON_DONE "Done"
@@ -785,6 +786,7 @@ const char HTTP_SNS_EC[] PROGMEM = "{s}%s " D_EC "{
const char HTTP_SNS_O2[] PROGMEM = "{s}%s " D_O2 "{m}%s " D_UNIT_PERCENT "{e}";
const char HTTP_SNS_LITERS[] PROGMEM = "{s}%s " D_VOLUME "{m}%s " D_UNIT_LITERS "{e}";
const char HTTP_SNS_LPM[] PROGMEM = "{s}%s " D_FLOW_RATE "{m}%s " D_UNIT_LITERS_PER_MIN "{e}";
+const char HTTP_SNS_DO[] PROGMEM = "{s}%s " D_DO "{m}%s " D_UNIT_PARTS_PER_MILLION "{e}";
const char S_MAIN_MENU[] PROGMEM = D_MAIN_MENU;
const char S_CONFIGURATION[] PROGMEM = D_CONFIGURATION;
diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h
index 162c0d564..6ad19f493 100644
--- a/tasmota/language/bg_BG.h
+++ b/tasmota/language/bg_BG.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Забранен"
#define D_DISTANCE "Разстояние"
#define D_DNS_SERVER "DNS Сървър"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Изпълнено"
#define D_DST_TIME "Лятно време"
#define D_EC "EC"
diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h
index e4e07aa03..6db75feae 100644
--- a/tasmota/language/cs_CZ.h
+++ b/tasmota/language/cs_CZ.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Zablokováno"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Server DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Provedeno"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h
index 5ab4b8df4..7b374e719 100644
--- a/tasmota/language/de_DE.h
+++ b/tasmota/language/de_DE.h
@@ -84,6 +84,7 @@
#define D_DISABLED "deaktiviert"
#define D_DISTANCE "Abstand"
#define D_DNS_SERVER "DNS-Server"
+#define D_DO "Disolved Oxygen"
#define D_DONE "erledigt"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h
index 5fdbb305b..519c26299 100644
--- a/tasmota/language/el_GR.h
+++ b/tasmota/language/el_GR.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Ανενεργό"
#define D_DISTANCE "Απόσταση"
#define D_DNS_SERVER "Διακομιστής DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Ολοκληρώθηκε"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h
index 25fa29550..2a17d14a8 100644
--- a/tasmota/language/en_GB.h
+++ b/tasmota/language/en_GB.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Disabled"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Server"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Done"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h
index 88537c607..7ecfb47d9 100644
--- a/tasmota/language/es_ES.h
+++ b/tasmota/language/es_ES.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Deshabilitado"
#define D_DISTANCE "Distancia"
#define D_DNS_SERVER "Servidor DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Listo"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h
index 4fb5a3452..24dd72ec8 100644
--- a/tasmota/language/fr_FR.h
+++ b/tasmota/language/fr_FR.h
@@ -80,6 +80,7 @@
#define D_DISABLED "Désactivé"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Serveur DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Terminé"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h
index 032ce5c04..edd1cf680 100644
--- a/tasmota/language/he_HE.h
+++ b/tasmota/language/he_HE.h
@@ -84,6 +84,7 @@
#define D_DISABLED "מבוטל"
#define D_DISTANCE "מרחק"
#define D_DNS_SERVER "DNS שרת"
+#define D_DO "Disolved Oxygen"
#define D_DONE "סיים"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h
index be7590886..81c8b902b 100644
--- a/tasmota/language/hu_HU.h
+++ b/tasmota/language/hu_HU.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Letiltva"
#define D_DISTANCE "Távolság"
#define D_DNS_SERVER "DNS szerver"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Kész"
#define D_DST_TIME "nyári idő"
#define D_EC "EC"
diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h
index 614d47a95..75dfb3ff1 100644
--- a/tasmota/language/it_IT.h
+++ b/tasmota/language/it_IT.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Disabilitato/a"
#define D_DISTANCE "Distanza"
#define D_DNS_SERVER "Server DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Completato"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h
index 0dce6d865..2d958401a 100644
--- a/tasmota/language/ko_KO.h
+++ b/tasmota/language/ko_KO.h
@@ -84,6 +84,7 @@
#define D_DISABLED "사용안함"
#define D_DISTANCE "거리"
#define D_DNS_SERVER "DNS 서버"
+#define D_DO "Disolved Oxygen"
#define D_DONE "완료"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h
index 24e02a07f..56b72ae60 100644
--- a/tasmota/language/nl_NL.h
+++ b/tasmota/language/nl_NL.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Uitgeschakeld"
#define D_DISTANCE "Afstand"
#define D_DNS_SERVER "DNS Server"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Klaar"
#define D_DST_TIME "ZT"
#define D_EC "EC"
diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h
index 764396b4e..2976538a2 100644
--- a/tasmota/language/pl_PL.h
+++ b/tasmota/language/pl_PL.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Wyłączony"
#define D_DISTANCE "Odległość"
#define D_DNS_SERVER "Serwer DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Wykonane"
#define D_DST_TIME "Czas DST"
#define D_EC "EC"
diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h
index fc69677ab..fa68108aa 100644
--- a/tasmota/language/pt_BR.h
+++ b/tasmota/language/pt_BR.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Desabilitado"
#define D_DISTANCE "Distância"
#define D_DNS_SERVER "Servidor DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Concluído"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h
index a3b7a5542..5aee83f2e 100644
--- a/tasmota/language/pt_PT.h
+++ b/tasmota/language/pt_PT.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Disabilitado"
#define D_DISTANCE "Distância"
#define D_DNS_SERVER "Servidor DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Concluído"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h
index eea0cc635..be4678b52 100644
--- a/tasmota/language/ro_RO.h
+++ b/tasmota/language/ro_RO.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Dezactivat"
#define D_DISTANCE "Distanță"
#define D_DNS_SERVER "Server DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Terminat"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h
index 8e51ec376..30f1c489c 100644
--- a/tasmota/language/ru_RU.h
+++ b/tasmota/language/ru_RU.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Блокирован"
#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Сервер"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Выполнено"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h
index c84590e18..634520391 100644
--- a/tasmota/language/sk_SK.h
+++ b/tasmota/language/sk_SK.h
@@ -85,6 +85,7 @@
#define D_DISABLED "Zablokované"
#define D_DISTANCE "Vzdialenosť"
#define D_DNS_SERVER "Server DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Hotovo"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h
index 615669f74..5ab897d31 100644
--- a/tasmota/language/sv_SE.h
+++ b/tasmota/language/sv_SE.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Inaktiverad"
#define D_DISTANCE "Distans"
#define D_DNS_SERVER "DNS-server"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Gjort"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h
index 29558e865..fb672ef48 100644
--- a/tasmota/language/tr_TR.h
+++ b/tasmota/language/tr_TR.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Etkin Değil"
#define D_DISTANCE "Mesage"
#define D_DNS_SERVER "DNS Sunucu"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Tamam"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h
index f5b0d3e9a..0e14712d7 100644
--- a/tasmota/language/uk_UA.h
+++ b/tasmota/language/uk_UA.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Вимкнено"
#define D_DISTANCE "Відстань"
#define D_DNS_SERVER "Сервер DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Виконано"
#define D_DST_TIME "Літній час"
#define D_EC "EC"
diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h
index c1dd6ed19..d53ac9235 100644
--- a/tasmota/language/vi_VN.h
+++ b/tasmota/language/vi_VN.h
@@ -84,6 +84,7 @@
#define D_DISABLED "Vô hiệu hóa"
#define D_DISTANCE "Khoảng cách"
#define D_DNS_SERVER "Máy chủ DNS"
+#define D_DO "Disolved Oxygen"
#define D_DONE "Hoàn thành"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h
index fa9c04339..a93ca3262 100644
--- a/tasmota/language/zh_CN.h
+++ b/tasmota/language/zh_CN.h
@@ -84,6 +84,7 @@
#define D_DISABLED "禁用"
#define D_DISTANCE "距离"
#define D_DNS_SERVER "DNS服务器"
+#define D_DO "Disolved Oxygen"
#define D_DONE "完成"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h
index 0dd6d15d4..8d9615f12 100644
--- a/tasmota/language/zh_TW.h
+++ b/tasmota/language/zh_TW.h
@@ -84,6 +84,7 @@
#define D_DISABLED "已停用"
#define D_DISTANCE "距離"
#define D_DNS_SERVER "DNS伺服器"
+#define D_DO "Disolved Oxygen"
#define D_DONE "完成"
#define D_DST_TIME "DST"
#define D_EC "EC"
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index b0b06a64e..8e5d8ecd4 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -571,6 +571,7 @@
// #define USE_EZOO2 // [I2cDriver55] Enable support for EZO's O2 sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code)
// #define USE_EZOPRS // [I2cDriver55] Enable support for EZO's PRS sensor (+0k7 code) - Shared EZO code required for any EZO device (+1k2 code)
// #define USE_EZOFLO // [I2cDriver55] Enable support for EZO's FLO sensor (+0k4 code) - Shared EZO code required for any EZO device (+1k2 code)
+// #define USE_EZODO // [I2cDriver55] Enable support for EZO's DO sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code)
// #define USE_DISPLAY // Add I2C Display Support (+2k code)
#define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0
diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h
index 47caeb9cd..773a2e32e 100644
--- a/tasmota/tasmota_configurations.h
+++ b/tasmota/tasmota_configurations.h
@@ -136,6 +136,7 @@
//#define USE_EZOO2 // [I2cDriver55] Enable support for EZO's O2 sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code)
//#define USE_EZOPRS // [I2cDriver55] Enable support for EZO's PRS sensor (+0k7 code) - Shared EZO code required for any EZO device (+1k2 code)
//#define USE_EZOFLO // [I2cDriver55] Enable support for EZO's FLO sensor (+0k4 code) - Shared EZO code required for any EZO device (+1k2 code)
+// #define USE_EZODO // [I2cDriver55] Enable support for EZO's DO sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code)
#define USE_MHZ19 // Add support for MH-Z19 CO2 sensor (+2k code)
#define USE_SENSEAIR // Add support for SenseAir K30, K70 and S8 CO2 sensor (+2k3 code)
diff --git a/tasmota/xsns_78_ezo.ino b/tasmota/xsns_78_ezo.ino
index a92df5d87..409b55d11 100644
--- a/tasmota/xsns_78_ezo.ino
+++ b/tasmota/xsns_78_ezo.ino
@@ -18,7 +18,7 @@
*/
#ifdef USE_I2C
-#if defined(USE_EZOPH) || defined(USE_EZOORP) || defined(USE_EZORTD) || defined(USE_EZOHUM) || defined(USE_EZOEC) || defined(USE_EZOCO2) || defined(USE_EZOO2) || defined(USE_EZOPRS) || defined(USE_EZOFLO)
+#if defined(USE_EZOPH) || defined(USE_EZOORP) || defined(USE_EZORTD) || defined(USE_EZOHUM) || defined(USE_EZOEC) || defined(USE_EZOCO2) || defined(USE_EZOO2) || defined(USE_EZOPRS) || defined(USE_EZOFLO) || defined(USE_EZODO)
#define USE_EZO
#endif
#if defined(USE_EZO)
diff --git a/tasmota/xsns_78_ezodo.ino b/tasmota/xsns_78_ezodo.ino
new file mode 100644
index 000000000..a0dd6a36f
--- /dev/null
+++ b/tasmota/xsns_78_ezodo.ino
@@ -0,0 +1,60 @@
+/*
+ xsns_78_ezodo.ino - EZO DO I2C DO sensor support for Tasmota
+
+ Copyright (C) 2020 Christopher Tremblay
+
+ 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_I2C
+#ifdef USE_EZODO
+
+#define EZO_DO_READ_LATENCY 600
+
+struct EZODO : public EZOStruct {
+ EZODO(uint32_t addr) : EZOStruct(addr), DO(0) {}
+
+ virtual void ProcessMeasurement(void)
+ {
+ char data[D_EZO_MAX_BUF];
+
+ EZOStruct::ProcessMeasurement(data, sizeof(data), EZO_DO_READ_LATENCY);
+ DO = CharToFloat(data);
+ }
+
+ virtual void Show(bool json, const char *name)
+ {
+ char str[8];
+ dtostrfd(DO, 2, str);
+
+ if (json) {
+ ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_DO "\":%d}" ), name, str);
+ }
+#ifdef USE_WEBSERVER
+ else {
+ WSContentSend_PD(HTTP_SNS_DO, name, str);
+#endif // USE_WEBSERVER
+ }
+ }
+
+ static const char id[] PROGMEM;
+
+private:
+ float DO;
+};
+
+const char EZODO::id[] PROGMEM = "D.O.";
+
+#endif // USE_EZODO
+#endif // USE_I2C
diff --git a/tasmota/xsns_78_xezo.ino b/tasmota/xsns_78_xezo.ino
index 95019cb50..784475ab5 100644
--- a/tasmota/xsns_78_xezo.ino
+++ b/tasmota/xsns_78_xezo.ino
@@ -51,7 +51,11 @@ enum {
// The order of the EZO devices must map with the enum declared above
const char *const EZOSupport[EZO_ADDR_n] PROGMEM = {
- EZOStruct::id, // "DO"
+#ifdef USE_EZODO
+ EZODO::id,
+#else
+ EZOStruct::id,
+#endif
#ifdef USE_EZOORP
EZOORP::id,
#else
@@ -67,7 +71,7 @@ const char *const EZOSupport[EZO_ADDR_n] PROGMEM = {
#else
EZOStruct::id,
#endif
- EZOStruct::id,
+ EZOStruct::id, //
#ifdef USE_EZORTD
EZORTD::id,
#else
@@ -89,14 +93,14 @@ const char *const EZOSupport[EZO_ADDR_n] PROGMEM = {
#else
EZOStruct::id,
#endif
- EZOStruct::id,
+ EZOStruct::id, //
#ifdef USE_EZOO2
EZOO2::id,
#else
EZOStruct::id,
#endif
- EZOStruct::id,
- EZOStruct::id,
+ EZOStruct::id, //
+ EZOStruct::id, //
#ifdef USE_EZOHUM
EZOHUM::id,
#else
@@ -234,6 +238,9 @@ private:
// We use switch intead of virtual function to save RAM
switch (j + EZO_ADDR_0) {
+#ifdef USE_EZODO
+ CREATE_EZO_CLASS(DO)
+#endif
#ifdef USE_EZOORP
CREATE_EZO_CLASS(ORP)
#endif