diff --git a/docs/commands.json b/docs/commands.json index 2937df4..9dcc06d 100644 --- a/docs/commands.json +++ b/docs/commands.json @@ -53,7 +53,7 @@ "params": null }, { - "cmd": "getTankLevel", + "cmd": "getTankInfo", "params": null }, { diff --git a/include/config.h b/include/config.h index abf1a51..8e1bf56 100644 --- a/include/config.h +++ b/include/config.h @@ -88,7 +88,14 @@ public: file.close(); // close config file before unmounting filesystem }; - void updateConfig(ArduinoJson::JsonDocument &json) + ArduinoJson::JsonDocument& getConfig() + { + std::lock_guard lock(m_mutex); + serialize(); + return m_configJson; + } + + void setConfig(const ArduinoJson::JsonDocument &json) { std::lock_guard lock(m_mutex); { @@ -97,8 +104,9 @@ public: deserialize(); saveConfig(); }; // filesystem is unmounted here - delay(500); - esp_restart(); // configuration updates trigger a cpu restart + LOG_WARN("setConfig will cause restart!"); + delay(5000); + esp_restart(); } void resetConfig() @@ -150,8 +158,8 @@ private: auto ethernet = m_configJson["ethernet"].to(); ethernet["hostname"] = m_ethHostname; ethernet["ipAddr"] = m_ethIpAddr; - ethernet["netmask "] = m_ethNetmask; - ethernet["gateway "] = m_ethGateway; + ethernet["netmask"] = m_ethNetmask; + ethernet["gateway"] = m_ethGateway; }; { @@ -188,6 +196,7 @@ private: mqtt["loopTime"] = m_mqttLoopTime; mqtt["clientName"] = m_mqttClientName; mqtt["retries"] = m_mqttRetries; + mqtt["keepalive"] = m_mqttKeepalive; auto publish = mqtt["publish"].to(); for (auto v : m_mqttPublish) { @@ -235,10 +244,11 @@ private: auto temperature = m_configJson["temperature"]; m_tempExpectedSensors = temperature["expectedSensors"].as(); auto values = temperature["correctionValues"].as(); + m_tempCorrectionValues.clear(); m_tempCorrectionValues.reserve(values.size()); for (auto v : values) { - m_tempCorrectionValues.push_back(v.as()); + m_tempCorrectionValues.emplace_back(v.as()); } }; @@ -255,7 +265,8 @@ private: m_mqttHost = mqtt["host"].as(); m_mqttPort = mqtt["port"].as(); m_mqttLoopTime = mqtt["loopTime"].as(); - m_mqttRetries = mqtt["retries"].as(); + m_mqttKeepalive = mqtt["keepalive"].as(); + m_mqttRetries = mqtt["retries"].as(); auto subscribe = mqtt["subsribe"].as(); for (auto v : subscribe) { @@ -304,6 +315,7 @@ public: std::string m_mqttHost = "10.0.2.249"; uint16_t m_mqttPort = 1883; uint16_t m_mqttLoopTime = 100; // in milliseconds + uint8_t m_mqttKeepalive = 15; uint8_t m_mqttRetries = 5; std::string m_mqttClientName = "etcontrollerPRO"; diff --git a/lib/RS485/busdelay.h b/lib/RS485/busdelay.h index 493842d..720b29a 100644 --- a/lib/RS485/busdelay.h +++ b/lib/RS485/busdelay.h @@ -17,7 +17,7 @@ namespace drivers const uint32_t wait = now - lastAccess; if (wait < minDelay) { - LOG_WARN(title, "delay", wait); + LOG_DEBUG(title, "delay", wait); delay(wait); } } diff --git a/src/commands.cpp b/src/commands.cpp index 089dd25..727f55b 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -2,6 +2,61 @@ namespace commands { + + // CONFIG // + // CONFIG // + const ArduinoJson::JsonDocument Commands::setConfig(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + auto &conf = Config::getInstance(); + auto values = response["values"].to(); + if (params.isNull()) + { + values["status"] = "Invalid"; + } + else + { + conf.setConfig(params); + values["status"] = "Valid"; + } + return response; + } + const ArduinoJson::JsonDocument Commands::getConfig(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + auto &conf = Config::getInstance(); + response["cmd"] = "getConfig"; + response["values"] = conf.getConfig(); + return response; + } + // CONFIG // + // CONFIG // + + // CRONJOBS // + // CRONJOBS // + const ArduinoJson::JsonDocument Commands::setCronjob(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("setCronjob not yet implemented"); + return response; + } + const ArduinoJson::JsonDocument Commands::getCronjob(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("getCronjob not yet implemented"); + return response; + } + const ArduinoJson::JsonDocument Commands::delCronjob(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("delCronjob not yet implemented"); + return response; + } + // CRONJOBS // + // CRONJOBS // + + // SETTERS // + // SETTERS // const ArduinoJson::JsonDocument Commands::setHPlimit(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) { ArduinoJson::JsonDocument response; @@ -27,6 +82,24 @@ namespace commands return response; } + const ArduinoJson::JsonDocument Commands::setHeating(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::setIrrigation(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + // SETTERS // + // SETTERS // + + // GETTERS // + // GETTERS // const ArduinoJson::JsonDocument Commands::getHPpower(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) { ArduinoJson::JsonDocument response; @@ -41,10 +114,62 @@ namespace commands return response; } - const ArduinoJson::JsonDocument Commands::setHeating(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + const ArduinoJson::JsonDocument Commands::getHPlimit(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) { ArduinoJson::JsonDocument response; - LOG_WARN("setHeating not yet implemented"); + LOG_WARN("Comand not yet implemented"); return response; } + + const ArduinoJson::JsonDocument Commands::getInputStatus(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::getOutputStatus(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::getTemperatures(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::getWaterInfo(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::getTankInfo(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::getRainInfo(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + + const ArduinoJson::JsonDocument Commands::getIrrigation(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms) + { + ArduinoJson::JsonDocument response; + LOG_WARN("Comand not yet implemented"); + return response; + } + // GETTERS // + // GETTERS // + } \ No newline at end of file diff --git a/src/commands.h b/src/commands.h index 83d62df..a44e3ed 100644 --- a/src/commands.h +++ b/src/commands.h @@ -6,11 +6,12 @@ #include #include +#include #include namespace commands { - enum RO + enum RO // relay output channels { P1, P2, @@ -28,7 +29,8 @@ namespace commands AUX, RETURN, NC_3, - NC_4 + NC_4, + RO_MAX // unused to detect invalid values }; const std::map c_hpLimitsMap = {{"P1", RO::P1}, @@ -52,14 +54,46 @@ namespace commands Commands() = delete; public: + // CONFIG // + static const ArduinoJson::JsonDocument setConfig(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getConfig(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + + // CRONJOBS // + static const ArduinoJson::JsonDocument setCronjob(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getCronjob(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument delCronjob(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + + // SETTERS // static const ArduinoJson::JsonDocument setHPlimit(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); - static const ArduinoJson::JsonDocument getHPpower(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); static const ArduinoJson::JsonDocument setHeating(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument setIrrigation(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + + // GETTERS // + static const ArduinoJson::JsonDocument getHPpower(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getHPlimit(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getInputStatus(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getOutputStatus(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getTemperatures(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getWaterInfo(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getTankInfo(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getRainInfo(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); + static const ArduinoJson::JsonDocument getIrrigation(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms); }; static const std::map> commandMap = { + {"setConfig", Commands::setConfig}, + {"getConfig", Commands::getConfig}, + + {"setCronjob", Commands::setCronjob}, + {"getCronjob", Commands::getCronjob}, + {"delCronjob", Commands::delCronjob}, + {"setHPlimit", Commands::setHPlimit}, + {"setHeating", Commands::setHeating}, + {"setIrrigation", Commands::setIrrigation}, + {"getHPpower", Commands::getHPpower}, - {"setHeating", Commands::setHeating}}; + {"setHeating", Commands::setHeating}, + }; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 298f85c..7738bbb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -69,7 +69,7 @@ void loop() if (commands::commandMap.contains(cmd)) { // call command from command map in this same thread (the MQTT thread) LOG_INFO("Executing command", cmd.c_str()); - auto answer = std::move(commands::commandMap.at(cmd)(devices, params)); + auto answer = std::move(commands::commandMap.at(cmd)(devices, params)); // here the magic happens if (answer.isNull()) return; mqtt.publish(conf.m_mqttPublish["answers"], answer); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 2282988..4cfe363 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1,12 +1,14 @@ #include #define STACK_DEPTH 8192 +#define BUFFER_SIZE 2048 #define PRIOTITY 2 MQTTwrapper::MQTTwrapper() : m_config(Config::getInstance()), m_tcp(NetworkClient()), m_client(PubSubClient(m_tcp)), m_loopHandle(NULL) { m_client.setServer(m_config.m_mqttHost.c_str(), m_config.m_mqttPort); - m_client.setKeepAlive(15); + m_client.setKeepAlive(m_config.m_mqttKeepalive); + m_client.setBufferSize(BUFFER_SIZE); getInstance(this); }