#define ENABLE_DEBUG
#ifdef ENABLE_DEBUG
#define DEBUG_ESP_PORT Serial
#define NODEBUG_WEBSOCKETS
#define NDEBUG
#endif
#include <Arduino.h>
#include <WiFi.h>
#include "SinricPro.h"
#include "SinricProSwitch.h"
#include <map>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASS ""
#define APP_KEY "3c63ea88-7bf9-4b82-878b-82eaafd9f7ca"
#define APP_SECRET "7825f8d6-dc81-4d8a-8892-2d28ead6cacd-93c763ac-b91a-4bb6-ac83-e7fd98df4870"
#define BAUD_RATE 115200
#define DEBOUNCE_TIME 250
#define RELAYPIN_1 22
#define RELAYPIN_2 23
#define LED_BUILTIN 2 // Pin para el LED interno del ESP32
typedef struct {
int relayPIN;
int flipSwitchPIN;
bool activeLow;
} deviceConfig_t;
std::map<String, deviceConfig_t> devices = {
{"65234f8be7ca72e9eebcdad3", {22, 12, true }},
{"65233abe6c97cb79efc4925e", {23, 13, true }},
{"6526be3c23bcf22e9e0e2e8f", {21, 14, true }},
};
typedef struct {
String deviceId;
bool lastFlipSwitchState;
unsigned long lastFlipSwitchChange;
bool activeLow;
} flipSwitchConfig_t;
std::map<int, flipSwitchConfig_t> flipSwitches;
void setupRelays() {
for (auto &device : devices) {
int relayPIN = device.second.relayPIN;
pinMode(relayPIN, OUTPUT);
}
}
void setupFlipSwitches() {
for (auto &device : devices) {
flipSwitchConfig_t flipSwitchConfig;
flipSwitchConfig.deviceId = device.first;
flipSwitchConfig.lastFlipSwitchChange = 0;
flipSwitchConfig.lastFlipSwitchState = false;
int flipSwitchPIN = device.second.flipSwitchPIN;
bool activeLow = device.second.activeLow;
flipSwitchConfig.activeLow = activeLow;
flipSwitches[flipSwitchPIN] = flipSwitchConfig;
if (activeLow) {
pinMode(flipSwitchPIN, INPUT_PULLUP);
}
else {
pinMode(flipSwitchPIN, INPUT);
}
}
}
bool onPowerState(String deviceId, bool &state) {
Serial.printf("%s: %s\r\n", deviceId.c_str(), state ? "on" : "off");
int relayPIN = devices[deviceId].relayPIN;
digitalWrite(relayPIN, state);
return true;
}
void handleFlipSwitches() {
unsigned long actualMillis = millis();
for (auto &flipSwitch : flipSwitches) {
unsigned long lastFlipSwitchChange = flipSwitch.second.lastFlipSwitchChange;
if (actualMillis - lastFlipSwitchChange > DEBOUNCE_TIME) {
int flipSwitchPIN = flipSwitch.first;
bool lastFlipSwitchState = flipSwitch.second.lastFlipSwitchState;
bool activeLow = flipSwitch.second.activeLow;
bool flipSwitchState = digitalRead(flipSwitchPIN);
if (activeLow) flipSwitchState = !flipSwitchState;
if (flipSwitchState != lastFlipSwitchState) {
flipSwitch.second.lastFlipSwitchChange = actualMillis;
String deviceId = flipSwitch.second.deviceId;
int relayPIN = devices[deviceId].relayPIN;
bool newRelayState = !digitalRead(relayPIN);
digitalWrite(relayPIN, newRelayState);
SinricProSwitch &mySwitch = SinricPro[deviceId];
mySwitch.sendPowerStateEvent(newRelayState);
flipSwitch.second.lastFlipSwitchState = flipSwitchState;
}
}
}
}
void setupWiFi() {
Serial.printf("\r\n[Wifi]: Connecting");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.printf(".");
delay(250);
}
Serial.printf("connected!\r\n[WiFi]: IP-Address is %s\r\n", WiFi.localIP().toString().c_str());
// Encender el LED interno del ESP32 cuando se establezca la conexión WiFi
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); // Encender el LED
}
void setupSinricPro() {
for (auto &device : devices) {
const char *deviceId = device.first.c_str();
SinricProSwitch &mySwitch = SinricPro[deviceId];
mySwitch.onPowerState(onPowerState);
}
SinricPro.restoreDeviceStates(true);
SinricPro.begin(APP_KEY, APP_SECRET);
}
void setup() {
Serial.begin(BAUD_RATE);
setupRelays();
setupFlipSwitches();
setupWiFi();
setupSinricPro();
}
void loop() {
SinricPro.handle();
handleFlipSwitches();
}