Skip to content

Instantly share code, notes, and snippets.

@sivar2311
Last active May 5, 2024 08:39
Show Gist options
  • Save sivar2311/790c82f651fc11e9bbc631f7fdd736e8 to your computer and use it in GitHub Desktop.
Save sivar2311/790c82f651fc11e9bbc631f7fdd736e8 to your computer and use it in GitHub Desktop.
Multiple Garagedoors (single file version)
#include <Arduino.h>
#include <SinricPro.h>
#include <SinricProGarageDoor.h>
const char* WIFI_SSID = "WIFI_SSID_HERE";
const char* WIFI_PASS = "WIFI_PASS_HERE";
const char* APP_KEY = "APP_KEY_HERE";
const char* APP_SECRET = "APP_SECRET_HERE";
struct GarageDoor {
GarageDoor(const String& name, const String& deviceId, const int pin, const int delayTime)
: name(name), deviceId(deviceId), pin(pin), delayTime(delayTime), timer(0) {}
const String name;
const String deviceId;
const int pin;
const unsigned long delayTime;
unsigned long timer;
};
GarageDoor garageDoors[]{
// name deviceId pin delay time (ms)
{"GarageDoor1", "DEVICE_ID_DOOR1_HERE", 22, 20000},
{"GarageDoor2", "DEVICE_ID_DOOR2_HERE", 23, 20000}
};
void triggerGarageDoor(GarageDoor& garageDoor) {
digitalWrite(garageDoor.pin, LOW);
delay(500);
digitalWrite(garageDoor.pin, HIGH);
Serial.printf("[%s]: triggered\r\n", garageDoor.name.c_str());
}
void startGarageDoorTimer(GarageDoor& garageDoor) {
Serial.printf("[%s]: timer started\r\n", garageDoor.name.c_str());
garageDoor.timer = millis();
}
void stopGarageDoorTimer(GarageDoor& garageDoor) {
Serial.printf("[%s]: timer stopped\r\n", garageDoor.name.c_str());
garageDoor.timer = 0;
}
void openGarageDoor(GarageDoor& garageDoor) {
Serial.printf("[%s]: opening door\r\n", garageDoor.name.c_str());
triggerGarageDoor(garageDoor);
startGarageDoorTimer(garageDoor);
}
void closeGarageDoor(GarageDoor& garageDoor) {
Serial.printf("[%s]: closing door\r\n", garageDoor.name.c_str());
triggerGarageDoor(garageDoor);
stopGarageDoorTimer(garageDoor);
}
bool garageDoorTimerIsExpired(GarageDoor& garageDoor) {
if (garageDoor.timer && millis() - garageDoor.timer >= garageDoor.delayTime) {
Serial.printf("[%s]: timer expired\r\n", garageDoor.name.c_str());
return true;
}
return false;
}
void sendGarageDoorCloseEvent(GarageDoor& garageDoor) {
SinricProGarageDoor& myGarageDoor = SinricPro[garageDoor.deviceId];
myGarageDoor.sendDoorStateEvent(true);
Serial.printf("[%s]: close event sent\r\n", garageDoor.name.c_str());
}
void handleGarageDoorTimer(GarageDoor& garageDoor) {
if (garageDoorTimerIsExpired(garageDoor)) {
stopGarageDoorTimer(garageDoor);
sendGarageDoorCloseEvent(garageDoor);
}
}
void handleGarageDoorTimers() {
for (auto& garageDoor : garageDoors) handleGarageDoorTimer(garageDoor);
}
bool onDoorState(const String& deviceId, bool& state) {
for (auto& garageDoor : garageDoors) {
if (deviceId == garageDoor.deviceId) {
if (state) {
closeGarageDoor(garageDoor);
} else {
openGarageDoor(garageDoor);
}
return true;
}
}
return false;
}
void setupGarageDoor(GarageDoor& garageDoor) {
int pin = garageDoor.pin;
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
SinricProGarageDoor& door = SinricPro[garageDoor.deviceId];
door.onDoorState(onDoorState);
}
void setupGarageDoors() {
for (auto& garageDoor : garageDoors) setupGarageDoor(garageDoor);
}
void setupWiFi() {
Serial.println("[WiFi]: Connecting");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("Connected");
}
void setupSinricPro() {
SinricPro.onConnected([]() { Serial.println("[SinricPro]: connected"); });
SinricPro.onDisconnected([]() { Serial.println("[SinricPro]: disconnected"); });
Serial.println("[SinricPro]: connecting...");
SinricPro.begin(APP_KEY, APP_SECRET);
}
void setup() {
Serial.begin(115200);
setupGarageDoors();
setupWiFi();
setupSinricPro();
}
void loop() {
SinricPro.handle();
handleGarageDoorTimers();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment