rc-gateway/include/huzzah.h

122 lines
2.9 KiB
C++

#include <TaskScheduler.h>
#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"
#include "webserver.h"
#define RAW_TOPIC MAIN_DEVICE_ID "/raw"
namespace Board {
Task tReadCommand(TASK_IMMEDIATE, TASK_FOREVER, [](){
if (serialReader.readLine(Serial) > 0) {
char* cmd = serialReader.getBuffer();
if (strcmp("reset", cmd) == 0) {
Serial.println("resetting...");
ESP.restart();
Serial.println("resetting failed");
}
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);
WebServer::setup();
Mqtt::setup(&ts,
[] {turnLed(BLUE_LED, false);},
[] {turnLed(BLUE_LED);}
);
Wifi::setup(ts,
[] {
Ota::tLoop.enable();
Mqtt::tReConnect.enable();
WebServer::start();
},
[] {
Ota::tLoop.disable();
Mqtt::tReConnect.disable();
WebServer::stop();
}
);
Ota::setup(
[] {
Mqtt::publishCleanupConfig();
delay(2000);
Mqtt::disconnect();
WebServer::stop();
});
tReadCommand.enable();
}
void loop() {
ts.execute();
}
void parseSwitches(JsonDocument& jsonDoc) {
JsonObjectConst rcSwitch = jsonDoc["rcSwitch"];
switch (static_cast<unsigned int>(rcSwitch["protocol"])) {
case 1: {
string id = Protocol_1::buildId(static_cast<const char*>(rcSwitch["group"]), static_cast<int>(rcSwitch["channel"]));
Ha::Switch* el = p1Switches[id];
if (el) el->updateState(static_cast<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 = GenericSensor::mapSensors[id];
if (sensor) sensor->updateState(message);
}
void publishResponse(JsonDocument& jsonDoc) {
char message[255];
serializeJson(jsonDoc, message);
Mqtt::publish(RAW_TOPIC, 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(RAW_TOPIC, message);
}
}
// {"rcSwitch":{"protocol":1,"state":false,"group":"11111","channel":4}}