From 78c9e6a218af98351279877d3010ed42c1282765 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Wed, 18 Jan 2023 03:07:00 +0300 Subject: [PATCH] relay: lock and unlock in api --- code/espurna/mqtt.h | 1 + code/espurna/relay.cpp | 50 ++++++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/code/espurna/mqtt.h b/code/espurna/mqtt.h index ab9efa7c..ebbc798a 100644 --- a/code/espurna/mqtt.h +++ b/code/espurna/mqtt.h @@ -19,6 +19,7 @@ Updated secure client support by Niek van der Maas < mail at niekvandermaas dot #define MQTT_TOPIC_ACTION "action" #define MQTT_TOPIC_RELAY "relay" #define MQTT_TOPIC_LED "led" +#define MQTT_TOPIC_LOCK "lock" #define MQTT_TOPIC_BUTTON "button" #define MQTT_TOPIC_IP "ip" #define MQTT_TOPIC_SSID "ssid" diff --git a/code/espurna/relay.cpp b/code/espurna/relay.cpp index 1ca02eda..cdb9f0c1 100644 --- a/code/espurna/relay.cpp +++ b/code/espurna/relay.cpp @@ -2398,6 +2398,22 @@ void relaySetupAPI() { } ); + apiRegister(F(MQTT_TOPIC_LOCK "/+"), + [](ApiRequest& request) { + return _relayApiTryHandle(request, + [&](size_t id) { + request.send(_relayTristateToPayload(_relays[id].lock)); + return true; + }); + }, + [](ApiRequest& request) { + return _relayApiTryHandle(request, + [&](size_t id) { + return _relayHandleLockPayload(id, request.param(F("value"))); + }); + } + ); + } #endif // API_SUPPORT @@ -2653,6 +2669,7 @@ void relayMQTTCallback(unsigned int type, espurna::StringView topic, espurna::St if (type == MQTT_CONNECT_EVENT) { mqttSubscribe(MQTT_TOPIC_RELAY "/+"); mqttSubscribe(MQTT_TOPIC_PULSE "/+"); + mqttSubscribe(MQTT_TOPIC_LOCK "/+"); _relayMqttSubscribeCustomTopics(); connected = true; return; @@ -2661,23 +2678,28 @@ void relayMQTTCallback(unsigned int type, espurna::StringView topic, espurna::St if (type == MQTT_MESSAGE_EVENT) { const auto t = mqttMagnitude(topic); - auto is_relay = t.startsWith(MQTT_TOPIC_RELAY); - auto is_pulse = t.startsWith(MQTT_TOPIC_PULSE); - if (is_relay || is_pulse) { - size_t id; - if (!_relayTryParseIdFromPath(t, id)) { - return; - } + using Handler = bool(*)(size_t, espurna::StringView); + struct TopicHandler { + espurna::StringView topic; + Handler handler; + }; + + static const TopicHandler TopicHandlers[] { + {STRING_VIEW(MQTT_TOPIC_RELAY), _relayHandlePayload}, + {STRING_VIEW(MQTT_TOPIC_PULSE), _relayHandlePulsePayload}, + {STRING_VIEW(MQTT_TOPIC_LOCK), _relayHandleLockPayload}, + }; + + for (const auto pair: TopicHandlers) { + if (t.startsWith(pair.topic)) { + size_t id; + if (!_relayTryParseIdFromPath(t, id)) { + return; + } - if (is_relay) { - _relayHandlePayload(id, payload); + pair.handler(id, payload); _relays[id].report = mqttForward(); - return; - } - if (is_pulse) { - _relayHandlePulsePayload(id, payload); - _relays[id].report = mqttForward(); return; } }