Created
November 26, 2018 05:04
-
-
Save kakopappa/657fa9d622592cedb54e784152fa31b4 to your computer and use it in GitHub Desktop.
sinric_multiple_relays.ino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Arduino.h> | |
#include <ESP8266WiFi.h> | |
#include <ESP8266WiFiMulti.h> | |
#include <WebSocketsClient.h> // https://github.com/kakopappa/sinric/wiki/How-to-add-dependency-libraries | |
#include <ArduinoJson.h> // https://github.com/kakopappa/sinric/wiki/How-to-add-dependency-libraries | |
#include <StreamString.h> | |
ESP8266WiFiMulti WiFiMulti; | |
WebSocketsClient webSocket; | |
WiFiClient client; | |
#define MyApiKey "" // TODO: Change to your sinric API Key. Your API Key is displayed on sinric.com dashboard | |
#define MySSID "" // TODO: Change to your Wifi network SSID | |
#define MyWifiPassword "" // TODO: Change to your Wifi network password | |
#define HEARTBEAT_INTERVAL 300000 // 5 Minutes | |
const int relayPin1 = 1; | |
const int relayPin2 = 2; | |
uint64_t heartbeatTimestamp = 0; | |
bool isConnected = false; | |
#define DEVICE1 "xxxxx" //TODO: Device ID of first device | |
#define DEVICE2 "xxxxx" //TODO: Device ID of second device | |
void setPowerStateOnServer(String deviceId, String value); | |
// deviceId is the ID assgined to your smart-home-device in sinric.com dashboard. Copy it from dashboard and paste it here | |
void turnOn(String deviceId) { | |
if (deviceId == DEVICE1) | |
{ | |
Serial.print("Turn on device id: "); | |
Serial.println(deviceId); | |
digitalWrite(relayPin1, HIGH); // turn on relay with voltage HIGH | |
} | |
else if (deviceId == DEVICE2) | |
{ | |
Serial.print("Turn on device id: "); | |
Serial.println(deviceId); | |
digitalWrite(relayPin2, HIGH); // turn on relay with voltage HIGH | |
} | |
else { | |
Serial.print("Turn on for unknown device id: "); | |
Serial.println(deviceId); | |
} | |
} | |
void turnOff(String deviceId) { | |
if (deviceId == DEVICE1) | |
{ | |
Serial.print("Turn off Device ID: "); | |
Serial.println(deviceId); | |
digitalWrite(relayPin1, LOW); // turn off relay with voltage LOW | |
} | |
else if (deviceId == DEVICE2) | |
{ | |
Serial.print("Turn off Device ID: "); | |
Serial.println(relayPin2); | |
digitalWrite(relayPin1, LOW); // turn off relay with voltage LOW | |
} | |
else { | |
Serial.print("Turn off for unknown device id: "); | |
Serial.println(deviceId); | |
} | |
} | |
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { | |
switch(type) { | |
case WStype_DISCONNECTED: | |
isConnected = false; | |
Serial.printf("[WSc] Webservice disconnected from sinric.com!\n"); | |
break; | |
case WStype_CONNECTED: { | |
isConnected = true; | |
Serial.printf("[WSc] Service connected to sinric.com at url: %s\n", payload); | |
Serial.printf("Waiting for commands from sinric.com ...\n"); | |
} | |
break; | |
case WStype_TEXT: { | |
Serial.printf("[WSc] get text: %s\n", payload); | |
// Example payloads | |
// For Switch or Light device types | |
// {"deviceId": xxxx, "action": "setPowerState", value: "ON"} // https://developer.amazon.com/docs/device-apis/alexa-powercontroller.html | |
// For Light device type | |
// Look at the light example in github | |
DynamicJsonBuffer jsonBuffer; | |
JsonObject& json = jsonBuffer.parseObject((char*)payload); | |
String deviceId = json ["deviceId"]; | |
String action = json ["action"]; | |
if(action == "setPowerState") { // Switch or Light | |
String value = json ["value"]; | |
if(value == "ON") { | |
turnOn(deviceId); | |
} else { | |
turnOff(deviceId); | |
} | |
} | |
else if (action == "SetTargetTemperature") { | |
String deviceId = json ["deviceId"]; | |
String action = json ["action"]; | |
String value = json ["value"]; | |
} | |
else if (action == "test") { | |
Serial.println("[WSc] received test command from sinric.com"); | |
} | |
} | |
break; | |
case WStype_BIN: | |
Serial.printf("[WSc] get binary length: %u\n", length); | |
break; | |
} | |
} | |
void setup() { | |
Serial.begin(115200); | |
pinMode(relayPin1, OUTPUT); | |
pinMode(relayPin2, OUTPUT); | |
WiFiMulti.addAP(MySSID, MyWifiPassword); | |
Serial.println(); | |
Serial.print("Connecting to Wifi: "); | |
Serial.println(MySSID); | |
// Waiting for Wifi connect | |
while(WiFiMulti.run() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
if(WiFiMulti.run() == WL_CONNECTED) { | |
Serial.println(""); | |
Serial.print("WiFi connected. "); | |
Serial.print("IP address: "); | |
Serial.println(WiFi.localIP()); | |
} | |
// server address, port and URL | |
webSocket.begin("iot.sinric.com", 80, "/"); | |
// event handler | |
webSocket.onEvent(webSocketEvent); | |
webSocket.setAuthorization("apikey", MyApiKey); | |
// try again every 5000ms if connection has failed | |
webSocket.setReconnectInterval(5000); // If you see 'class WebSocketsClient' has no member named 'setReconnectInterval' error update arduinoWebSockets | |
} | |
void loop() { | |
webSocket.loop(); | |
if(isConnected) { | |
uint64_t now = millis(); | |
// Send heartbeat in order to avoid disconnections during ISP resetting IPs over night. Thanks @MacSass | |
if((now - heartbeatTimestamp) > HEARTBEAT_INTERVAL) { | |
heartbeatTimestamp = now; | |
webSocket.sendTXT("H"); | |
} | |
} | |
} | |
// If you are going to use a push button to on/off the switch manually, use this function to update the status on the server | |
// so it will reflect on Alexa app. | |
// eg: setPowerStateOnServer("deviceid", "ON") | |
// Call ONLY If status changed. DO NOT CALL THIS IN loop() and overload the server. | |
void setPowerStateOnServer(String deviceId, String value) { | |
DynamicJsonBuffer jsonBuffer; | |
JsonObject& root = jsonBuffer.createObject(); | |
root["deviceId"] = deviceId; | |
root["action"] = "setPowerState"; | |
root["value"] = value; | |
StreamString databuf; | |
root.printTo(databuf); | |
webSocket.sendTXT(databuf); | |
} | |
//eg: setPowerStateOnServer("deviceid", "CELSIUS", "25.0") | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment