From 37800d4da9f3a90d2eb294859cf3f7b46717edb1 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Fri, 20 Oct 2023 23:16:59 +0200 Subject: [PATCH 1/9] [P103] Add support for EZO-HUM sensor --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 394 +++++++++++++-------- src/src/PluginStructs/P103_data_struct.cpp | 27 +- src/src/PluginStructs/P103_data_struct.h | 34 +- 3 files changed, 297 insertions(+), 158 deletions(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index d8f5b0fcde..a9455d1d92 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -2,17 +2,21 @@ #ifdef USES_P103 -// ########################################################################### -// ################## Plugin 103 : Atlas Scientific EZO pH ORP EC DO sensors # -// ########################################################################### - -// datasheet at https://atlas-scientific.com/files/pH_EZO_Datasheet.pdf -// datasheet at https://atlas-scientific.com/files/ORP_EZO_Datasheet.pdf -// datasheet at https://atlas-scientific.com/files/EC_EZO_Datasheet.pdf -// datasheet at https://atlas-scientific.com/files/DO_EZO_Datasheet.pdf +// ######################################################################################## +// ################## Plugin 103 : Atlas Scientific EZO pH ORP EC DO HUM RTD FLOW sensors # +// ######################################################################################## + +// datasheet at https://atlas-scientific.com/files/pH_EZO_Datasheet.pdf (0x63, pH level) +// datasheet at https://atlas-scientific.com/files/ORP_EZO_Datasheet.pdf (0x62, Oxidation Reduction Potential) +// datasheet at https://atlas-scientific.com/files/EC_EZO_Datasheet.pdf (0x64, electric conductivity) +// datasheet at https://atlas-scientific.com/files/DO_EZO_Datasheet.pdf (0x61, dissolved oxigen) +// datasheet at https://files.atlas-scientific.com/EZO-HUM-C-Datasheet.pdf (0x6F, humidity) +// datasheet at https://files.atlas-scientific.com/EZO_RTD_Datasheet.pdf (0x66, thermosensors) +// datasheet at https://files.atlas-scientific.com/flow_EZO_Datasheet.pdf (0x68, flow meter) // only i2c mode is supported /** Changelog: + * 2023-10-17 tonhuisman: Add support for EZO HUM, RTD and FLOW sensor modules (I2C only!) (RTD, FLOW disabled, default to UART mode) * 2023-01-08 tonhuisman: Replace ambiguous #define UNKNOWN, move support functions to plugin_struct source * 2023-01-07 tonhuisman: Refactored strings (a.o. shorter names for WEBFORM_LOAD and WEBFORM_SAVE events), separate javascript function * instead of repeated code, extract red/orange/green messages into functions @@ -22,9 +26,17 @@ # define PLUGIN_103 # define PLUGIN_ID_103 103 -# define PLUGIN_NAME_103 "Environment - Atlas EZO pH ORP EC DO" +# define PLUGIN_NAME_103 "Environment - Atlas EZO pH ORP EC DO HUM" +# if P103_USE_RTD +" RTD" +# endif // if P103_USE_RTD +# if P103_USE_FLOW +" FLOW" +# endif // if P103_USE_FLOW # define PLUGIN_VALUENAME1_103 "SensorData" # define PLUGIN_VALUENAME2_103 "Voltage" +# define PLUGIN_VALUENAME3_103 "Temperature" // Only used for HUM +# define PLUGIN_VALUENAME4_103 "Dewpoint" // Only used for HUM # include "src/PluginStructs/P103_data_struct.h" @@ -32,7 +44,18 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) { boolean success = false; - AtlasEZO_Sensors_e board_type = AtlasEZO_Sensors_e::UNKNOWN; + AtlasEZO_Sensors_e board_type = AtlasEZO_Sensors_e::UNKNOWN; + const uint8_t i2cAddressValues[] = { 0x63, 0x62, 0x64, 0x61, 0x6F + # if P103_USE_RTD + , 0x66 + # endif // if P103_USE_RTD + # if P103_USE_FLOW + , 0x68 + # endif // if P103_USE_FLOW + }; + constexpr int i2c_nr_elements = NR_ELEMENTS(i2cAddressValues); + + char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; switch (function) { @@ -62,21 +85,45 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) { strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_103)); strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_103)); + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[2], PSTR(PLUGIN_VALUENAME3_103)); // Only used for HUM + strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[3], PSTR(PLUGIN_VALUENAME4_103)); // Only used for HUM + break; + } + + case PLUGIN_SET_DEFAULTS: + { + P103_NR_OUTPUT_VALUES = 2; + + break; + } + + case PLUGIN_GET_DEVICEVALUECOUNT: + { + event->Par1 = P103_NR_OUTPUT_VALUES; // Depends on sensor + + success = true; + break; } case PLUGIN_I2C_HAS_ADDRESS: case PLUGIN_WEBFORM_SHOW_I2C_PARAMS: { - const uint8_t i2cAddressValues[] = { 0x61, 0x62, 0x63, 0x64 }; // , 0x65, 0x66, 0x67}; // Disabled unsupported devices as discussed - // here: https://github.com/letscontrolit/ESPEasy/pull/3733 (review - // comment by TD-er) + // Disabled unsupported devices as discussed + // here: https://github.com/letscontrolit/ESPEasy/pull/3733 (review comment by TD-er) if (function == PLUGIN_WEBFORM_SHOW_I2C_PARAMS) { - addFormSelectorI2C(F("i2c"), P103_ATLASEZO_I2C_NB_OPTIONS, i2cAddressValues, P103_I2C_ADDRESS); - addFormNote(F("pH: 0x63, ORP: 0x62, EC: 0x64, DO: 0x61. The plugin is able to detect the type of device automatically.")); + addFormSelectorI2C(F("i2c"), i2c_nr_elements, i2cAddressValues, P103_I2C_ADDRESS); + addFormNote(F("pH: 0x63, ORP: 0x62, EC: 0x64, DO: 0x61, HUM: 0x6F" + # if P103_USE_RTD + ", RTD: 0x66" + # endif // if P103_USE_RTD + # if P103_USE_FLOW + ", FLOW: 0x68" + # endif // if P103_USE_FLOW + ". The plugin can detect the type of device.")); } else { - success = intArrayContains(P103_ATLASEZO_I2C_NB_OPTIONS, i2cAddressValues, event->Par1); + success = intArrayContains(i2c_nr_elements, i2cAddressValues, event->Par1); } break; } @@ -96,35 +143,69 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) P103_addDisabler(); // JS function disabler(clear,single,l,h,dry,nul,atm) - char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + addFormCheckBox(F("Setup without sensor"), F("uncon"), P103_UNCONNECTED_SETUP == 1); - if (P103_send_I2C_command(P103_I2C_ADDRESS, F("i"), boarddata)) - { - String boardInfo(boarddata); + if (P103_send_I2C_command(P103_I2C_ADDRESS, F("i"), boarddata) || P103_UNCONNECTED_SETUP) { + const String boardInfo(boarddata); addRowLabel(F("Board type")); - String board = boardInfo.substring(boardInfo.indexOf(',') + 1, boardInfo.lastIndexOf(',')); - String version = boardInfo.substring(boardInfo.lastIndexOf(',') + 1); - addHtml(board); + String board = parseStringKeepCase(boardInfo, 2); + const String version = parseStringKeepCase(boardInfo, 3); - String boardTypes = F("pH ORP EC D.O."); - AtlasEZO_Sensors_e boardIDs[] = { + const String boardTypes = F("pH ORP EC D.O.HUM RTD FLO"); // Unsupported boards are still ignored + const AtlasEZO_Sensors_e boardIDs[] = { AtlasEZO_Sensors_e::PH, AtlasEZO_Sensors_e::ORP, AtlasEZO_Sensors_e::EC, AtlasEZO_Sensors_e::DO, + AtlasEZO_Sensors_e::HUM, + # if P103_USE_RTD + AtlasEZO_Sensors_e::RTD, + # endif // if P103_USE_RTD + # if P103_USE_FLOW + AtlasEZO_Sensors_e::FLOW, + # endif // if P103_USE_FLOW }; int bType = boardTypes.indexOf(board); + if ((board.isEmpty() || (bType == -1)) && P103_UNCONNECTED_SETUP) { + // Not recognized, lets assume I2C address is correct, so we can setup the options + for (uint8_t i = 0; i < i2c_nr_elements; ++i) { + if (i2cAddressValues[i] == P103_I2C_ADDRESS) { + bType = i * 4; // Divided im the next check + break; + } + } + } + if (bType > -1) { board_type = boardIDs[bType / 4]; + board = toString(board_type); } - P103_BOARD_TYPE = static_cast(board_type); + addHtml(board); - if (board_type == AtlasEZO_Sensors_e::UNKNOWN) - { - P103_html_red(F(" WARNING : Board type should be 'pH', 'ORP', 'EC' or 'DO', check your i2c address? ")); + P103_BOARD_TYPE = static_cast(board_type); + const int output_values[] = { 2, 2, 2, 2, 2, 4 + # if P103_USE_RTD + , 2 + # endif // if P103_USE_RTD + # if P103_USE_FLOW + , 3 + # endif // if P103_USE_FLOW + }; + P103_NR_OUTPUT_VALUES = output_values[P103_BOARD_TYPE]; + + + if (board_type == AtlasEZO_Sensors_e::UNKNOWN) { + P103_html_red(F(" WARNING : Board type should be 'pH', 'ORP', 'EC', 'DO', 'HUM'" + # if P103_USE_RTD + ", 'RTD'" + # endif // if P103_USE_RTD + # if P103_USE_FLOW + ", 'FLOW'" + # endif // if P103_USE_FLOW + ", check your i2c address?")); } addRowLabel(F("Board version")); addHtml(version); @@ -132,14 +213,18 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) addHtml(F("'); - } - else - { + } else { P103_html_red(F("Unable to send command to device")); - if (board_type == AtlasEZO_Sensors_e::UNKNOWN) - { - P103_html_red(F(" WARNING : Board type should be 'pH', 'ORP', 'EC' or 'DO', check your i2c address? ")); + if (board_type == AtlasEZO_Sensors_e::UNKNOWN) { + P103_html_red(F(" WARNING : Board type should be 'pH', 'ORP', 'EC', 'DO', 'HUM'" + # if P103_USE_RTD + ", 'RTD'" + # endif // if P103_USE_RTD + # if P103_USE_FLOW + ", 'FLOW'" + # endif // if P103_USE_FLOW + ", check your i2c address?")); } success = false; break; @@ -147,87 +232,81 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup - if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Status"), boarddata)) - { + if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Status"), boarddata) || P103_UNCONNECTED_SETUP) { String boardStatus(boarddata); addRowLabel(F("Board restart code")); - # ifndef BUILD_NO_DEBUG + # ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_DEBUG, boardStatus); - # endif // ifndef BUILD_NO_DEBUG + # endif // ifndef BUILD_NO_DEBUG - char *statuschar = strchr(boarddata, ','); + // FIXME tonhuisman: To improve + const String stat = parseStringKeepCase(boardStatus, 2); - if (statuschar > 0) - { - switch (boarddata[statuschar - boarddata + 1]) - { + if (!stat.isEmpty()) { + switch (stat[0]) { case 'P': - { addHtml(F("powered off")); break; - } case 'S': - { addHtml(F("software reset")); break; - } case 'B': - { addHtml(F("brown out")); break; - } case 'W': - { addHtml(F("watch dog")); break; - } case 'U': default: - { addHtml(F("unknown")); break; - } } } addRowLabel(F("Board voltage")); - addHtml(boardStatus.substring(boardStatus.lastIndexOf(',') + 1)); + addHtml(parseString(boardStatus, 3)); addUnit('V'); addRowLabel(F("Sensor Data")); addHtmlFloat(UserVar[event->BaseVarIndex]); - switch (board_type) - { + switch (board_type) { case AtlasEZO_Sensors_e::PH: - { addUnit(F("pH")); break; - } case AtlasEZO_Sensors_e::ORP: - { addUnit(F("mV")); break; - } case AtlasEZO_Sensors_e::EC: - { addUnit(F("µS")); break; - } case AtlasEZO_Sensors_e::DO: - { addUnit(F("mg/L")); break; + case AtlasEZO_Sensors_e::HUM: // TODO Show Temp & Dew point also + { + addUnit(F("%RH")); + break; + } + # if P103_USE_RTD + case AtlasEZO_Sensors_e::RTD: + { + addUnit(F("°C")); // TODO Read current scale (C/F/K) from device, show flow + break; } + # endif // if P103_USE_RTD + # if P103_USE_FLOW + case AtlasEZO_Sensors_e::FLOW: + addUnit(F("mL/min")); + break; + # endif // if P103_USE_FLOW case AtlasEZO_Sensors_e::UNKNOWN: break; } - } - else - { - P103_html_red(F("Unable to send status command to device")); + } else { + P103_html_red(F("Unable to send Status command to device")); success = false; break; } @@ -236,35 +315,30 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) addFormCheckBox(F("Status LED"), F("status_led"), P103_STATUS_LED); // Ability to see and change EC Probe Type (e.g., 0.1, 1.0, 10) - if (board_type == AtlasEZO_Sensors_e::EC) - { + if (board_type == AtlasEZO_Sensors_e::EC) { memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup - if (P103_send_I2C_command(P103_I2C_ADDRESS, F("K,?"), boarddata)) - { + if (P103_send_I2C_command(P103_I2C_ADDRESS, F("K,?"), boarddata)) { String ecProbeType(boarddata); - addFormTextBox(F("EC Probe Type"), F("ec_probe_type"), ecProbeType.substring(ecProbeType.lastIndexOf(',') + 1), 32); + addFormTextBox(F("EC Probe Type"), F("ec_probe_type"), parseString(ecProbeType, 2), 32); addFormCheckBox(F("Set Probe Type"), F("en_set_probe_type"), false); } } // calibrate - switch (board_type) - { + switch (board_type) { case AtlasEZO_Sensors_e::PH: { addFormSubHeader(F("pH Calibration")); - addFormNote(F( - "Calibration for pH-Probe could be 1 (single), 2 (single, low) or 3 point (single, low, high). The sequence is important.")); + addFormNote(F("Calibration for pH-Probe could be 1 (single), 2 (single, low) or 3 point (single, low, high)." + " The sequence is important.")); const int nb_calibration_points = P103_addCreate3PointCalibration(board_type, event, P103_I2C_ADDRESS, F("pH"), 0.0, 14.0, 2, 0.01); - if (nb_calibration_points > 1) - { + if (nb_calibration_points > 1) { memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup - if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Slope,?"), boarddata)) - { + if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Slope,?"), boarddata)) { addFormNote(concat(F("Answer to 'Slope' command : "), String(boarddata))); } } @@ -272,38 +346,44 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) } case AtlasEZO_Sensors_e::ORP: - { addFormSubHeader(F("ORP Calibration")); P103_addCreateSinglePointCalibration(board_type, event, P103_I2C_ADDRESS, F("mV"), 0.0, 1500.0, 0, 1.0); break; - } case AtlasEZO_Sensors_e::EC: - { addFormSubHeader(F("EC Calibration")); P103_addCreateDryCalibration(); P103_addCreate3PointCalibration(board_type, event, P103_I2C_ADDRESS, F("µS"), 0.0, 500000.0, 0, 1.0); break; - } case AtlasEZO_Sensors_e::DO: - { addFormSubHeader(F("DO Calibration")); P103_addDOCalibration(P103_I2C_ADDRESS); break; - } + + case AtlasEZO_Sensors_e::HUM: // No calibration + # if P103_USE_RTD + case AtlasEZO_Sensors_e::RTD: // TODO Decide what calibration data to retrieve/store + # endif // if P103_USE_RTD + # if P103_USE_FLOW + case AtlasEZO_Sensors_e::FLOW: // TODO Size/type of flow meter, default: 1/2", Flow rate, Conversion factor, Output values: total, + // flow rate + # endif // if P103_USE_FLOW case AtlasEZO_Sensors_e::UNKNOWN: break; } - // Clear calibration - P103_addClearCalibration(); + if ((AtlasEZO_Sensors_e::PH == board_type) || + (AtlasEZO_Sensors_e::ORP == board_type) || + (AtlasEZO_Sensors_e::EC == board_type)) { + // Clear calibration option, only when using calibration + P103_addClearCalibration(); + } // Temperature compensation - if ((board_type == AtlasEZO_Sensors_e::PH) || - (board_type == AtlasEZO_Sensors_e::EC) || - (board_type == AtlasEZO_Sensors_e::DO)) - { + if ((AtlasEZO_Sensors_e::PH == board_type) || + (AtlasEZO_Sensors_e::ORP == board_type) || + (AtlasEZO_Sensors_e::EC == board_type)) { ESPEASY_RULES_FLOAT_TYPE value{}; addFormSubHeader(F("Temperature compensation")); @@ -311,14 +391,20 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) LoadCustomTaskSettings(event->TaskIndex, reinterpret_cast(&deviceTemperatureTemplate), sizeof(deviceTemperatureTemplate)); ZERO_TERMINATE(deviceTemperatureTemplate); addFormTextBox(F("Temperature "), F("_template"), deviceTemperatureTemplate, sizeof(deviceTemperatureTemplate)); - addFormNote(F("You can use a formula and idealy refer to a temp sensor (directly, via ESPEasyP2P or MQTT import)," - " e.g. '[Pool#Temperature]'. If you don't have a sensor, you could type a fixed value like '25' or '25.5'.")); + addFormNote(F("You can use a formula and idealy refer to a temp sensor" + # ifndef LIMIT_BUILD_SIZE + " (directly, via ESPEasyP2P or MQTT import)," + " e.g. '[Pool#Temperature]'. If you don't have a sensor, you could" + # else // ifndef LIMIT_BUILD_SIZE + " or" + # endif // ifndef LIMIT_BUILD_SIZE + " type a fixed value like '25' or '25.5'." + )); String deviceTemperatureTemplateString(deviceTemperatureTemplate); - String pooltempString(parseTemplate(deviceTemperatureTemplateString, 40)); + const String pooltempString(parseTemplate(deviceTemperatureTemplateString)); - if (Calculate(pooltempString, value) != CalculateReturnCode::OK) - { + if (Calculate(pooltempString, value) != CalculateReturnCode::OK) { addFormNote(F("It seems I can't parse your formula. Fixed value will be used!")); value = P103_FIXED_TEMP_VALUE; } @@ -334,24 +420,22 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) { board_type = static_cast(P103_BOARD_TYPE); - P103_I2C_ADDRESS = getFormItemInt(F("i2c")); + P103_I2C_ADDRESS = getFormItemInt(F("i2c")); + P103_UNCONNECTED_SETUP = isFormItemChecked(F("uncon")) ? 1 : 0; P103_SENSOR_VERSION = getFormItemFloat(F("sensorVersion")); - char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + // char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; - if (isFormItemChecked(F("status_led"))) - { + P103_STATUS_LED = isFormItemChecked(F("status_led")); + + if (P103_STATUS_LED) { P103_send_I2C_command(P103_I2C_ADDRESS, F("L,1"), boarddata); - } - else - { + } else { P103_send_I2C_command(P103_I2C_ADDRESS, F("L,0"), boarddata); } - P103_STATUS_LED = isFormItemChecked(F("status_led")); - if ((board_type == AtlasEZO_Sensors_e::EC) && isFormItemChecked(F("en_set_probe_type"))) - { + if ((board_type == AtlasEZO_Sensors_e::EC) && isFormItemChecked(F("en_set_probe_type"))) { # ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_DEBUG, F("isFormItemChecked")); # endif // ifndef BUILD_NO_DEBUG @@ -368,58 +452,46 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) P103_CALIBRATION_LOW = getFormItemFloat(F("ref_cal_L")); P103_CALIBRATION_HIGH = getFormItemFloat(F("ref_cal_H")); - if (isFormItemChecked(F("en_cal_clear"))) - { + if (isFormItemChecked(F("en_cal_clear"))) { cmd += F("clear"); triggerCalibrate = true; - } - else if (isFormItemChecked(F("en_cal_dry"))) - { + } else if (isFormItemChecked(F("en_cal_dry"))) { cmd += F("dry"); triggerCalibrate = true; - } - else if (isFormItemChecked(F("en_cal_single"))) - { - if (board_type == AtlasEZO_Sensors_e::PH) - { + } else if (isFormItemChecked(F("en_cal_single"))) { + if (board_type == AtlasEZO_Sensors_e::PH) { cmd += F("mid,"); } cmd += P103_CALIBRATION_SINGLE; triggerCalibrate = true; - } - else if (isFormItemChecked(F("en_cal_L"))) - { + } else if (isFormItemChecked(F("en_cal_L"))) { cmd += F("low,"); cmd += P103_CALIBRATION_LOW; triggerCalibrate = true; - } - else if (isFormItemChecked(F("en_cal_H"))) - { + } else if (isFormItemChecked(F("en_cal_H"))) { cmd += F("high,"); cmd += P103_CALIBRATION_HIGH; triggerCalibrate = true; - } - else if (isFormItemChecked(F("en_cal_atm"))) - { + } else if (isFormItemChecked(F("en_cal_atm"))) { triggerCalibrate = true; - } - else if (isFormItemChecked(F("en_cal_0"))) - { + } else if (isFormItemChecked(F("en_cal_0"))) { cmd += '0'; triggerCalibrate = true; } - if (triggerCalibrate) - { + if (triggerCalibrate && + ((AtlasEZO_Sensors_e::PH == board_type) || + (AtlasEZO_Sensors_e::EC == board_type) || + (AtlasEZO_Sensors_e::DO == board_type)) + ) { memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup P103_send_I2C_command(P103_I2C_ADDRESS, cmd, boarddata); } - if ((board_type == AtlasEZO_Sensors_e::PH) || - (board_type == AtlasEZO_Sensors_e::EC) || - (board_type == AtlasEZO_Sensors_e::DO)) - { + if ((AtlasEZO_Sensors_e::PH == board_type) || + (AtlasEZO_Sensors_e::EC == board_type) || + (AtlasEZO_Sensors_e::DO == board_type)) { char deviceTemperatureTemplate[40] = { 0 }; String tmpString = webArg(F("_template")); safe_strncpy(deviceTemperatureTemplate, tmpString.c_str(), sizeof(deviceTemperatureTemplate) - 1); @@ -445,9 +517,9 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) String readCommand; - if ((board_type == AtlasEZO_Sensors_e::PH) || - (board_type == AtlasEZO_Sensors_e::EC) || - (board_type == AtlasEZO_Sensors_e::DO)) + if ((AtlasEZO_Sensors_e::PH == board_type) || + (AtlasEZO_Sensors_e::EC == board_type) || + (AtlasEZO_Sensors_e::DO == board_type)) { // first set the temperature of reading char deviceTemperatureTemplate[40] = { 0 }; @@ -455,41 +527,59 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) ZERO_TERMINATE(deviceTemperatureTemplate); String deviceTemperatureTemplateString(deviceTemperatureTemplate); - String temperatureString(parseTemplate(deviceTemperatureTemplateString, 40)); + String temperatureString(parseTemplate(deviceTemperatureTemplateString)); readCommand = F("RT,"); ESPEASY_RULES_FLOAT_TYPE temperatureReading{}; - if (Calculate(temperatureString, temperatureReading) != CalculateReturnCode::OK) - { + if (Calculate(temperatureString, temperatureReading) != CalculateReturnCode::OK) { temperatureReading = P103_FIXED_TEMP_VALUE; } readCommand += temperatureReading; } - else if (board_type == AtlasEZO_Sensors_e::ORP) - { + else if ((AtlasEZO_Sensors_e::ORP == board_type) || + (AtlasEZO_Sensors_e::HUM == board_type) + # if P103_USE_RTD + || (AtlasEZO_Sensors_e::RTD == board_type) + # endif // if P103_USE_RTD + # if P103_USE_FLOW + || (AtlasEZO_Sensors_e::FLOW == board_type) + # endif // if P103_USE_FLOW + ) { readCommand = F("R,"); } // ok, now we can read the sensor data - char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; - UserVar[event->BaseVarIndex] = -1; + // char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + UserVar[event->BaseVarIndex] = -1; + UserVar[event->BaseVarIndex + 1] = -1; + UserVar[event->BaseVarIndex + 2] = -1; - if (P103_send_I2C_command(P103_I2C_ADDRESS, readCommand, boarddata)) - { + if (P103_send_I2C_command(P103_I2C_ADDRESS, readCommand, boarddata)) { String sensorString(boarddata); - string2float(sensorString, UserVar[event->BaseVarIndex]); + string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex]); + + if (board_type == AtlasEZO_Sensors_e::HUM) { + string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 1]); + string2float(parseString(sensorString, 4), UserVar[event->BaseVarIndex + 2]); + } + + # if P103_USE_FLOW + + if (board_type == AtlasEZO_Sensors_e::FLOW) { + string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 1]); + } + # endif // if P103_USE_FLOW } // we read the voltagedata memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup UserVar[event->BaseVarIndex + 1] = -1; - if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Status"), boarddata)) - { + if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Status"), boarddata)) { String voltage(boarddata); - string2float(voltage.substring(voltage.lastIndexOf(',') + 1), UserVar[event->BaseVarIndex + 1]); + string2float(parseString(voltage, 2), UserVar[event->BaseVarIndex + 1]); } success = true; diff --git a/src/src/PluginStructs/P103_data_struct.cpp b/src/src/PluginStructs/P103_data_struct.cpp index 80cc6ba5c6..8d340fad7d 100644 --- a/src/src/PluginStructs/P103_data_struct.cpp +++ b/src/src/PluginStructs/P103_data_struct.cpp @@ -6,6 +6,24 @@ // The other containing an allocatted char array for answer // Returns true on success, false otherwise +const __FlashStringHelper* toString(AtlasEZO_Sensors_e sensor) { + switch (sensor) { + case AtlasEZO_Sensors_e::PH: return F("pH"); + case AtlasEZO_Sensors_e::ORP: return F("Oxidation Reduction Potential"); + case AtlasEZO_Sensors_e::EC: return F("Electric conductivity"); + case AtlasEZO_Sensors_e::DO: return F("Dissolved Oxigen"); + case AtlasEZO_Sensors_e::HUM: return F("Humidity"); + # if P103_USE_RTD + case AtlasEZO_Sensors_e::RTD: return F("Thermosensor"); + # endif // if P103_USE_RTD + # if P103_USE_FLOW + case AtlasEZO_Sensors_e::FLOW: return F("Flow meter"); + # endif // if P103_USE_FLOW + case AtlasEZO_Sensors_e::UNKNOWN: break; + } + return F("Unknown"); +} + bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensordata) { sensordata[0] = '\0'; @@ -28,7 +46,14 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda if (error != 0) { - addLog(LOG_LEVEL_ERROR, F("Wire.endTransmission() returns error: Check Atlas shield, pH, ORP, EC and DO are supported.")); + addLog(LOG_LEVEL_ERROR, F("Wire.endTransmission() returns error: Check Atlas shield, pH, ORP, EC, DO, HUM" + # if P103_USE_RTD + ", RTD" + # endif // if P103_USE_RTD + # if P103_USE_FLOW + ", FLOW" + # endif // if P103_USE_FLOW + " are supported.")); return false; } diff --git a/src/src/PluginStructs/P103_data_struct.h b/src/src/PluginStructs/P103_data_struct.h index f615e38964..a48a57d8d1 100644 --- a/src/src/PluginStructs/P103_data_struct.h +++ b/src/src/PluginStructs/P103_data_struct.h @@ -8,17 +8,40 @@ # include "../Globals/RulesCalculate.h" +# define P103_USE_RTD 0 // Defaults to UART, so disabled for now +# define P103_USE_FLOW 0 // Defaults to UART, so disabled for now + +# ifdef PLUGIN_SET_MAX // Enable RTD and FLOW for MAX builds +# if !P103_USE_RTD +# undef P103_USE_RTD +# define P103_USE_RTD 1 +# endif // if !P103_USE_RTD +# if !P103_USE_FLOW +# undef P103_USE_FLOW +# define P103_USE_FLOW 1 +# endif // if !P103_USE_FLOW +# endif // ifdef PLUGIN_SET_MAX + enum class AtlasEZO_Sensors_e : uint8_t { UNKNOWN = 0u, PH = 1u, ORP = 2u, EC = 3u, DO = 4u, + HUM = 5u, + # if P103_USE_RTD + RTD = 6u, // Defaults to UART, so disabled for now + # endif // if P103_USE_RTD + # if P103_USE_FLOW + FLOW = 7u, // Defaults to UART, so disabled for now + # endif // if P103_USE_FLOW }; # define P103_BOARD_TYPE PCONFIG(0) # define P103_I2C_ADDRESS PCONFIG(1) # define P103_STATUS_LED PCONFIG(2) +# define P103_NR_OUTPUT_VALUES PCONFIG(3) +# define P103_UNCONNECTED_SETUP PCONFIG(4) # define P103_SENSOR_VERSION PCONFIG_FLOAT(0) # define P103_CALIBRATION_SINGLE PCONFIG_FLOAT(1) # define P103_CALIBRATION_LOW PCONFIG_FLOAT(2) @@ -26,13 +49,14 @@ enum class AtlasEZO_Sensors_e : uint8_t { # define ATLAS_EZO_RETURN_ARRAY_SIZE 33 // Max expected result 32 bytes + \0 -# define P103_ATLASEZO_I2C_NB_OPTIONS 4 // was: 6 see comment below at 'const int i2cAddressValues' - # define P103_FIXED_TEMP_VALUE 20 // Temperature correction for pH and EC sensor if no temperature is given from calculation -bool P103_send_I2C_command(uint8_t I2Caddress, - const String& cmd, - char *sensordata); // Forward declarations +const __FlashStringHelper* toString(AtlasEZO_Sensors_e sensor); + + +bool P103_send_I2C_command(uint8_t I2Caddress, + const String& cmd, + char *sensordata); // Forward declarations void P103_addDisabler(); void P103_html_color_message(const __FlashStringHelper *color, From e10e8ddf449a8dc793cf4aae9311c982cfcd709e Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 22 Oct 2023 14:41:36 +0200 Subject: [PATCH 2/9] [P103] Fix some issues, add logging for analysis --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index a9455d1d92..5d377e06cf 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -16,6 +16,7 @@ // only i2c mode is supported /** Changelog: + * 2023-10-22 tonhuisman: Fix some irregularities, add logging for status read (UI) and value(s) read (INFO log) * 2023-10-17 tonhuisman: Add support for EZO HUM, RTD and FLOW sensor modules (I2C only!) (RTD, FLOW disabled, default to UART mode) * 2023-01-08 tonhuisman: Replace ambiguous #define UNKNOWN, move support functions to plugin_struct source * 2023-01-07 tonhuisman: Refactored strings (a.o. shorter names for WEBFORM_LOAD and WEBFORM_SAVE events), separate javascript function @@ -235,6 +236,9 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Status"), boarddata) || P103_UNCONNECTED_SETUP) { String boardStatus(boarddata); + addRowLabel(F("Board status")); + addHtml(boardStatus); + addRowLabel(F("Board restart code")); # ifndef BUILD_NO_DEBUG @@ -553,22 +557,24 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) // ok, now we can read the sensor data // char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; UserVar[event->BaseVarIndex] = -1; - UserVar[event->BaseVarIndex + 1] = -1; UserVar[event->BaseVarIndex + 2] = -1; + UserVar[event->BaseVarIndex + 3] = -1; if (P103_send_I2C_command(P103_I2C_ADDRESS, readCommand, boarddata)) { String sensorString(boarddata); + addLog(LOG_LEVEL_INFO, concat(F("P103: READ result: "), sensorString)); + string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex]); if (board_type == AtlasEZO_Sensors_e::HUM) { - string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 1]); - string2float(parseString(sensorString, 4), UserVar[event->BaseVarIndex + 2]); + string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 2]); + string2float(parseString(sensorString, 4), UserVar[event->BaseVarIndex + 3]); } # if P103_USE_FLOW if (board_type == AtlasEZO_Sensors_e::FLOW) { - string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 1]); + string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 2]); } # endif // if P103_USE_FLOW } From 9c3e769cf1141eed5f2fda5da7f7efeeaa379056 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sun, 22 Oct 2023 21:55:56 +0200 Subject: [PATCH 3/9] [P103] Fix more issues, add/apply settings for EZO-HUM --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 73 ++++++++++++++++++---- src/src/PluginStructs/P103_data_struct.cpp | 30 +++++++++ src/src/PluginStructs/P103_data_struct.h | 24 ++++--- 3 files changed, 104 insertions(+), 23 deletions(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index 5d377e06cf..5684a0c3d8 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -16,6 +16,8 @@ // only i2c mode is supported /** Changelog: + * 2023-10-22 tonhuisman: Fix more irregularities, read configured EZO-HUM output options, and add options to enable/disable + * Temperature and Dew point values * 2023-10-22 tonhuisman: Fix some irregularities, add logging for status read (UI) and value(s) read (INFO log) * 2023-10-17 tonhuisman: Add support for EZO HUM, RTD and FLOW sensor modules (I2C only!) (RTD, FLOW disabled, default to UART mode) * 2023-01-08 tonhuisman: Replace ambiguous #define UNKNOWN, move support functions to plugin_struct source @@ -25,6 +27,8 @@ * Reuse char arrays instead of instantiating a new one */ +# include "src/PluginStructs/P103_data_struct.h" + # define PLUGIN_103 # define PLUGIN_ID_103 103 # define PLUGIN_NAME_103 "Environment - Atlas EZO pH ORP EC DO HUM" @@ -36,11 +40,9 @@ # endif // if P103_USE_FLOW # define PLUGIN_VALUENAME1_103 "SensorData" # define PLUGIN_VALUENAME2_103 "Voltage" -# define PLUGIN_VALUENAME3_103 "Temperature" // Only used for HUM +# define PLUGIN_VALUENAME3_103 "Temperature" // TODO Only used for HUM TODO: Fix for EZO-FLOW extra reading # define PLUGIN_VALUENAME4_103 "Dewpoint" // Only used for HUM -# include "src/PluginStructs/P103_data_struct.h" - boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) { boolean success = false; @@ -58,6 +60,10 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + bool _HUMhasHum = true; // EZO-HUM options (& defaults) + bool _HUMhasTemp = false; + bool _HUMhasDew = false; + switch (function) { case PLUGIN_DEVICE_ADD: @@ -122,7 +128,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) # if P103_USE_FLOW ", FLOW: 0x68" # endif // if P103_USE_FLOW - ". The plugin can detect the type of device.")); + ". The plugin can recognize the type of device.")); } else { success = intArrayContains(i2c_nr_elements, i2cAddressValues, event->Par1); } @@ -173,7 +179,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) // Not recognized, lets assume I2C address is correct, so we can setup the options for (uint8_t i = 0; i < i2c_nr_elements; ++i) { if (i2cAddressValues[i] == P103_I2C_ADDRESS) { - bType = i * 4; // Divided im the next check + bType = i * 4; // Divided in the next check break; } } @@ -289,9 +295,27 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) case AtlasEZO_Sensors_e::DO: addUnit(F("mg/L")); break; - case AtlasEZO_Sensors_e::HUM: // TODO Show Temp & Dew point also + case AtlasEZO_Sensors_e::HUM: // TODO Show Temp & Dew point also { addUnit(F("%RH")); + memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup + + if (P103_getHUMOutputOptions(event, + _HUMhasHum, + _HUMhasTemp, + _HUMhasDew)) { + if (_HUMhasTemp) { + addRowLabel(F("Temperature")); + addHtmlFloat(UserVar[event->BaseVarIndex + 2]); + addUnit(F("°C")); + } + + if (_HUMhasDew) { + addRowLabel(F("Dew point")); + addHtmlFloat(UserVar[event->BaseVarIndex + 3]); + addUnit(F("°C")); + } + } break; } # if P103_USE_RTD @@ -325,7 +349,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) if (P103_send_I2C_command(P103_I2C_ADDRESS, F("K,?"), boarddata)) { String ecProbeType(boarddata); - addFormTextBox(F("EC Probe Type"), F("ec_probe_type"), parseString(ecProbeType, 2), 32); + addFormTextBox(F("EC Probe Type"), F("ec_probe_type"), parseStringKeepCase(ecProbeType, 2), 32); addFormCheckBox(F("Set Probe Type"), F("en_set_probe_type"), false); } } @@ -416,6 +440,12 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) addFormNote(concat(F("Actual value: "), toString(value, 2))); } + if (AtlasEZO_Sensors_e::HUM == board_type) { + addFormSubHeader(F("EZO-HUM Options")); + addFormCheckBox(F("Enable Temperature reading"), F("hum_temp"), _HUMhasTemp); + addFormCheckBox(F("Enable Dew point reading"), F("hum_dew"), _HUMhasTemp); + } + success = true; break; } @@ -429,8 +459,6 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) P103_SENSOR_VERSION = getFormItemFloat(F("sensorVersion")); - // char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; - P103_STATUS_LED = isFormItemChecked(F("status_led")); if (P103_STATUS_LED) { @@ -505,6 +533,25 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) sizeof(deviceTemperatureTemplate))); } + if ((AtlasEZO_Sensors_e::HUM == board_type) && P103_getHUMOutputOptions(event, + _HUMhasHum, + _HUMhasTemp, + _HUMhasDew)) { + if (!_HUMhasHum) { // If humidity not enabled, then enable it + P103_send_I2C_command(P103_I2C_ADDRESS, F("O,Hum,1"), boarddata); + } + bool _humOpt = isFormItemChecked(F("hum_temp")); + + if (_humOpt != _HUMhasTemp) { + P103_send_I2C_command(P103_I2C_ADDRESS, concat(F("O,T,"), _humOpt ? 1 : 0), boarddata); + } + _humOpt = isFormItemChecked(F("hum_dew")); + + if (_humOpt != _HUMhasDew) { + P103_send_I2C_command(P103_I2C_ADDRESS, concat(F("O,Dew,"), _humOpt ? 1 : 0), boarddata); + } + } + success = true; break; } @@ -564,17 +611,17 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) String sensorString(boarddata); addLog(LOG_LEVEL_INFO, concat(F("P103: READ result: "), sensorString)); - string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex]); + string2float(parseString(sensorString, 1), UserVar[event->BaseVarIndex]); if (board_type == AtlasEZO_Sensors_e::HUM) { - string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 2]); - string2float(parseString(sensorString, 4), UserVar[event->BaseVarIndex + 3]); + string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex + 2]); + string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 3]); } # if P103_USE_FLOW if (board_type == AtlasEZO_Sensors_e::FLOW) { - string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 2]); + string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex + 2]); } # endif // if P103_USE_FLOW } diff --git a/src/src/PluginStructs/P103_data_struct.cpp b/src/src/PluginStructs/P103_data_struct.cpp index 8d340fad7d..edfae8f96c 100644 --- a/src/src/PluginStructs/P103_data_struct.cpp +++ b/src/src/PluginStructs/P103_data_struct.cpp @@ -336,4 +336,34 @@ int P103_addCreate3PointCalibration(AtlasEZO_Sensors_e board_type, return nb_calibration_points; } +bool P103_getHUMOutputOptions(struct EventStruct *event, + bool & _HUMhasHum, + bool & _HUMhasTemp, + bool & _HUMhasDew) { + bool result = false; + + char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + + if ((result = P103_send_I2C_command(P103_I2C_ADDRESS, F("O,?"), boarddata))) { + String outputs(boarddata); + int o = 2; + String outPar = parseString(outputs, o); + + while (!outPar.isEmpty()) { + if (equals(outPar, F("hum"))) { + _HUMhasHum = true; + } else + if (equals(outPar, F("t"))) { + _HUMhasTemp = true; + } else + if (equals(outPar, F("dew"))) { + _HUMhasDew = true; + } + o++; + outPar = parseString(outputs, o); + } + } + return result; +} + #endif // ifdef USES_P103 diff --git a/src/src/PluginStructs/P103_data_struct.h b/src/src/PluginStructs/P103_data_struct.h index a48a57d8d1..7975af3d9a 100644 --- a/src/src/PluginStructs/P103_data_struct.h +++ b/src/src/PluginStructs/P103_data_struct.h @@ -11,16 +11,16 @@ # define P103_USE_RTD 0 // Defaults to UART, so disabled for now # define P103_USE_FLOW 0 // Defaults to UART, so disabled for now -# ifdef PLUGIN_SET_MAX // Enable RTD and FLOW for MAX builds -# if !P103_USE_RTD -# undef P103_USE_RTD -# define P103_USE_RTD 1 -# endif // if !P103_USE_RTD -# if !P103_USE_FLOW -# undef P103_USE_FLOW -# define P103_USE_FLOW 1 -# endif // if !P103_USE_FLOW -# endif // ifdef PLUGIN_SET_MAX +// # ifdef PLUGIN_SET_MAX // Enable RTD and FLOW for MAX builds +// # if !P103_USE_RTD +// # undef P103_USE_RTD +// # define P103_USE_RTD 1 +// # endif // if !P103_USE_RTD +// # if !P103_USE_FLOW +// # undef P103_USE_FLOW +// # define P103_USE_FLOW 1 +// # endif // if !P103_USE_FLOW +// # endif // ifdef PLUGIN_SET_MAX enum class AtlasEZO_Sensors_e : uint8_t { UNKNOWN = 0u, @@ -84,6 +84,10 @@ int P103_addCreate3PointCalibration(AtlasEZO_Sensors_e board_type, float max, uint8_t nrDecimals, float stepsize); +bool P103_getHUMOutputOptions(struct EventStruct *event, + bool & _HUMhasHum, + bool & _HUMhasTemp, + bool & _HUMhasDew); #endif // ifdef USED_P103 #endif // ifndef PLUGINSTRUCTS_P103_DATA_STRUCT_H From 48f8b8daba93c28e493ff248cde001d5c1a07230 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Mon, 23 Oct 2023 21:03:33 +0200 Subject: [PATCH 4/9] [P103] Handle EZO-HUM firmware issue of unexpected 'Dew' in output --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index 5684a0c3d8..84051e33a9 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -16,6 +16,9 @@ // only i2c mode is supported /** Changelog: + * 2023-10-23 tonhuisman: Handle EZO-HUM firmware issue of including 'Dew,' in the result values + * // TODO Rewrite plugin using PluginDataStruct so it will allow proper async handling of commands requiring 300 msec delay before reading + * responses * 2023-10-22 tonhuisman: Fix more irregularities, read configured EZO-HUM output options, and add options to enable/disable * Temperature and Dew point values * 2023-10-22 tonhuisman: Fix some irregularities, add logging for status read (UI) and value(s) read (INFO log) @@ -613,9 +616,14 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) string2float(parseString(sensorString, 1), UserVar[event->BaseVarIndex]); - if (board_type == AtlasEZO_Sensors_e::HUM) { + if (board_type == AtlasEZO_Sensors_e::HUM) { // TODO Fix reading Dew point without Temperature enabled string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex + 2]); - string2float(parseString(sensorString, 3), UserVar[event->BaseVarIndex + 3]); + String dewVal = parseString(sensorString, 3); + + if (equals(dewVal, F("dew"))) { // Handle EZO-HUM firmware bug including 'Dew,' in the result string + dewVal = parseString(sensorString, 4); + } + string2float(dewVal, UserVar[event->BaseVarIndex + 3]); } # if P103_USE_FLOW From 156266449c2577e0472e0113d8fc68b90228fe5e Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Thu, 1 Feb 2024 23:32:15 +0100 Subject: [PATCH 5/9] [P103] Fix to apply new `UserVar` usage --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index afee4eaa03..dae76e36ca 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -610,36 +610,42 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) } // ok, now we can read the sensor data - char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + // char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup UserVar.setFloat(event->TaskIndex, 0, -1); if (P103_send_I2C_command(P103_I2C_ADDRESS, readCommand, boarddata)) { String sensorString(boarddata); addLog(LOG_LEVEL_INFO, concat(F("P103: READ result: "), sensorString)); - float tmpFloat{}; - string2float(parseString(sensorString, 1), tmpFloat); - UserVar.setFloat(event->TaskIndex, 0, tmpFloat); + float sensor_f{}; + + if (string2float(parseString(sensorString, 1), sensor_f)) { + UserVar.setFloat(event->TaskIndex, 0, sensor_f); + } if (board_type == AtlasEZO_Sensors_e::HUM) { // TODO Fix reading Dew point without Temperature enabled - string2float(parseString(sensorString, 2), tmpFloat); - UserVar.setFloat(event->TaskIndex, 2, tmpFloat); + if (string2float(parseString(sensorString, 2), sensor_f)) { + UserVar.setFloat(event->TaskIndex, 2, sensor_f); + } String dewVal = parseString(sensorString, 3); if (equals(dewVal, F("dew"))) { // Handle EZO-HUM firmware bug including 'Dew,' in the result string dewVal = parseString(sensorString, 4); } - string2float(dewVal, tmpFloat); - UserVar.setFloat(event->TaskIndex, 3, tmpFloat); + + if (string2float(dewVal, sensor_f)) { + UserVar.setFloat(event->TaskIndex, 3, sensor_f); + } } # if P103_USE_FLOW - if (board_type == AtlasEZO_Sensors_e::FLOW) { - string2float(parseString(sensorString, 2), UserVar[event->BaseVarIndex + 2]); + if ((board_type == AtlasEZO_Sensors_e::FLOW) && + string2float(parseString(sensorString, 2), sensor_f)) { + UserVar.setFloat(event->TaskIndex, 2, sensor_f); } # endif // if P103_USE_FLOW - float sensor_f{}; string2float(sensorString, sensor_f); UserVar.setFloat(event->TaskIndex, 0, sensor_f); } From 085255743d9e134a85a3d53e2bc35892aebe77a3 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 19 Oct 2024 17:29:07 +0200 Subject: [PATCH 6/9] [P103] Javascript fixes, code improvements --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 84 +++++++------------ src/src/PluginStructs/P103_data_struct.cpp | 94 +++++++++++++--------- src/src/PluginStructs/P103_data_struct.h | 11 +-- 3 files changed, 88 insertions(+), 101 deletions(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index dae76e36ca..ec2553f7bd 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -16,6 +16,7 @@ // only i2c mode is supported /** Changelog: + * 2024-10-19 tonhuisman: Fix javascript errors, some code improvements * 2023-10-23 tonhuisman: Handle EZO-HUM firmware issue of including 'Dew,' in the result values * // TODO Rewrite plugin using PluginDataStruct so it will allow proper async handling of commands requiring 300 msec delay before reading * responses @@ -61,7 +62,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) }; constexpr int i2c_nr_elements = NR_ELEMENTS(i2cAddressValues); - char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE]{}; bool _HUMhasHum = true; // EZO-HUM options (& defaults) bool _HUMhasTemp = false; @@ -71,17 +72,14 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) { case PLUGIN_DEVICE_ADD: { - Device[++deviceCount].Number = PLUGIN_ID_103; - Device[deviceCount].Type = DEVICE_TYPE_I2C; - Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_DUAL; - Device[deviceCount].Ports = 0; - Device[deviceCount].PullUpOption = false; - Device[deviceCount].InverseLogicOption = false; - Device[deviceCount].FormulaOption = true; - Device[deviceCount].ValueCount = 2; - Device[deviceCount].SendDataOption = true; - Device[deviceCount].TimerOption = true; - Device[deviceCount].GlobalSyncOption = true; + Device[++deviceCount].Number = PLUGIN_ID_103; + Device[deviceCount].Type = DEVICE_TYPE_I2C; + Device[deviceCount].VType = Sensor_VType::SENSOR_TYPE_DUAL; + Device[deviceCount].Ports = 0; + Device[deviceCount].FormulaOption = true; + Device[deviceCount].ValueCount = 2; + Device[deviceCount].SendDataOption = true; + Device[deviceCount].TimerOption = true; break; } @@ -248,34 +246,16 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) addRowLabel(F("Board status")); addHtml(boardStatus); - addRowLabel(F("Board restart code")); - # ifndef BUILD_NO_DEBUG - addLog(LOG_LEVEL_DEBUG, boardStatus); + addLog(LOG_LEVEL_DEBUG, concat(F("Board status: "), boardStatus)); # endif // ifndef BUILD_NO_DEBUG - // FIXME tonhuisman: To improve + addRowLabel(F("Board restart code")); + const String stat = parseStringKeepCase(boardStatus, 2); if (!stat.isEmpty()) { - switch (stat[0]) { - case 'P': - addHtml(F("powered off")); - break; - case 'S': - addHtml(F("software reset")); - break; - case 'B': - addHtml(F("brown out")); - break; - case 'W': - addHtml(F("watch dog")); - break; - case 'U': - default: - addHtml(F("unknown")); - break; - } + addHtml(P103_statusToString(stat[0])); } addRowLabel(F("Board voltage")); @@ -283,7 +263,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) addUnit('V'); addRowLabel(F("Sensor Data")); - addHtmlFloat(UserVar[event->BaseVarIndex]); + addHtmlFloat(UserVar.getFloat(event->TaskIndex, 0)); switch (board_type) { case AtlasEZO_Sensors_e::PH: @@ -298,8 +278,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) case AtlasEZO_Sensors_e::DO: addUnit(F("mg/L")); break; - case AtlasEZO_Sensors_e::HUM: // TODO Show Temp & Dew point also - { + case AtlasEZO_Sensors_e::HUM: addUnit(F("%RH")); memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup @@ -309,24 +288,21 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) _HUMhasDew)) { if (_HUMhasTemp) { addRowLabel(F("Temperature")); - addHtmlFloat(UserVar[event->BaseVarIndex + 2]); + addHtmlFloat(UserVar.getFloat(event->TaskIndex, 2)); addUnit(F("°C")); } if (_HUMhasDew) { addRowLabel(F("Dew point")); - addHtmlFloat(UserVar[event->BaseVarIndex + 3]); + addHtmlFloat(UserVar.getFloat(event->TaskIndex, 3)); addUnit(F("°C")); } } break; - } # if P103_USE_RTD case AtlasEZO_Sensors_e::RTD: - { addUnit(F("°C")); // TODO Read current scale (C/F/K) from device, show flow break; - } # endif // if P103_USE_RTD # if P103_USE_FLOW case AtlasEZO_Sensors_e::FLOW: @@ -418,11 +394,11 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) ESPEASY_RULES_FLOAT_TYPE value{}; addFormSubHeader(F("Temperature compensation")); - char deviceTemperatureTemplate[40] = { 0 }; + char deviceTemperatureTemplate[40]{}; LoadCustomTaskSettings(event->TaskIndex, reinterpret_cast(&deviceTemperatureTemplate), sizeof(deviceTemperatureTemplate)); ZERO_TERMINATE(deviceTemperatureTemplate); addFormTextBox(F("Temperature "), F("_template"), deviceTemperatureTemplate, sizeof(deviceTemperatureTemplate)); - addFormNote(F("You can use a formula and idealy refer to a temp sensor" + addFormNote(F("You can use a formula and ideally refer to a temp sensor" # ifndef LIMIT_BUILD_SIZE " (directly, via ESPEasyP2P or MQTT import)," " e.g. '[Pool#Temperature]'. If you don't have a sensor, you could" @@ -463,20 +439,15 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) P103_SENSOR_VERSION = getFormItemFloat(F("sensorVersion")); - P103_STATUS_LED = isFormItemChecked(F("status_led")); + P103_STATUS_LED = isFormItemChecked(F("status_led")) ? 1 : 0; - if (P103_STATUS_LED) { - P103_send_I2C_command(P103_I2C_ADDRESS, F("L,1"), boarddata); - } else { - P103_send_I2C_command(P103_I2C_ADDRESS, F("L,0"), boarddata); - } + P103_send_I2C_command(P103_I2C_ADDRESS, concat(F("L,"), P103_STATUS_LED), boarddata); if ((board_type == AtlasEZO_Sensors_e::EC) && isFormItemChecked(F("en_set_probe_type"))) { # ifndef BUILD_NO_DEBUG addLog(LOG_LEVEL_DEBUG, F("isFormItemChecked")); # endif // ifndef BUILD_NO_DEBUG - String probeType(F("K,")); - probeType += webArg(F("ec_probe_type")); + const String probeType = concat(F("K,"), webArg(F("ec_probe_type"))); memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup P103_send_I2C_command(P103_I2C_ADDRESS, probeType, boarddata); } @@ -532,8 +503,8 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) if ((AtlasEZO_Sensors_e::PH == board_type) || (AtlasEZO_Sensors_e::EC == board_type) || (AtlasEZO_Sensors_e::DO == board_type)) { - char deviceTemperatureTemplate[40] = { 0 }; - String tmpString = webArg(F("_template")); + char deviceTemperatureTemplate[40]{}; + String tmpString = webArg(F("_template")); safe_strncpy(deviceTemperatureTemplate, tmpString.c_str(), sizeof(deviceTemperatureTemplate) - 1); ZERO_TERMINATE(deviceTemperatureTemplate); // be sure that our string ends with a \0 @@ -581,12 +552,12 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) (AtlasEZO_Sensors_e::DO == board_type)) { // first set the temperature of reading - char deviceTemperatureTemplate[40] = { 0 }; + char deviceTemperatureTemplate[40]{}; LoadCustomTaskSettings(event->TaskIndex, reinterpret_cast(&deviceTemperatureTemplate), sizeof(deviceTemperatureTemplate)); ZERO_TERMINATE(deviceTemperatureTemplate); String deviceTemperatureTemplateString(deviceTemperatureTemplate); - String temperatureString(parseTemplate(deviceTemperatureTemplateString)); + const String temperatureString(parseTemplate(deviceTemperatureTemplateString)); readCommand = F("RT,"); ESPEASY_RULES_FLOAT_TYPE temperatureReading{}; @@ -610,7 +581,6 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) } // ok, now we can read the sensor data - // char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup UserVar.setFloat(event->TaskIndex, 0, -1); diff --git a/src/src/PluginStructs/P103_data_struct.cpp b/src/src/PluginStructs/P103_data_struct.cpp index 2d81395d2d..19d95a5a88 100644 --- a/src/src/PluginStructs/P103_data_struct.cpp +++ b/src/src/PluginStructs/P103_data_struct.cpp @@ -2,28 +2,41 @@ #ifdef USES_P103 -// Call this function with two char arrays, one containing the command -// The other containing an allocatted char array for answer -// Returns true on success, false otherwise - const __FlashStringHelper* toString(AtlasEZO_Sensors_e sensor) { switch (sensor) { - case AtlasEZO_Sensors_e::PH: return F("pH"); - case AtlasEZO_Sensors_e::ORP: return F("Oxidation Reduction Potential"); - case AtlasEZO_Sensors_e::EC: return F("Electric conductivity"); - case AtlasEZO_Sensors_e::DO: return F("Dissolved Oxigen"); - case AtlasEZO_Sensors_e::HUM: return F("Humidity"); + case AtlasEZO_Sensors_e::PH: return F("pH (Potential of Hydrogen)"); + case AtlasEZO_Sensors_e::ORP: return F("ORP (Oxidation Reduction Potential)"); + case AtlasEZO_Sensors_e::EC: return F("EC (Electric conductivity)"); + case AtlasEZO_Sensors_e::DO: return F("DO (Dissolved Oxigen)"); + case AtlasEZO_Sensors_e::HUM: return F("HUM (Humidity)"); # if P103_USE_RTD - case AtlasEZO_Sensors_e::RTD: return F("Thermosensor"); + case AtlasEZO_Sensors_e::RTD: return F("RTD (Thermosensor)"); # endif // if P103_USE_RTD # if P103_USE_FLOW - case AtlasEZO_Sensors_e::FLOW: return F("Flow meter"); + case AtlasEZO_Sensors_e::FLOW: return F("FLOW (Flow meter)"); # endif // if P103_USE_FLOW case AtlasEZO_Sensors_e::UNKNOWN: break; } return F("Unknown"); } +const __FlashStringHelper* P103_statusToString(char status) { + switch (status) { + case 'P': + return F("powered off"); + case 'S': + return F("software reset"); + case 'B': + return F("brown out"); + case 'W': + return F("watch dog"); + case 'U': + default: + break; + } + return F("unknown"); +} + bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensordata) { sensordata[0] = '\0'; @@ -41,6 +54,7 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda } # endif // ifndef BUILD_NO_DEBUG Wire.beginTransmission(I2Caddress); + for (size_t i = 0; i < cmd.length(); ++i) { Wire.write(static_cast(cmd[i])); } @@ -78,7 +92,7 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda in_char = Wire.read(); if (in_char == 0) - { // if we receive a null caracter, we're done + { // if we receive a null character, we're done while (Wire.available()) { // purge the data line if needed Wire.read(); @@ -88,7 +102,7 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda } else { - if (sensor_bytes_received > ATLAS_EZO_RETURN_ARRAY_SIZE) + if (sensor_bytes_received >= ATLAS_EZO_RETURN_ARRAY_SIZE) { addLog(LOG_LEVEL_ERROR, F("< result array to short!")); return false; @@ -102,7 +116,6 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda switch (i2c_response_code) { case 1: - { # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { @@ -110,7 +123,6 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda } # endif // ifndef BUILD_NO_DEBUG break; - } case 2: # ifndef BUILD_NO_DEBUG @@ -137,8 +149,8 @@ bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, char *sensorda int P103_getCalibrationPoints(uint8_t i2cAddress) { - int nb_calibration_points = -1; - char sensordata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + int nb_calibration_points = -1; + char sensordata[ATLAS_EZO_RETURN_ARRAY_SIZE]{}; if (P103_send_I2C_command(i2cAddress, F("Cal,?"), sensordata)) { @@ -177,25 +189,29 @@ void P103_html_green(const String& message) { void P103_addDisabler() { // disabler(): argument(s) on 'true' will set that checkbox to false! non-boolean ignores argument // addHtml(F("\n")); // Minified: addHtml(F("\n")); } @@ -203,7 +219,7 @@ void P103_addClearCalibration() { addRowLabel(F("Clear calibration")); addFormCheckBox(F("Clear"), F("en_cal_clear"), false); - addHtml(F("\n")); + addHtml(F("\n")); addFormNote(F("Attention! This will reset all calibrated data. New calibration will be needed!!!")); } @@ -221,11 +237,11 @@ int P103_addDOCalibration(uint8_t I2Cchoice) addRowLabel(F("Calibrate to atmospheric oxygen levels")); addFormCheckBox(F("Enable"), F("en_cal_atm"), false); - addHtml(F("\n")); + addHtml(F("\n")); addRowLabel(F("Calibrate device to 0 dissolved oxygen")); addFormCheckBox(F("Enable"), F("en_cal_0"), false); - addHtml(F("\n")); + addHtml(F("\n")); if (nb_calibration_points > 0) { @@ -243,7 +259,7 @@ void P103_addCreateDryCalibration() { addRowLabel(F("Dry calibration")); addFormCheckBox(F("Enable"), F("en_cal_dry"), false); - addHtml(F("\n")); + addHtml(F("\n")); addFormNote(F("Dry calibration must always be done first!")); addFormNote(F("Calibration for pH-Probe could be 1 (single) or 2 point (low, high).")); } @@ -288,7 +304,7 @@ int P103_addCreateSinglePointCalibration(AtlasEZO_Sensors_e board_type, } } addFormCheckBox(F("Enable"), F("en_cal_single"), false); - addHtml(F("\n")); + addHtml(F("\n")); return nb_calibration_points; } @@ -317,7 +333,7 @@ int P103_addCreate3PointCalibration(AtlasEZO_Sensors_e board_type, P103_html_orange(F("Not yet calibrated")); } addFormCheckBox(F("Enable"), F("en_cal_L"), false); - addHtml(F("\n")); + addHtml(F("\n")); addRowLabel(F("High calibration")); addFormFloatNumberBox(F("Ref high point"), F("ref_cal_H"), P103_CALIBRATION_HIGH, min, max, nrDecimals, stepsize); @@ -333,7 +349,7 @@ int P103_addCreate3PointCalibration(AtlasEZO_Sensors_e board_type, P103_html_orange(F("Not yet calibrated")); } addFormCheckBox(F("Enable"), F("en_cal_H"), false); - addHtml(F("\n")); + addHtml(F("\n")); return nb_calibration_points; } @@ -344,7 +360,7 @@ bool P103_getHUMOutputOptions(struct EventStruct *event, bool & _HUMhasDew) { bool result = false; - char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE] = { 0 }; + char boarddata[ATLAS_EZO_RETURN_ARRAY_SIZE]{}; if ((result = P103_send_I2C_command(P103_I2C_ADDRESS, F("O,?"), boarddata))) { String outputs(boarddata); diff --git a/src/src/PluginStructs/P103_data_struct.h b/src/src/PluginStructs/P103_data_struct.h index 7975af3d9a..5dd82a4d64 100644 --- a/src/src/PluginStructs/P103_data_struct.h +++ b/src/src/PluginStructs/P103_data_struct.h @@ -51,12 +51,13 @@ enum class AtlasEZO_Sensors_e : uint8_t { # define P103_FIXED_TEMP_VALUE 20 // Temperature correction for pH and EC sensor if no temperature is given from calculation +// Forward declarations const __FlashStringHelper* toString(AtlasEZO_Sensors_e sensor); - +const __FlashStringHelper* P103_statusToString(char status); bool P103_send_I2C_command(uint8_t I2Caddress, const String& cmd, - char *sensordata); // Forward declarations + char *sensordata); void P103_addDisabler(); void P103_html_color_message(const __FlashStringHelper *color, @@ -85,9 +86,9 @@ int P103_addCreate3PointCalibration(AtlasEZO_Sensors_e board_type, uint8_t nrDecimals, float stepsize); bool P103_getHUMOutputOptions(struct EventStruct *event, - bool & _HUMhasHum, - bool & _HUMhasTemp, - bool & _HUMhasDew); + bool & _HUMhasHum, + bool & _HUMhasTemp, + bool & _HUMhasDew); #endif // ifdef USED_P103 #endif // ifndef PLUGINSTRUCTS_P103_DATA_STRUCT_H From ce60f4342434c044cd2f876201f0039d92cd7c6f Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 19 Oct 2024 20:43:25 +0200 Subject: [PATCH 7/9] [Build] Fix: Use package with Solo1 'autodetect' (Solo1 specific packaged removed) --- platformio_esp32_solo1.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_esp32_solo1.ini b/platformio_esp32_solo1.ini index 9854619dc8..4f90b20fad 100644 --- a/platformio_esp32_solo1.ini +++ b/platformio_esp32_solo1.ini @@ -3,7 +3,7 @@ [esp32_solo1_common_LittleFS] extends = esp32_base_idf5 platform = https://github.com/Jason2866/platform-espressif32.git#Arduino/IDF53 -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/3020/framework-arduinoespressif32-solo1-release_v5.3-98aecc7e.zip +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/3085/framework-arduinoespressif32-all-release_v5.3-4c885a26.zip build_flags = ${esp32_base_idf5.build_flags} -DFEATURE_ARDUINO_OTA=1 -DUSE_LITTLEFS From 568dddfaa31334a2c41e6de74a0da90a9c7bfc42 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 16 Nov 2024 22:53:21 +0100 Subject: [PATCH 8/9] [P103] Add documentation --- docs/source/Plugin/P103.rst | 129 +++++++++++++++++- .../Plugin/P103_DeviceConfiguration.png | Bin 0 -> 55778 bytes docs/source/Plugin/P103_Device_DO.png | Bin 0 -> 20320 bytes .../Plugin/P103_Device_DO_Calibration.png | Bin 0 -> 9887 bytes docs/source/Plugin/P103_Device_EC.png | Bin 0 -> 20280 bytes .../Plugin/P103_Device_EC_Calibration.png | Bin 0 -> 40240 bytes docs/source/Plugin/P103_Device_HUM.png | Bin 0 -> 20132 bytes .../source/Plugin/P103_Device_HUM_Options.png | Bin 0 -> 4438 bytes docs/source/Plugin/P103_Device_HUM_Values.png | Bin 0 -> 10734 bytes docs/source/Plugin/P103_Device_ORP.png | Bin 0 -> 20837 bytes .../Plugin/P103_Device_ORP_Calibration.png | Bin 0 -> 25060 bytes docs/source/Plugin/P103_Device_pH.png | Bin 0 -> 20776 bytes .../Plugin/P103_Device_pH_Calibration.png | Bin 0 -> 38079 bytes .../Plugin/_plugin_substitutions_p10x.repl | 10 +- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 22 +-- 15 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 docs/source/Plugin/P103_DeviceConfiguration.png create mode 100644 docs/source/Plugin/P103_Device_DO.png create mode 100644 docs/source/Plugin/P103_Device_DO_Calibration.png create mode 100644 docs/source/Plugin/P103_Device_EC.png create mode 100644 docs/source/Plugin/P103_Device_EC_Calibration.png create mode 100644 docs/source/Plugin/P103_Device_HUM.png create mode 100644 docs/source/Plugin/P103_Device_HUM_Options.png create mode 100644 docs/source/Plugin/P103_Device_HUM_Values.png create mode 100644 docs/source/Plugin/P103_Device_ORP.png create mode 100644 docs/source/Plugin/P103_Device_ORP_Calibration.png create mode 100644 docs/source/Plugin/P103_Device_pH.png create mode 100644 docs/source/Plugin/P103_Device_pH_Calibration.png diff --git a/docs/source/Plugin/P103.rst b/docs/source/Plugin/P103.rst index 4560326cb7..e2c984bca9 100644 --- a/docs/source/Plugin/P103.rst +++ b/docs/source/Plugin/P103.rst @@ -27,13 +27,134 @@ Datasheet: |P103_datasheet| Description ----------- +Several Atlas Scientific EZO sensors are supported by this plugin. Only I2C communication is supported, some sensors use that by default, and most other sensors can be re-configured from RS232 to I2C communication. +Currently there is support for: +* **pH**: Potential of Hydrogen (Acidity) -.. Events -.. ~~~~~~ +* **ORP**: Oxidation Reduction Potential + +* **EC**: Electrical Conductivity + +* **DO**: Dissolved Oxigen + +* **HUM**: Humidity (Can also provide Temperature and Dewpoint measurements) + +Device configuration +-------------------- + +.. image:: P103_DeviceConfiguration.png + +* **Name**: A unique name should be entered here. + +* **Enabled**: The device can be disabled or enabled. When not enabled the device should not use any resources. + +I2C options +^^^^^^^^^^^ + +The available settings here depend on the build used. At least the **Force Slow I2C speed** option is available, but selections for the I2C Multiplexer can also be shown. For details see the :ref:`Hardware_page` + +When loading the Device configuration page, the plugin will try to detect the type of sensor connected based on the selected I2C addresses. If no sensor is found, the message in red will be shown. + +If no sensor is connected, the configuration can still be shown by selecting the **Setup without sensor** checkbox, choosing the I2C address for the intended sensor, and submitting the page. + +Device settings +^^^^^^^^^^^^^^^ + +Board +^^^^^ + +This section shows relevant information, obtained from the sensor if actually connected. + +* **Status LED**: The status led on the sensor can be enabled or disabled, using this checkbox. + +For each board there are different device parameters available, but when using the device simulation, no actual device information is available, so no data is shown. + +Board pH +^^^^^^^^ + +.. image:: P103_Device_pH.png + +pH Calibration +^^^^^^^^^^^^^^ + +For the pH sensor, some calibration may be needed. The simulated device doesn't have any calibration data set. + +.. image:: P103_Device_pH_Calibration.png + +For compensation of temperature, either a fixed temperature or a value from a connected temperature sensor can be selected. For this connected temperature sensor, the ``[#]`` notation can be used. This will will be evaluated when the value is needed. + +Board ORP +^^^^^^^^^ + +.. image:: P103_Device_ORP.png + +ORP Calibration +^^^^^^^^^^^^^^^ + +For the ORP sensor, some calibration may be needed. The simulated device doesn't have any calibration data set. + +.. image:: P103_Device_ORP_Calibration.png + +For compensation of temperature, either a fixed temperature or a value from a connected temperature sensor can be selected. For this connected temperature sensor, the ``[#]`` notation can be used. This will will be evaluated when the value is needed. + +Board EC +^^^^^^^^ + +.. image:: P103_Device_EC.png + +EC Calibration +^^^^^^^^^^^^^^ + +For the EC sensor, some calibration may be needed. The simulated device doesn't have any calibration data set. + +.. image:: P103_Device_EC_Calibration.png + +For compensation of temperature, either a fixed temperature or a value from a connected temperature sensor can be selected. For this connected temperature sensor, the ``[#]`` notation can be used. This will will be evaluated when the value is needed. + +Board DO +^^^^^^^^ + +.. image:: P103_Device_DO.png + +DO Calibration +^^^^^^^^^^^^^^ + +For the DO sensor, some calibration may be needed. The simulated device doesn't have any calibration data set. + +.. image:: P103_Device_DO_Calibration.png + +Board HUM +^^^^^^^^^ + +.. image:: P103_Device_HUM.png + +HUM Calibration +^^^^^^^^^^^^^^^ + +For the HUM sensor, no calibration can be adjusted, but options to enable the Temperature and/or Dew-point measurements are available. + +.. image:: P103_Device_HUM_Options.png + +To make the Temperature and Dew-point available for use, extra values are available: + +.. image:: P103_Device_HUM_Values.png + +Data Acquisition +^^^^^^^^^^^^^^^^ + +This group of settings, **Single event with all values**, **Send to Controller** and **Interval** settings are standard available configuration items. Send to Controller is only visible when one or more Controllers are configured. + +* **Interval** By default, Interval will be set to 60 sec. The data will be collected and optionally sent to any configured controllers using this interval. + +Values +^^^^^^ + +For all sensors, the **SensorData** and **Voltage** values are available. For the **HUM** Humidity sensor, also **Temperature** and **Dew-point** values are available, but have to be enabled in options to return a sensible value. + +In selected builds, per Value **Stats** options are available, that when enabled, will gather the measured data and present most recent data in a graph, as described here: :ref:`Task Value Statistics: ` -.. .. include:: P103_events.repl @@ -43,4 +164,6 @@ Change log .. versionchanged:: 2.0 ... + |added| 2023-10-17 Add HUM sensor + |added| 2020-04-25 diff --git a/docs/source/Plugin/P103_DeviceConfiguration.png b/docs/source/Plugin/P103_DeviceConfiguration.png new file mode 100644 index 0000000000000000000000000000000000000000..08b3cb3848bed0f6b87d0f8887eb377cc31bf7c4 GIT binary patch literal 55778 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_DO.png b/docs/source/Plugin/P103_Device_DO.png new file mode 100644 index 0000000000000000000000000000000000000000..45ee0f97bfe5285b1bd2a3aa13a09eb63a99d908 GIT binary patch literal 20320 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 G5}E*#0-I<6 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_DO_Calibration.png b/docs/source/Plugin/P103_Device_DO_Calibration.png new file mode 100644 index 0000000000000000000000000000000000000000..aca47b6a7ee985064f6089993bf44835fc3719a8 GIT binary patch literal 9887 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_EC.png b/docs/source/Plugin/P103_Device_EC.png new file mode 100644 index 0000000000000000000000000000000000000000..f68c3220e0848ec50cc0e3092280b66c1a7c620d GIT binary patch literal 20280 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 z zN8I9bfbT9B`_xezbL~K;;u(57Y#R~XfHCwHWo3h^b*p6eE_s~jSvkI8dHL04>f2PP zhiOI|%+Ai_(-&CYO~b+Z?Q%+Be@ik&4^obUuK;|`A#@k4_>Bb>m*2wG10wo@X%`qM%5$wr&U!VaP9p!+>Bh0ja~5t zoKawqH)F_sP-o;ZihG9U#@NSuj8p2xI-!-AJU8z4as;)6U1;c0y7DogUG+IozcN7JhEMDWTXxdVWXQu6`iB3Z{i!1GaHB z5jxvGdB<{^Cau6`sXT?$0??$oUcK zoL}Y+MrnA9*7yy-*fVK4&aD0Gs`sK6W*JVN8A#!uiIdNrVkkPHJAg6#Nn?J%m!lGW zpF8w8B7*7e&lk+HKUDnjcva1=vON3IUL7Vr6|rDn9dJ6!TePRvKSgF4kT_yslMO;x zP~UA%WAYb(kz0lX0rM%T>*6y9c@?`nAA~|GuHL+WPPJ^Ru2KT7dx5WzUyh!p@nJD8jBVeKH4GA>^LjwU~#ZEi(e z4h23~MXmqA9l3X92kFa)?0R@TA;ExZ_2oL}8H*WyH*!IJ@^?rjCkXhUkVM1*9}9-d zMG&)E=$b&>?6G|Zkddtmd!)MW%x%#sx4)?TA)o@mCrW`}#Xv#?#{1Hq9)@iSSbHyd zLTmOuH>$^Ikz8WZM3^5XBEM>Mx@@WS`O7}>_ylP9v;6;>4*4H0B4SZsut#Vc z!Gs&kZzpsl8D?ON^-~BK_M#vzaa9Qr@_bHZbsPXAk!}jY$q<03F5laE>@7yKaPo>r zI1pK*HLGDf#loqM7ZSifl56Jyva)Tqna)3dmmCL_`CI9@H+TS>atW1fY4pS$lvV53 zm3+D*nOd8mX@e7mhJwkNv&~}wu8-$HnT#@K?XTeMV5|4Gcm;6R_(@ye@&-twwY(8& z8<0qqiWm#h4u)n~tq@w?G07~h?HzlE;*HfRQx-*ck(+e**QVlA!73hfespQVvzhSq zvlCgpCFKk1_cEWJFzk(+x!c>aa7{^k+5hoc{`P#438|z!AD(1?CA`O}JyT6;h6$V) z?QSc(6`aJr8Z675_u7{X1(B7Db$Xqv#VrzWwQ6S)(2tyrr#40aZo8woS5KTQe~eVK z@u0^}^AG$dr{R)8Hi#FlngH{i97rv6QF4mU0c-xT!m7ywbteuEritOQu(~2dyV+GB zB3Ey@nTfqQ4tN9EyC|+_lWUG>AllBqL40C6yX_@6cGeA)kMJ62)!_0pMcBwGoAi+J z2hH2=;nix|8d1XB(UD*aNVW|>=^f}KO_5v+Sup`x{PR{88P`zt3a3GSc=6>zKsxyC zQP%n3ozTRm;{Vr-5LX@MA7(AxwAG~}v2ar2!=p~p0oX?yo4AMtOlS`ke* zwZ#SPt$ltV&nL~#eRK}MG2kN+UYRN@8Fw8u1G=J>1=glBKFBuN=*rA%|eYuBGigVF!E&eO`a^sr%RxPe5 zcEnjX7a=)&)exHm0QaHJ9xbjzd#6{J(Ig-UbhueI%|4u`Pw3hd=6^i?|2W4dEA>3j zVAE!kZ9;1aTYZk1H*B)+s%59Nk`Cc8Y&4c;ry}0t#6{D*KN2CpjQ-K!ZREp<9;zpS z9WSbk0y~*{vsOPP2{kW-bSKAUIW-_p5!OUKP1!j;`q{MqyoCqwE*lX6h&DTm=}qnO%M+ z+bjy7�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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_EC_Calibration.png b/docs/source/Plugin/P103_Device_EC_Calibration.png new file mode 100644 index 0000000000000000000000000000000000000000..3809304f0a2c6a6c0f1a34b6801b2f0d579e0c15 GIT binary patch literal 40240 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 Lgay$3j%WW37mpK* literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_HUM.png b/docs/source/Plugin/P103_Device_HUM.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd7d3b2d4aee87672cb0832e2076d79645362ae GIT binary patch literal 20132 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 literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_HUM_Options.png b/docs/source/Plugin/P103_Device_HUM_Options.png new file mode 100644 index 0000000000000000000000000000000000000000..ea727f8c1160379e10001813e8e3c453ec5358e5 GIT binary patch literal 4438 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 S18+gYlpO6{j!}=EzVr`U0A;EG literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_HUM_Values.png b/docs/source/Plugin/P103_Device_HUM_Values.png new file mode 100644 index 0000000000000000000000000000000000000000..926054d61efe9f088c86ee019a2c8614d90a46e9 GIT binary patch literal 10734 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%0DCOz^@yxl+mJI?~csp@QuYa`7AV| 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 b`SbsCjhb0m*at(P+Za4u{an^LB{Ts5fePCZ literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_ORP_Calibration.png b/docs/source/Plugin/P103_Device_ORP_Calibration.png new file mode 100644 index 0000000000000000000000000000000000000000..eafe6288038672ea005cc73baa5e86a33ab4b82b GIT binary patch literal 25060 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 aOg`7cp$~6u-|{0yop$p)UUBr&?f(M9Hj)1T literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_pH.png b/docs/source/Plugin/P103_Device_pH.png new file mode 100644 index 0000000000000000000000000000000000000000..389477d8c04f78ec0072b5bb6d5abcf958926f25 GIT binary patch literal 20776 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 E0Pv)1p#T5? literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/P103_Device_pH_Calibration.png b/docs/source/Plugin/P103_Device_pH_Calibration.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbcb770fca68401c2f609cd1457e7692a889af2 GIT binary patch literal 38079 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 Sq(79@V`Xl8uKdik2mb?dr#Dyt literal 0 HcmV?d00001 diff --git a/docs/source/Plugin/_plugin_substitutions_p10x.repl b/docs/source/Plugin/_plugin_substitutions_p10x.repl index 87af9e5666..84cc1e7d1b 100644 --- a/docs/source/Plugin/_plugin_substitutions_p10x.repl +++ b/docs/source/Plugin/_plugin_substitutions_p10x.repl @@ -37,16 +37,16 @@ .. |P102_compileinfo| replace:: `.` .. |P102_usedlibraries| replace:: https://github.com/olehs/PZEM004T -.. |P103_name| replace:: :cyan:`Atlas Scientific EZO pH` +.. |P103_name| replace:: :cyan:`Atlas Scientific EZO pH ORP EC DO HUM` .. |P103_type| replace:: :cyan:`Environment` -.. |P103_typename| replace:: :cyan:`Environment - Atlas Scientific EZO pH` +.. |P103_typename| replace:: :cyan:`Environment - Atlas Scientific EZO pH ORP EC DO HUM` .. |P103_porttype| replace:: `.` .. |P103_status| replace:: :yellow:`CLIMATE` -.. |P103_github| replace:: P103_Atlas_EZO_pH.ino -.. _P103_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P103_Atlas_EZO_pH.ino +.. |P103_github| replace:: P103_Atlas_EZO_pH_ORP_EC_DO.ino +.. _P103_github: https://github.com/letscontrolit/ESPEasy/blob/mega/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino .. |P103_usedby| replace:: `.` .. |P103_shortinfo| replace:: `.` -.. |P103_maintainer| replace:: TD-er +.. |P103_maintainer| replace:: `TD-er tonhuisman` .. |P103_compileinfo| replace:: `.` .. |P103_usedlibraries| replace:: `.` .. |P103_datasheet| replace:: https://atlas-scientific.com/files/pH_EZO_Datasheet.pdf diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index ec2553f7bd..2f283c4b20 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -186,7 +186,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) } } - if (bType > -1) { + if ((bType > -1) && (bType / 4 < NR_ELEMENTS(boardIDs))) { board_type = boardIDs[bType / 4]; board = toString(board_type); } @@ -241,7 +241,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup if (P103_send_I2C_command(P103_I2C_ADDRESS, F("Status"), boarddata) || P103_UNCONNECTED_SETUP) { - String boardStatus(boarddata); + const String boardStatus(boarddata); addRowLabel(F("Board status")); addHtml(boardStatus); @@ -326,7 +326,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) memset(boarddata, 0, ATLAS_EZO_RETURN_ARRAY_SIZE); // Cleanup if (P103_send_I2C_command(P103_I2C_ADDRESS, F("K,?"), boarddata)) { - String ecProbeType(boarddata); + const String ecProbeType(boarddata); addFormTextBox(F("EC Probe Type"), F("ec_probe_type"), parseStringKeepCase(ecProbeType, 2), 32); addFormCheckBox(F("Set Probe Type"), F("en_set_probe_type"), false); @@ -385,12 +385,13 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) (AtlasEZO_Sensors_e::EC == board_type)) { // Clear calibration option, only when using calibration P103_addClearCalibration(); - } - // Temperature compensation - if ((AtlasEZO_Sensors_e::PH == board_type) || - (AtlasEZO_Sensors_e::ORP == board_type) || - (AtlasEZO_Sensors_e::EC == board_type)) { + // } + + // Temperature compensation + // if ((AtlasEZO_Sensors_e::PH == board_type) || + // (AtlasEZO_Sensors_e::ORP == board_type) || + // (AtlasEZO_Sensors_e::EC == board_type)) { ESPEASY_RULES_FLOAT_TYPE value{}; addFormSubHeader(F("Temperature compensation")); @@ -411,8 +412,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) String deviceTemperatureTemplateString(deviceTemperatureTemplate); const String pooltempString(parseTemplate(deviceTemperatureTemplateString)); - if (Calculate(pooltempString, value) != CalculateReturnCode::OK) - { + if (Calculate(pooltempString, value) != CalculateReturnCode::OK) { addFormNote(F("Formula parse error. Using fixed value!")); value = P103_FIXED_TEMP_VALUE; } @@ -421,7 +421,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) } if (AtlasEZO_Sensors_e::HUM == board_type) { - addFormSubHeader(F("EZO-HUM Options")); + addFormSubHeader(F("HUM Options")); addFormCheckBox(F("Enable Temperature reading"), F("hum_temp"), _HUMhasTemp); addFormCheckBox(F("Enable Dew point reading"), F("hum_dew"), _HUMhasTemp); } From 5e5516ee2bc993a38082d6125c7031011c079fb6 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 16 Nov 2024 23:49:29 +0100 Subject: [PATCH 9/9] [P103] Fix cast issue --- src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino index 2f283c4b20..bda8579e01 100644 --- a/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino +++ b/src/_P103_Atlas_EZO_pH_ORP_EC_DO.ino @@ -186,7 +186,7 @@ boolean Plugin_103(uint8_t function, struct EventStruct *event, String& string) } } - if ((bType > -1) && (bType / 4 < NR_ELEMENTS(boardIDs))) { + if ((bType > -1) && ((size_t)(bType / 4) < NR_ELEMENTS(boardIDs))) { board_type = boardIDs[bType / 4]; board = toString(board_type); }