/* NTP MODULE Copyright (C) 2016-2019 by Xose PĂ©rez */ #if RPN_RULES_SUPPORT #include "rpnlib.h" #include // ----------------------------------------------------------------------------- // 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