#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 "bfec6aad-ddc5-482e-a6d7-2883d10235d2"
#define APP_SECRET "b847381f-c559-4759-b773-1df816d23fd2-4ce1220c-7032-431c-8986-3e3adeeb4970"
//Enter the device IDs here
#define device_ID_1 "663c9a0c202b1b3e1f568dff"
#define device_ID_2 "663c99096443b9bfe2b6a820"
#define device_ID_3 "663c9a56202b1b3e1f568e1d"
// define the GPIO connected with Relays and switches
#define RelayPin1 32
#define RelayPin2 33
#define RelayPin3 25
#define SwitchPin1 27
#define SwitchPin2 14
#define SwitchPin3 12
#define MotionSensorPin 26
#define wifiLed 2
#define BAUD_RATE 9600
#define DEBOUNCE_TIME 250
typedef struct {
int relayPIN;
int flipSwitchPIN;
} deviceConfig_t;
std::map<String, deviceConfig_t> devices = {
{"663c9a0c202b1b3e1f568dff", {RelayPin1, SwitchPin1}},
{"663c99096443b9bfe2b6a820", {RelayPin2, SwitchPin2}},
{"663c9a56202b1b3e1f568e1d", {RelayPin3, SwitchPin3}},
};
std::map<int, bool> lastFlipSwitchState;
void setupRelays() {
for (auto &device : devices) {
int relayPIN = device.second.relayPIN;
pinMode(relayPIN, OUTPUT);
digitalWrite(relayPIN, HIGH);
}
}
void setupWiFi() {
Serial.println("\r\n[Wifi]: Connecting");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(250);
}
digitalWrite(wifiLed, LOW);
Serial.printf("connected!\r\n[WiFi]: IP-Address is %s\r\n", WiFi.localIP().toString().c_str());
}
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 handleManualSwitches() {
for (auto &device : devices) {
String deviceId = device.first;
int flipSwitchPIN = device.second.flipSwitchPIN;
bool currentSwitchState = digitalRead(flipSwitchPIN);
if (currentSwitchState != lastFlipSwitchState[flipSwitchPIN]) {
if (millis() - lastFlipSwitchState[flipSwitchPIN] > DEBOUNCE_TIME) {
lastFlipSwitchState[flipSwitchPIN] = currentSwitchState;
int relayPIN = devices[deviceId].relayPIN;
bool newRelayState = !digitalRead(relayPIN);
digitalWrite(relayPIN, newRelayState);
SinricProSwitch &mySwitch = SinricPro[deviceId];
mySwitch.sendPowerStateEvent(!newRelayState);
}
}
}
}
void setupSinricPro() {
for (auto &device : devices) {
const char *deviceId = device.first.c_str();
SinricProSwitch &mySwitch = SinricPro[deviceId];
mySwitch.onPowerState(onPowerState);
}
SinricPro.begin(APP_KEY, APP_SECRET);
}
void setup() {
Serial.begin(BAUD_RATE);
pinMode(wifiLed, OUTPUT);
setupRelays();
setupWiFi();
setupSinricPro();
// Initialize last flip switch states
for (auto &device : devices) {
int flipSwitchPIN = device.second.flipSwitchPIN;
lastFlipSwitchState[flipSwitchPIN] = digitalRead(flipSwitchPIN);
pinMode(flipSwitchPIN, INPUT_PULLUP);
}
}
void loop() {
SinricPro.handle();
handleManualSwitches();
}