#include using namespace std; Scheduler ts; namespace Ha { struct Switch; } typedef unordered_multimap mapswitches; mapswitches onSwitches; mapswitches offSwitches; unordered_map p1Switches; void turnLed(uint8_t led, bool on = true) { on ? digitalWrite(led, LOW) : digitalWrite(led, HIGH); } #include "wifi.h" namespace Board { Task tReadCommand(TASK_IMMEDIATE, TASK_FOREVER, [](){ if (serialReader.readLine(Serial) > 0) { char* cmd = serialReader.getBuffer(); runJsonCommand(cmd); } }, &ts); 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); Wifi::setup(); Ota::setup(); Mqtt::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->publishState((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->publishState(true); }); range = offSwitches.equal_range(value); for_each(range.first, range.second, [](mapswitches::value_type& x){ x.second->publishState(false); }); } } } void parseSensors(JsonDocument& jsonDoc, char* message) { JsonObjectConst json = jsonDoc["sensor"]; string id = to_string((unsigned int)json["id"]); char stateTopic[TOPIC_SIZE]; sprintf(stateTopic, "homeassistant/sensor/%s/%s/state", MAIN_DEVICE_ID, id.c_str()); Mqtt::publish(stateTopic, 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}}