diff --git a/examples/OneOpenAir/OneOpenAir.ino b/examples/OneOpenAir/OneOpenAir.ino index 0424336..9d98010 100644 --- a/examples/OneOpenAir/OneOpenAir.ino +++ b/examples/OneOpenAir/OneOpenAir.ino @@ -944,6 +944,12 @@ void initializeNetwork() { agSerial->setDebug(true); } + String httpDomain = configuration.getHttpDomain(); + if (httpDomain != "") { + agClient->setHttpDomain(httpDomain.c_str()); + Serial.printf("HTTP request domain set to: %s\n", httpDomain.c_str()); + } + if (!agClient->begin(ag->deviceId().c_str())) { oledDisplay.setText("Client", "initialization", "failed"); delay(5000); @@ -1041,6 +1047,16 @@ static void configUpdateHandle() { initMqtt(); } + String httpDomain = configuration.getHttpDomain(); + if (httpDomain != "") { + Serial.printf("HTTP request domain set to: %s\n", httpDomain.c_str()); + agClient->setHttpDomain(httpDomain.c_str()); + } else { + // Its empty, set to default + Serial.println("HTTP domain from configuration empty, set to default"); + agClient->setHttpDomainDefault(); + } + if (configuration.hasSensorSGP) { if (configuration.noxLearnOffsetChanged() || configuration.tvocLearnOffsetChanged()) { diff --git a/src/AgConfigure.cpp b/src/AgConfigure.cpp index 9f931c0..1f9b87c 100644 --- a/src/AgConfigure.cpp +++ b/src/AgConfigure.cpp @@ -46,6 +46,7 @@ JSON_PROP_DEF(abcDays); JSON_PROP_DEF(tvocLearningOffset); JSON_PROP_DEF(noxLearningOffset); JSON_PROP_DEF(mqttBrokerUrl); +JSON_PROP_DEF(httpDomain); JSON_PROP_DEF(temperatureUnit); JSON_PROP_DEF(configurationControl); JSON_PROP_DEF(postDataToAirGradient); @@ -68,6 +69,7 @@ JSON_PROP_DEF(rhum); #define jprop_tvocLearningOffset_default 12 #define jprop_noxLearningOffset_default 12 #define jprop_mqttBrokerUrl_default "" +#define jprop_httpDomain_default "" #define jprop_temperatureUnit_default "c" #define jprop_configurationControl_default String(CONFIGURATION_CONTROL_NAME[ConfigurationControl::ConfigurationControlBoth]) #define jprop_postDataToAirGradient_default true @@ -377,6 +379,7 @@ void Configuration::defaultConfig(void) { jconfig[jprop_country] = jprop_country_default; jconfig[jprop_mqttBrokerUrl] = jprop_mqttBrokerUrl_default; + jconfig[jprop_httpDomain] = jprop_httpDomain_default; jconfig[jprop_configurationControl] = jprop_configurationControl_default; jconfig[jprop_pmStandard] = jprop_pmStandard_default; jconfig[jprop_temperatureUnit] = jprop_temperatureUnit_default; @@ -735,7 +738,7 @@ bool Configuration::parse(String data, bool isLocal) { jconfig[jprop_mqttBrokerUrl] = broker; } } else { - failedMessage = "\"mqttBrokerUrl\" length should <= 255"; + failedMessage = "\"mqttBrokerUrl\" length should less than 255 character"; jsonInvalid(); return false; } @@ -754,6 +757,32 @@ bool Configuration::parse(String data, bool isLocal) { } } + if (isLocal) { + if (JSON.typeof_(root[jprop_httpDomain]) == "string") { + String httpDomain = root[jprop_httpDomain]; + String oldHttpDomain = jconfig[jprop_httpDomain]; + if (httpDomain.length() <= 255) { + if (httpDomain != oldHttpDomain) { + changed = true; + configLogInfo(String(jprop_httpDomain), oldHttpDomain, httpDomain); + jconfig[jprop_httpDomain] = httpDomain; + } + } else { + failedMessage = "\"httpDomain\" length should less than 255 character"; + jsonInvalid(); + return false; + } + } + else { + if (jsonTypeInvalid(root[jprop_httpDomain], "string")) { + failedMessage = + jsonTypeInvalidMessage(String(jprop_httpDomain), "string"); + jsonInvalid(); + return false; + } + } + } + if (JSON.typeof_(root[jprop_temperatureUnit]) == "string") { String unit = root[jprop_temperatureUnit]; String oldUnit = jconfig[jprop_temperatureUnit]; @@ -1036,6 +1065,16 @@ String Configuration::getMqttBrokerUri(void) { return broker; } +/** + * @brief Get HTTP domain for post measures and get configuration + * + * @return String http domain, might be empty string + */ +String Configuration::getHttpDomain(void) { + String httpDomain = jconfig[jprop_httpDomain]; + return httpDomain; +} + /** * @brief Get configuratoin post data to AirGradient cloud * @@ -1121,7 +1160,7 @@ bool Configuration::isUpdated(void) { } String Configuration::jsonTypeInvalidMessage(String name, String type) { - return "'" + name + "' type invalid, it's should '" + type + "'"; + return "'" + name + "' type is invalid, expecting '" + type + "'"; } String Configuration::jsonValueInvalidMessage(String name, String value) { @@ -1275,6 +1314,18 @@ void Configuration::toConfig(const char *buf) { logInfo("toConfig: mqttBroker changed"); } + /** validate http domain */ + if (JSON.typeof_(jconfig[jprop_httpDomain]) != "string") { + isConfigFieldInvalid = true; + } else { + isConfigFieldInvalid = false; + } + if (isConfigFieldInvalid) { + changed = true; + jconfig[jprop_httpDomain] = jprop_httpDomain_default; + logInfo("toConfig: httpDomain changed"); + } + /** Validate temperature unit */ if (JSON.typeof_(jconfig[jprop_temperatureUnit]) != "string") { isConfigFieldInvalid = true; diff --git a/src/AgConfigure.h b/src/AgConfigure.h index 8a453d6..49785d4 100644 --- a/src/AgConfigure.h +++ b/src/AgConfigure.h @@ -82,6 +82,7 @@ public: String getLedBarModeName(void); bool getDisplayMode(void); String getMqttBrokerUri(void); + String getHttpDomain(void); bool isPostDataToAirGradient(void); ConfigurationControl getConfigurationControl(void); bool isCo2CalibrationRequested(void); diff --git a/src/Libraries/airgradient-client b/src/Libraries/airgradient-client index 938a928..f8a455c 160000 --- a/src/Libraries/airgradient-client +++ b/src/Libraries/airgradient-client @@ -1 +1 @@ -Subproject commit 938a92830d090bbd3ae100007040fb404220c551 +Subproject commit f8a455c548a18570ad845c121dd1252939c3439f