#include #define MQTT_HOST IPAddress(192, 168, 5, 11) #define MQTT_PORT 1883 using namespace std; Scheduler ts; #include "devices.h" #include "mqtt.h" #include "ota.h" #include "wifi.h" namespace Board { Task tReadCommand(TASK_IMMEDIATE, TASK_FOREVER, [](){ if (serialReader.readLine(Serial) > 0) { char* cmd = serialReader.getBuffer(); runJsonCommand(cmd); } }, &ts); void turnLed(uint8_t led, bool on = true) { on ? digitalWrite(led, LOW) : digitalWrite(led, HIGH); } void setup() { // Serial.begin(9600, SERIAL_8N1, SERIAL_TX_ONLY); pinMode(RED_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); turnLed(RED_LED, false); turnLed(BLUE_LED); Mqtt::setup(&ts, [] {turnLed(BLUE_LED, false);}, [] {turnLed(BLUE_LED);} ); Wifi::setup(); Ota::setup(); tReadCommand.enable(); } void loop() { ts.execute(); } void parseSwitches(JsonDocument& jsonDoc) { JsonObjectConst rcSwitch = jsonDoc["rcSwitch"]; switch ((unsigned int)rcSwitch["protocol"]) { case 1: { string id = Protocol_1::buildId((const char*)rcSwitch["group"], (int)rcSwitch["channel"]); Ha::Switch* el = p1Switches[id]; if (el) el->updateState((bool)rcSwitch["state"]); break; } case 2: break; default: { unsigned long value = rcSwitch["value"]; auto range = onSwitches.equal_range(value); for_each(range.first, range.second, [](mapswitches::value_type& x){ x.second->updateState(true); }); range = offSwitches.equal_range(value); for_each(range.first, range.second, [](mapswitches::value_type& x){ x.second->updateState(false); }); } } } void parseSensors(JsonDocument& jsonDoc, char* message) { JsonObjectConst json = jsonDoc["sensor"]; string id = to_string((unsigned int)json["id"]); auto sensor = Sensor::mapSensors[id]; if (sensor) sensor->updateState(message); } void publishResponse(JsonDocument& jsonDoc) { char message[255]; serializeJson(jsonDoc, message); Mqtt::publish("homeassistant/sensor/rc-gateway/raw", message); if (jsonDoc.containsKey("rcSwitch")) parseSwitches(jsonDoc); if (jsonDoc.containsKey("sensor")) parseSensors(jsonDoc, message); } void handleJsonError(JsonDocument& jsonError) { char message[255]; serializeJson(jsonError, message); Mqtt::publish("homeassistant/sensor/rc-gateway/raw", message); } } // {"rcSwitch":{"protocol":1,"state":false,"group":"11111","channel":4}}