From c1f30da81ee71fcfb9b293997fb4d4b1dc75fe7f Mon Sep 17 00:00:00 2001 From: Federico Leoni Date: Mon, 23 Dec 2019 22:22:29 -0300 Subject: [PATCH] Add Moisture Sensor --- tasmota/i18n.h | 4 +++ 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/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/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-UK.h | 1 + tasmota/language/zh-CN.h | 1 + tasmota/language/zh-TW.h | 1 + tasmota/tasmota_template.h | 2 ++ tasmota/xsns_02_analog.ino | 51 +++++++++++++++++++++++++++++++++----- tasmota/xsns_48_chirp.ino | 2 +- 26 files changed, 74 insertions(+), 7 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 68a19f75e..24b0e1f19 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -99,6 +99,7 @@ #define D_JSON_MEMORY_ERROR "Memory error" #define D_JSON_MINIMAL "minimal" #define D_JSON_MODEL "Model" +#define D_JSON_MOISTURE "Moisture" #define D_JSON_MQTT_COUNT "MqttCount" #define D_JSON_NO "No" #define D_JSON_NOISE "Noise" @@ -589,6 +590,7 @@ const char JSON_SNS_TEMP[] PROGMEM = ",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s}"; const char JSON_SNS_TEMPHUM[] PROGMEM = ",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s,\"" D_JSON_HUMIDITY "\":%s}"; const char JSON_SNS_ILLUMINANCE[] PROGMEM = ",\"%s\":{\"" D_JSON_ILLUMINANCE "\":%d}"; +const char JSON_SNS_MOISTURE[] PROGMEM = ",\"%s\":{\"" D_JSON_MOISTURE "\":%d}"; const char JSON_SNS_GNGPM[] PROGMEM = ",\"%s\":{\"" D_JSON_TOTAL_USAGE "\":%s,\"" D_JSON_FLOWRATE "\":%s}"; @@ -618,6 +620,8 @@ const char HTTP_SNS_CO2[] PROGMEM = "{s}%s " D_CO2 "{m}%d " D_UNIT_PARTS_PER_MIL const char HTTP_SNS_CO2EAVG[] PROGMEM = "{s}%s " D_ECO2 "{m}%d " D_UNIT_PARTS_PER_MILLION "{e}"; // {s} = , {m} = , {e} = const char HTTP_SNS_GALLONS[] PROGMEM = "{s}%s " D_TOTAL_USAGE "{m}%s " D_UNIT_GALLONS " {e}"; // {s} = , {m} = , {e} = const char HTTP_SNS_GPM[] PROGMEM = "{s}%s " D_FLOW_RATE "{m}%s " D_UNIT_GALLONS_PER_MIN" {e}"; // {s} = , {m} = , {e} = +const char HTTP_SNS_MOISTURE[] PROGMEM = "{s}%s " D_MOISTURE "{m}%d %%{e}"; // {s} = , {m} = , {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 12937ca6c..f2ac56402 100644 --- a/tasmota/language/bg-BG.h +++ b/tasmota/language/bg-BG.h @@ -113,6 +113,7 @@ #define D_LIGHT "Светлина" #define D_LWT "LWT" #define D_MODULE "Модул" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "неколкократно натискане" #define D_NOISE "Шум" diff --git a/tasmota/language/cs-CZ.h b/tasmota/language/cs-CZ.h index a297d7063..272e2c5ca 100644 --- a/tasmota/language/cs-CZ.h +++ b/tasmota/language/cs-CZ.h @@ -113,6 +113,7 @@ #define D_LIGHT "Světlo" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "několikeré-stisknutí" #define D_NOISE "Hluk" diff --git a/tasmota/language/de-DE.h b/tasmota/language/de-DE.h index 663628cd1..89d36103d 100644 --- a/tasmota/language/de-DE.h +++ b/tasmota/language/de-DE.h @@ -113,6 +113,7 @@ #define D_LIGHT "Licht" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "Mehrfachdruck" #define D_NOISE "Lautstärke" diff --git a/tasmota/language/el-GR.h b/tasmota/language/el-GR.h index d491d31a2..2b1e4748c 100644 --- a/tasmota/language/el-GR.h +++ b/tasmota/language/el-GR.h @@ -113,6 +113,7 @@ #define D_LIGHT "Φως" #define D_LWT "LWT" #define D_MODULE "Μονάδα" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "ανίχνευση για πολλαπλά πατήματα" #define D_NOISE "Θόρυβος" diff --git a/tasmota/language/en-GB.h b/tasmota/language/en-GB.h index 8ec56b16c..ab7f90cf8 100644 --- a/tasmota/language/en-GB.h +++ b/tasmota/language/en-GB.h @@ -113,6 +113,7 @@ #define D_LIGHT "Light" #define D_LWT "LWT" #define D_MODULE "Module" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "Noise" diff --git a/tasmota/language/es-ES.h b/tasmota/language/es-ES.h index 42f0991a6..e41b4cb32 100644 --- a/tasmota/language/es-ES.h +++ b/tasmota/language/es-ES.h @@ -113,6 +113,7 @@ #define D_LIGHT "Luz" #define D_LWT "LWT" #define D_MODULE "Módulo" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "Ruido" diff --git a/tasmota/language/fr-FR.h b/tasmota/language/fr-FR.h index a0e34da3e..840421ff3 100644 --- a/tasmota/language/fr-FR.h +++ b/tasmota/language/fr-FR.h @@ -113,6 +113,7 @@ #define D_LIGHT "Lumière" #define D_LWT "LWT" #define D_MODULE "Module" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pression" #define D_NOISE "Bruit" diff --git a/tasmota/language/he-HE.h b/tasmota/language/he-HE.h index d31d5380c..9e26a6c5e 100644 --- a/tasmota/language/he-HE.h +++ b/tasmota/language/he-HE.h @@ -113,6 +113,7 @@ #define D_LIGHT "אור" #define D_LWT "LWT" #define D_MODULE "מודול" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "לחיצה מרובה" #define D_NOISE "רעש" diff --git a/tasmota/language/hu-HU.h b/tasmota/language/hu-HU.h index 7cde76cbb..b7f33a549 100644 --- a/tasmota/language/hu-HU.h +++ b/tasmota/language/hu-HU.h @@ -113,6 +113,7 @@ #define D_LIGHT "Fény" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "több lenyomás" #define D_NOISE "Zaj" diff --git a/tasmota/language/it-IT.h b/tasmota/language/it-IT.h index 7b6d7eed0..d3c55579a 100644 --- a/tasmota/language/it-IT.h +++ b/tasmota/language/it-IT.h @@ -113,6 +113,7 @@ #define D_LIGHT "Luce" #define D_LWT "LWT" #define D_MODULE "Modulo" +#define D_MOISTURE "Umidità" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pressione" #define D_NOISE "Rumore" diff --git a/tasmota/language/ko-KO.h b/tasmota/language/ko-KO.h index 5d15554de..a6c2088a1 100644 --- a/tasmota/language/ko-KO.h +++ b/tasmota/language/ko-KO.h @@ -113,6 +113,7 @@ #define D_LIGHT "밝게" #define D_LWT "LWT" #define D_MODULE "모듈" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "소음" diff --git a/tasmota/language/nl-NL.h b/tasmota/language/nl-NL.h index ec352f3e6..8fb492399 100644 --- a/tasmota/language/nl-NL.h +++ b/tasmota/language/nl-NL.h @@ -113,6 +113,7 @@ #define D_LIGHT "Licht" #define D_LWT "LWT" #define D_MODULE "Module" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "meervoudig" #define D_NOISE "Lawaai" diff --git a/tasmota/language/pl-PL.h b/tasmota/language/pl-PL.h index 9c547e29b..58168516d 100644 --- a/tasmota/language/pl-PL.h +++ b/tasmota/language/pl-PL.h @@ -113,6 +113,7 @@ #define D_LIGHT "Światło" #define D_LWT "LWT" #define D_MODULE "Moduł" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "Wielokrotne naciśnięcie" #define D_NOISE "Szum" diff --git a/tasmota/language/pt-BR.h b/tasmota/language/pt-BR.h index 7a8db0dca..0c9891323 100644 --- a/tasmota/language/pt-BR.h +++ b/tasmota/language/pt-BR.h @@ -113,6 +113,7 @@ #define D_LIGHT "Luz" #define D_LWT "LWT" #define D_MODULE "Módulo" +#define D_MOISTURE "Umidade" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pressão" #define D_NOISE "Ruído" diff --git a/tasmota/language/pt-PT.h b/tasmota/language/pt-PT.h index 8b9868bd8..210ef8e29 100644 --- a/tasmota/language/pt-PT.h +++ b/tasmota/language/pt-PT.h @@ -113,6 +113,7 @@ #define D_LIGHT "Luz" #define D_LWT "LWT" #define D_MODULE "Módulo" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-pressão" #define D_NOISE "Ruído" diff --git a/tasmota/language/ru-RU.h b/tasmota/language/ru-RU.h index 610af6f3f..6696e0e48 100644 --- a/tasmota/language/ru-RU.h +++ b/tasmota/language/ru-RU.h @@ -113,6 +113,7 @@ #define D_LIGHT "Свет" #define D_LWT "LWT" #define D_MODULE "Модуль" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "многократное нажатие" #define D_NOISE "Шум" diff --git a/tasmota/language/sk-SK.h b/tasmota/language/sk-SK.h index 9aa428b69..21120179a 100644 --- a/tasmota/language/sk-SK.h +++ b/tasmota/language/sk-SK.h @@ -113,6 +113,7 @@ #define D_LIGHT "Svetlo" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-stlačenie" #define D_NOISE "Hluk" diff --git a/tasmota/language/sv-SE.h b/tasmota/language/sv-SE.h index 1a70704ee..117fb40ed 100644 --- a/tasmota/language/sv-SE.h +++ b/tasmota/language/sv-SE.h @@ -113,6 +113,7 @@ #define D_LIGHT "Ljus" #define D_LWT "LWT" #define D_MODULE "Modul" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "fler tryck" #define D_NOISE "Oväsen" diff --git a/tasmota/language/tr-TR.h b/tasmota/language/tr-TR.h index 6e9d9b9bf..9874688da 100644 --- a/tasmota/language/tr-TR.h +++ b/tasmota/language/tr-TR.h @@ -113,6 +113,7 @@ #define D_LIGHT "Işık" #define D_LWT "LWT" #define D_MODULE "Modül" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "multi-press" #define D_NOISE "Noise" diff --git a/tasmota/language/uk-UK.h b/tasmota/language/uk-UK.h index d4862c3c8..dbf58fe35 100644 --- a/tasmota/language/uk-UK.h +++ b/tasmota/language/uk-UK.h @@ -113,6 +113,7 @@ #define D_LIGHT "Світло" #define D_LWT "LWT" #define D_MODULE "Модуль" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "Багаторазове натискання" #define D_NOISE "Шум" diff --git a/tasmota/language/zh-CN.h b/tasmota/language/zh-CN.h index 886a7c918..7700e7e78 100644 --- a/tasmota/language/zh-CN.h +++ b/tasmota/language/zh-CN.h @@ -113,6 +113,7 @@ #define D_LIGHT "灯" #define D_LWT "LWT" #define D_MODULE "模块" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "多次按键" #define D_NOISE "嘈杂" diff --git a/tasmota/language/zh-TW.h b/tasmota/language/zh-TW.h index 61f82fb4c..34bb68e3d 100644 --- a/tasmota/language/zh-TW.h +++ b/tasmota/language/zh-TW.h @@ -113,6 +113,7 @@ #define D_LIGHT "燈" #define D_LWT "LWT" #define D_MODULE "模組" +#define D_MOISTURE "Moisture" #define D_MQTT "MQTT" #define D_MULTI_PRESS "多次按鍵" #define D_NOISE "雜訊" diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 3985884ef..6b936d14a 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -313,6 +313,7 @@ enum UserSelectableAdc0 { ADC0_BUTTON_INV, // ADC0_SWITCH, // Switch // ADC0_SWITCH_INV, + ADC0_MOIST, // Moisture ADC0_END }; // Programmer selectable ADC0 functionality @@ -326,6 +327,7 @@ const char kAdc0Names[] PROGMEM = D_SENSOR_NONE "|" D_ANALOG_INPUT "|" D_TEMPERATURE "|" D_LIGHT "|" D_SENSOR_BUTTON "|" D_SENSOR_BUTTON "i|" + D_MOISTURE "|" // D_SENSOR_SWITCH "|" D_SENSOR_SWITCH "i|" ; diff --git a/tasmota/xsns_02_analog.ino b/tasmota/xsns_02_analog.ino index 1a4bc090b..4e75dbbe7 100644 --- a/tasmota/xsns_02_analog.ino +++ b/tasmota/xsns_02_analog.ino @@ -66,6 +66,12 @@ void AdcInit(void) Settings.adc_param2 = ANALOG_LDR_LUX_CALC_SCALAR; Settings.adc_param3 = ANALOG_LDR_LUX_CALC_EXPONENT * 10000; } + else if (ADC0_MOIST == my_adc0) { + Settings.adc_param_type = ADC0_MOIST; + Settings.adc_param1 = 0; + Settings.adc_param2 = 1023; + Settings.adc_param3 = 0; + } } } @@ -113,6 +119,20 @@ uint16_t AdcGetLux(void) return (uint16_t)ldrLux; } +uint16_t AdcGetMoist(void) +// formula for calibration: value, fromLow, fromHigh, toHigh, toLow +// Example: 632, 0, 1023, 100, 0 +// int( ( ( ( - ) / ( - ) ) * ( - ) ) + ) +// double amoist = ((Settings.adc_param2 - (double)adc) / (Settings.adc_param2 - Settings.adc_param1) * 100; +// int((((1023 - ) / ( 1023 - 0 )) * ( 100 - 0 )) + 0 ) + +{ + int adc = AdcRead(2); + double amoist = ((double)Settings.adc_param2 - (double)adc) / ((double)Settings.adc_param2 - (double)Settings.adc_param1) * 100; + //double amoist = ((1023 - (double)adc) / 1023) * 100; + return (uint16_t)amoist; +} + void AdcEverySecond(void) { if (ADC0_TEMP == my_adc0) { @@ -126,7 +146,7 @@ void AdcEverySecond(void) } void AdcShow(bool json) -{ +{ if (ADC0_INPUT == my_adc0) { uint16_t analog = AdcRead(5); @@ -173,9 +193,20 @@ void AdcShow(bool json) #ifdef USE_WEBSERVER } else { WSContentSend_PD(HTTP_SNS_ILLUMINANCE, "", adc_light); + #endif // USE_WEBSERVER } } + else if (ADC0_MOIST == my_adc0) { + uint16_t adc_moist = AdcGetMoist(); + if (json) { + ResponseAppend_P(JSON_SNS_MOISTURE, "ANALOG", adc_moist); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_MOISTURE, "", adc_moist); +#endif // USE_WEBSERVER + } + } } /*********************************************************************************************\ @@ -217,7 +248,7 @@ void CmndAdcs(void) void CmndAdcParam(void) { if (XdrvMailbox.data_len) { - if ((ADC0_TEMP == XdrvMailbox.payload) || (ADC0_LIGHT == XdrvMailbox.payload)) { + if ((ADC0_TEMP == XdrvMailbox.payload) || (ADC0_LIGHT == XdrvMailbox.payload) || (ADC0_MOIST == XdrvMailbox.payload)) { // if ((XdrvMailbox.payload == my_adc0) && ((ADC0_TEMP == my_adc0) || (ADC0_LIGHT == my_adc0))) { if (strstr(XdrvMailbox.data, ",") != nullptr) { // Process parameter entry char sub_string[XdrvMailbox.data_len +1]; @@ -227,10 +258,13 @@ void CmndAdcParam(void) // Settings.adc_param_type = my_adc0; Settings.adc_param1 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); Settings.adc_param2 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 3), nullptr, 10); - Settings.adc_param3 = (int)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4)) * 10000); + if (!ADC0_MOIST == XdrvMailbox.payload) { + Settings.adc_param3 = (int)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4)) * 10000); + } } else { // Set default values based on current adc type // AdcParam 2 // AdcParam 3 + // AdcParam 6 Settings.adc_param_type = 0; AdcInit(); } @@ -246,8 +280,13 @@ void CmndAdcParam(void) } char param3[33]; dtostrfd(((double)Settings.adc_param3)/10000, precision, param3); - Response_P(PSTR("{\"" D_CMND_ADCPARAM "\":[%d,%d,%d,%s]}"), - Settings.adc_param_type, Settings.adc_param1, Settings.adc_param2, param3); + if ((ADC0_TEMP == my_adc0) || (ADC0_LIGHT == my_adc0)) { + Response_P(PSTR("{\"" D_CMND_ADCPARAM "\":[%d,%d,%d,%s]}"), + Settings.adc_param_type, Settings.adc_param1, Settings.adc_param2, param3); + } else if (ADC0_MOIST == my_adc0) { + Response_P(PSTR("{\"" D_CMND_ADCPARAM "\":[%d,%d,%d]}"), + Settings.adc_param_type, Settings.adc_param1, Settings.adc_param2); + } } /*********************************************************************************************\ @@ -263,7 +302,7 @@ bool Xsns02(uint8_t function) result = DecodeCommand(kAdcCommands, AdcCommand); break; default: - if ((ADC0_INPUT == my_adc0) || (ADC0_TEMP == my_adc0) || (ADC0_LIGHT == my_adc0)) { + if ((ADC0_INPUT == my_adc0) || (ADC0_TEMP == my_adc0) || (ADC0_LIGHT == my_adc0) || (ADC0_MOIST == my_adc0)) { switch (function) { #ifdef USE_RULES case FUNC_EVERY_250_MSECOND: diff --git a/tasmota/xsns_48_chirp.ino b/tasmota/xsns_48_chirp.ino index 84fcd4f66..131a0cc24 100644 --- a/tasmota/xsns_48_chirp.ino +++ b/tasmota/xsns_48_chirp.ino @@ -399,7 +399,7 @@ void ChirpEvery100MSecond(void) /********************************************************************************************/ // normaly in i18n.h -#define D_JSON_MOISTURE "Moisture" +// #define D_JSON_MOISTURE "Moisture" // on i18n.h #define D_JSON_DARKNESS "Darkness" #ifdef USE_WEBSERVER