refactor cronjobs

This commit is contained in:
Emanuele Trabattoni
2025-08-29 19:30:41 +02:00
parent fc2687947a
commit f9c5ab86ef
5 changed files with 216 additions and 59 deletions

View File

@@ -71,10 +71,10 @@ namespace commands
response["values"]["status"] = "valid";
return response;
}
const ArduinoJson::JsonDocument Commands::setCronJob(const devices_t &dev, const ArduinoJson::JsonDocument &params)
const ArduinoJson::JsonDocument Commands::addCronJob(const devices_t &dev, const ArduinoJson::JsonDocument &params)
{
ArduinoJson::JsonDocument response;
response["cmd"] = "setCronJob";
response["cmd"] = "addCronJob";
const auto &eventName = params["name"].as<std::string>();
const auto &timeStr = params["cronExpr"].as<std::string>();
@@ -84,7 +84,7 @@ namespace commands
ArduinoJson::JsonDocument action;
if (ArduinoJson::deserializeJson(action, actionStr) != ArduinoJson::DeserializationError::Ok)
{
LOG_ERROR("setCronJob unable to deserialize cron job [", actionStr.c_str(), "]");
LOG_ERROR("addCronJob unable to deserialize cron job [", actionStr.c_str(), "]");
response["values"]["status"] = "invalid";
return response;
}
@@ -92,11 +92,31 @@ namespace commands
auto &cron = Cron::getInstance(dev);
if (!cron.addEvent(eventName, timeStr, action))
{
LOG_ERROR("setCronJob unable to add job [", actionStr.c_str(), "]");
LOG_ERROR("addCronJob unable to add job [", actionStr.c_str(), "]");
response["values"]["status"] = "invalid";
return response;
}
LOG_INFO("setCronJob added job [", actionStr.c_str(), "]");
LOG_INFO("addCronJob added job [", actionStr.c_str(), "]");
response["values"]["status"] = "valid";
return response;
}
const ArduinoJson::JsonDocument Commands::setCronJob(const devices_t &dev, const ArduinoJson::JsonDocument &params)
{
ArduinoJson::JsonDocument response;
response["cmd"] = "setCronJob";
const auto &eventName = params["name"].as<std::string>();
const auto &statusStr = params["status"].as<std::string>();
response["values"]["name"] = eventName;
auto &cron = Cron::getInstance(dev);
if (!cron.c_statusStr2Enum.contains(statusStr))
{
LOG_ERROR("setCronJob invalid status [", statusStr.c_str(), "]");
response["values"]["status"] = "invalid";
return response;
}
cron.setEvent(eventName, cron.c_statusStr2Enum.at(statusStr));
LOG_INFO("setCronJob set job [", eventName.c_str(), "] to [", statusStr.c_str(), "]");
response["values"]["status"] = "valid";
return response;
}
@@ -120,8 +140,7 @@ namespace commands
uint8_t eventNum(0);
for (const auto &[name, event] : eventMap)
{
const auto cmd = std::get<0>(event);
response["values"][name] = cmd;
response["values"][name] = event.cmd;
eventNum++;
}
LOG_INFO("getCronJob got [", eventNum, "] events");
@@ -137,16 +156,11 @@ namespace commands
return response;
}
auto cmd = std::get<0>(event);
auto cronExpr = std::get<1>(event);
auto cmdParams = std::get<3>(event);
ArduinoJson::JsonDocument action;
action["cmd"] = cmd;
action["params"] = cmdParams;
response["values"]["cronExpr"] = cron::to_cronstr(cronExpr);
action["cmd"] = event.cmd;
action["params"] = event.cmdParams;
response["values"]["cronExpr"] = cron::to_cronstr(event.cronExpr);
response["values"]["action"] = action;
LOG_INFO("getCronJob get job [", eventName.c_str(), "]");
return response;
}
@@ -283,7 +297,6 @@ namespace commands
const std::string zone(params["zone"].as<std::string>());
const uint16_t tOn(params["timeOn"].as<uint16_t>());
const uint16_t tPause(params["timePause"].as<uint16_t>());
response["values"]["zone"] = zone;
if (zone == "stop")
@@ -304,7 +317,7 @@ namespace commands
}
}
LOG_INFO("setIrrigation closing", zoneName.c_str());
dev.io.digitalOutWrite(c_irrigationValveMap.at(zoneName), false); // shuto down the valve
dev.io.digitalOutWrite(c_irrigationValveMap.at(zoneName), false); // shutdown the valve
}
if (s_irrigationPumpTimer)
{
@@ -315,6 +328,13 @@ namespace commands
return response;
}
if (!s_rainOverride && !dev.io.digitalInRead(DI::RAIN)) // verify rain sensor and override value (rain sensor input is inverted)
{
LOG_WARN("setIrrigation skipping zone [", zone.c_str(), "] because its raining");
response["values"]["status"] = "rain";
return response;
}
response["values"]["timeOn"] = tOn;
response["values"]["timePause"] = tPause;
if (!c_irrigationValveMap.contains(zone) || tOn <= 0 || tPause <= 0) // verify if zone is a valid map key
@@ -360,6 +380,7 @@ namespace commands
if (shTimer)
{
dev.io.digitalOutWrite(zoneIoNumber, true);
// controllare riempimento serbatoio con controllo del pressostato, magari in un timer
xTimerStart(shTimer, 0);
timerHandle = shTimer;
response["values"]["status"] = "valid";
@@ -367,6 +388,20 @@ namespace commands
}
return response;
}
const ArduinoJson::JsonDocument Commands::setRainOverride(const devices_t &dev, const ArduinoJson::JsonDocument &params)
{
ArduinoJson::JsonDocument response;
response["cmd"] = "setRainOverride";
if (params.isNull())
{
LOG_ERROR("setRainOverride incorrect paramaters");
return response;
}
s_rainOverride = params["rainOverride"].as<std::string>() == "True" ? true : false;
response["values"]["status"] = "valid";
LOG_INFO("setRainOverride [", s_rainOverride ? "True]" : "False]");
return response;
}
const ArduinoJson::JsonDocument Commands::setTimeNTP(const devices_t &dev, const ArduinoJson::JsonDocument &params)
{
ArduinoJson::JsonDocument response;
@@ -477,6 +512,13 @@ namespace commands
LOG_WARN("Comand not yet implemented");
return response;
}
const ArduinoJson::JsonDocument Commands::getRainOverride(const devices_t &dev, const ArduinoJson::JsonDocument &params)
{
ArduinoJson::JsonDocument response;
response["cmd"] = "getRainOverride";
response["values"]["rainOverride"] = s_rainOverride ? "True" : "False";
return response;
}
const ArduinoJson::JsonDocument Commands::getTimeDrift(const devices_t &dev, const ArduinoJson::JsonDocument &params)
{
ArduinoJson::JsonDocument response;