/*
|
|
|
|
NTP MODULE
|
|
|
|
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
*/
|
|
|
|
#if RPN_RULES_SUPPORT
|
|
|
|
#include "rpnlib.h"
|
|
#include <Ticker.h>
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Custom commands
|
|
// -----------------------------------------------------------------------------
|
|
|
|
rpn_context _rpn_ctxt;
|
|
bool _rpn_run = false;
|
|
unsigned long _rpn_last = 0;
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
bool _rpnWebSocketOnReceive(const char * key, JsonVariant& value) {
|
|
return (strncmp(key, "rpn", 3) == 0);
|
|
}
|
|
|
|
void _rpnWebSocketOnSend(JsonObject& root) {
|
|
|
|
root["rpnVisible"] = 1;
|
|
JsonArray& rules = root.createNestedArray("rpnRules");
|
|
|
|
unsigned char i = 0;
|
|
while (String rule = getSetting("rule", i, NULL)) {
|
|
rules.add(rule);
|
|
}
|
|
|
|
}
|
|
|
|
void _rpnConfigure() {
|
|
|
|
}
|
|
|
|
void _rpnBrokerCallback(const unsigned char type, const char * topic, unsigned char id, const char * payload) {
|
|
|
|
char name[32] = {0};
|
|
|
|
if (BROKER_MSG_TYPE_STATUS == type || BROKER_MSG_TYPE_SENSOR == type) {
|
|
snprintf(name, sizeof(name), "%s%d", topic, id);
|
|
} else if (BROKER_MSG_TYPE_DATETIME == type) {
|
|
strncpy(name, topic, sizeof(name));
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
rpn_variable_set(_rpn_ctxt, name, atof(payload));
|
|
_rpn_last = millis();
|
|
_rpn_run = true;
|
|
|
|
}
|
|
|
|
void _rpnInit() {
|
|
|
|
// Init context
|
|
rpn_init(_rpn_ctxt);
|
|
|
|
// Add relay operator
|
|
rpn_operator_set(_rpn_ctxt, "relay", 2, [](rpn_context & ctxt) {
|
|
float a, b;
|
|
rpn_stack_pop(ctxt, b); // new status
|
|
rpn_stack_pop(ctxt, a); // relay number
|
|
relayStatus(int(a), int(b));
|
|
return true;
|
|
});
|
|
|
|
}
|
|
|
|
void _rpnRun() {
|
|
|
|
unsigned char i = 0;
|
|
while (String rule = getSetting("rule", i, NULL)) {
|
|
rpn_stack_clear(_rpn_ctxt);
|
|
rpn_process(_rpn_ctxt, rule.c_str());
|
|
}
|
|
|
|
}
|
|
|
|
void _rpnLoop() {
|
|
|
|
if (_rpn_run && (millis() - _rpn_last > RPN_BUFFER_DELAY)) {
|
|
_rpnRun();
|
|
_rpn_run = false;
|
|
}
|
|
|
|
}
|
|
|
|
void rpnSetup() {
|
|
|
|
// Init context
|
|
_rpnInit();
|
|
|
|
// Load & cache settings
|
|
_rpnConfigure();
|
|
|
|
// Websockets
|
|
#if WEB_SUPPORT
|
|
wsOnSendRegister(_rpnWebSocketOnSend);
|
|
wsOnReceiveRegister(_rpnWebSocketOnReceive);
|
|
#endif
|
|
|
|
brokerRegister(_rpnBrokerCallback);
|
|
espurnaRegisterReload(_rpnConfigure);
|
|
espurnaRegisterLoop(_rpnLoop);
|
|
|
|
}
|
|
|
|
#endif
|