Browse Source

relay: lock and unlock in api

pull/2575/head
Maxim Prokhorov 1 year ago
parent
commit
78c9e6a218
2 changed files with 37 additions and 14 deletions
  1. +1
    -0
      code/espurna/mqtt.h
  2. +36
    -14
      code/espurna/relay.cpp

+ 1
- 0
code/espurna/mqtt.h View File

@ -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"


+ 36
- 14
code/espurna/relay.cpp View File

@ -2398,6 +2398,22 @@ void relaySetupAPI() {
}
);
apiRegister(F(MQTT_TOPIC_LOCK "/+"),
[](ApiRequest& request) {
return _relayApiTryHandle(request,
[&](size_t id) {
request.send(_relayTristateToPayload<RelayLock>(_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;
}
}


Loading…
Cancel
Save