get and set config via mqtt messages
This commit is contained in:
@@ -53,7 +53,7 @@
|
|||||||
"params": null
|
"params": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cmd": "getTankLevel",
|
"cmd": "getTankInfo",
|
||||||
"params": null
|
"params": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -88,7 +88,14 @@ public:
|
|||||||
file.close(); // close config file before unmounting filesystem
|
file.close(); // close config file before unmounting filesystem
|
||||||
};
|
};
|
||||||
|
|
||||||
void updateConfig(ArduinoJson::JsonDocument &json)
|
ArduinoJson::JsonDocument& getConfig()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
|
serialize();
|
||||||
|
return m_configJson;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setConfig(const ArduinoJson::JsonDocument &json)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(m_mutex);
|
std::lock_guard<std::mutex> lock(m_mutex);
|
||||||
{
|
{
|
||||||
@@ -97,8 +104,9 @@ public:
|
|||||||
deserialize();
|
deserialize();
|
||||||
saveConfig();
|
saveConfig();
|
||||||
}; // filesystem is unmounted here
|
}; // filesystem is unmounted here
|
||||||
delay(500);
|
LOG_WARN("setConfig will cause restart!");
|
||||||
esp_restart(); // configuration updates trigger a cpu restart
|
delay(5000);
|
||||||
|
esp_restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetConfig()
|
void resetConfig()
|
||||||
@@ -150,8 +158,8 @@ private:
|
|||||||
auto ethernet = m_configJson["ethernet"].to<ArduinoJson::JsonObject>();
|
auto ethernet = m_configJson["ethernet"].to<ArduinoJson::JsonObject>();
|
||||||
ethernet["hostname"] = m_ethHostname;
|
ethernet["hostname"] = m_ethHostname;
|
||||||
ethernet["ipAddr"] = m_ethIpAddr;
|
ethernet["ipAddr"] = m_ethIpAddr;
|
||||||
ethernet["netmask "] = m_ethNetmask;
|
ethernet["netmask"] = m_ethNetmask;
|
||||||
ethernet["gateway "] = m_ethGateway;
|
ethernet["gateway"] = m_ethGateway;
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -188,6 +196,7 @@ private:
|
|||||||
mqtt["loopTime"] = m_mqttLoopTime;
|
mqtt["loopTime"] = m_mqttLoopTime;
|
||||||
mqtt["clientName"] = m_mqttClientName;
|
mqtt["clientName"] = m_mqttClientName;
|
||||||
mqtt["retries"] = m_mqttRetries;
|
mqtt["retries"] = m_mqttRetries;
|
||||||
|
mqtt["keepalive"] = m_mqttKeepalive;
|
||||||
auto publish = mqtt["publish"].to<ArduinoJson::JsonObject>();
|
auto publish = mqtt["publish"].to<ArduinoJson::JsonObject>();
|
||||||
for (auto v : m_mqttPublish)
|
for (auto v : m_mqttPublish)
|
||||||
{
|
{
|
||||||
@@ -235,10 +244,11 @@ private:
|
|||||||
auto temperature = m_configJson["temperature"];
|
auto temperature = m_configJson["temperature"];
|
||||||
m_tempExpectedSensors = temperature["expectedSensors"].as<uint8_t>();
|
m_tempExpectedSensors = temperature["expectedSensors"].as<uint8_t>();
|
||||||
auto values = temperature["correctionValues"].as<JsonArray>();
|
auto values = temperature["correctionValues"].as<JsonArray>();
|
||||||
|
m_tempCorrectionValues.clear();
|
||||||
m_tempCorrectionValues.reserve(values.size());
|
m_tempCorrectionValues.reserve(values.size());
|
||||||
for (auto v : values)
|
for (auto v : values)
|
||||||
{
|
{
|
||||||
m_tempCorrectionValues.push_back(v.as<float>());
|
m_tempCorrectionValues.emplace_back(v.as<float>());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -255,7 +265,8 @@ private:
|
|||||||
m_mqttHost = mqtt["host"].as<std::string>();
|
m_mqttHost = mqtt["host"].as<std::string>();
|
||||||
m_mqttPort = mqtt["port"].as<uint16_t>();
|
m_mqttPort = mqtt["port"].as<uint16_t>();
|
||||||
m_mqttLoopTime = mqtt["loopTime"].as<uint16_t>();
|
m_mqttLoopTime = mqtt["loopTime"].as<uint16_t>();
|
||||||
m_mqttRetries = mqtt["retries"].as<uint16_t>();
|
m_mqttKeepalive = mqtt["keepalive"].as<uint8_t>();
|
||||||
|
m_mqttRetries = mqtt["retries"].as<uint8_t>();
|
||||||
auto subscribe = mqtt["subsribe"].as<ArduinoJson::JsonObject>();
|
auto subscribe = mqtt["subsribe"].as<ArduinoJson::JsonObject>();
|
||||||
for (auto v : subscribe)
|
for (auto v : subscribe)
|
||||||
{
|
{
|
||||||
@@ -304,6 +315,7 @@ public:
|
|||||||
std::string m_mqttHost = "10.0.2.249";
|
std::string m_mqttHost = "10.0.2.249";
|
||||||
uint16_t m_mqttPort = 1883;
|
uint16_t m_mqttPort = 1883;
|
||||||
uint16_t m_mqttLoopTime = 100; // in milliseconds
|
uint16_t m_mqttLoopTime = 100; // in milliseconds
|
||||||
|
uint8_t m_mqttKeepalive = 15;
|
||||||
uint8_t m_mqttRetries = 5;
|
uint8_t m_mqttRetries = 5;
|
||||||
std::string m_mqttClientName = "etcontrollerPRO";
|
std::string m_mqttClientName = "etcontrollerPRO";
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace drivers
|
|||||||
const uint32_t wait = now - lastAccess;
|
const uint32_t wait = now - lastAccess;
|
||||||
if (wait < minDelay)
|
if (wait < minDelay)
|
||||||
{
|
{
|
||||||
LOG_WARN(title, "delay", wait);
|
LOG_DEBUG(title, "delay", wait);
|
||||||
delay(wait);
|
delay(wait);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
129
src/commands.cpp
129
src/commands.cpp
@@ -2,6 +2,61 @@
|
|||||||
|
|
||||||
namespace commands
|
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<JsonObject>();
|
||||||
|
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)
|
const ArduinoJson::JsonDocument Commands::setHPlimit(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms)
|
||||||
{
|
{
|
||||||
ArduinoJson::JsonDocument response;
|
ArduinoJson::JsonDocument response;
|
||||||
@@ -27,6 +82,24 @@ namespace commands
|
|||||||
return response;
|
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)
|
const ArduinoJson::JsonDocument Commands::getHPpower(const devices_t &dev, const ArduinoJson::JsonDocument ¶ms)
|
||||||
{
|
{
|
||||||
ArduinoJson::JsonDocument response;
|
ArduinoJson::JsonDocument response;
|
||||||
@@ -41,10 +114,62 @@ namespace commands
|
|||||||
return response;
|
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;
|
ArduinoJson::JsonDocument response;
|
||||||
LOG_WARN("setHeating not yet implemented");
|
LOG_WARN("Comand not yet implemented");
|
||||||
return response;
|
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 //
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -6,11 +6,12 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
#include <devices.h>
|
#include <devices.h>
|
||||||
|
|
||||||
namespace commands
|
namespace commands
|
||||||
{
|
{
|
||||||
enum RO
|
enum RO // relay output channels
|
||||||
{
|
{
|
||||||
P1,
|
P1,
|
||||||
P2,
|
P2,
|
||||||
@@ -28,7 +29,8 @@ namespace commands
|
|||||||
AUX,
|
AUX,
|
||||||
RETURN,
|
RETURN,
|
||||||
NC_3,
|
NC_3,
|
||||||
NC_4
|
NC_4,
|
||||||
|
RO_MAX // unused to detect invalid values
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::map<const std::string, uint8_t> c_hpLimitsMap = {{"P1", RO::P1},
|
const std::map<const std::string, uint8_t> c_hpLimitsMap = {{"P1", RO::P1},
|
||||||
@@ -52,14 +54,46 @@ namespace commands
|
|||||||
Commands() = delete;
|
Commands() = delete;
|
||||||
|
|
||||||
public:
|
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 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 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<const std::string, std::function<const ArduinoJson::JsonDocument(const devices_t &, const ArduinoJson::JsonDocument &)>> commandMap = {
|
static const std::map<const std::string, std::function<const ArduinoJson::JsonDocument(const devices_t &, const ArduinoJson::JsonDocument &)>> commandMap = {
|
||||||
|
{"setConfig", Commands::setConfig},
|
||||||
|
{"getConfig", Commands::getConfig},
|
||||||
|
|
||||||
|
{"setCronjob", Commands::setCronjob},
|
||||||
|
{"getCronjob", Commands::getCronjob},
|
||||||
|
{"delCronjob", Commands::delCronjob},
|
||||||
|
|
||||||
{"setHPlimit", Commands::setHPlimit},
|
{"setHPlimit", Commands::setHPlimit},
|
||||||
|
{"setHeating", Commands::setHeating},
|
||||||
|
{"setIrrigation", Commands::setIrrigation},
|
||||||
|
|
||||||
{"getHPpower", Commands::getHPpower},
|
{"getHPpower", Commands::getHPpower},
|
||||||
{"setHeating", Commands::setHeating}};
|
{"setHeating", Commands::setHeating},
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -69,7 +69,7 @@ void loop()
|
|||||||
if (commands::commandMap.contains(cmd))
|
if (commands::commandMap.contains(cmd))
|
||||||
{ // call command from command map in this same thread (the MQTT thread)
|
{ // call command from command map in this same thread (the MQTT thread)
|
||||||
LOG_INFO("Executing command", cmd.c_str());
|
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())
|
if (answer.isNull())
|
||||||
return;
|
return;
|
||||||
mqtt.publish(conf.m_mqttPublish["answers"], answer);
|
mqtt.publish(conf.m_mqttPublish["answers"], answer);
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
#include <mqtt.h>
|
#include <mqtt.h>
|
||||||
|
|
||||||
#define STACK_DEPTH 8192
|
#define STACK_DEPTH 8192
|
||||||
|
#define BUFFER_SIZE 2048
|
||||||
#define PRIOTITY 2
|
#define PRIOTITY 2
|
||||||
|
|
||||||
MQTTwrapper::MQTTwrapper() : m_config(Config::getInstance()), m_tcp(NetworkClient()), m_client(PubSubClient(m_tcp)), m_loopHandle(NULL)
|
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.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);
|
getInstance(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user