Recently I have discovered a no-code IoT platform named SirnicPro for Arduino, ESP32-based projects which offers almost everything the professional IoT devices allow. No-code platform means the Arduino sketch is automatically generated. Practically there is nothing to learn since everything is click, configure and generate.
This is kind of project is quite difficult to produce with a self-hosted MQTT server or PHP scripts, AWS IoT, Azure IoT, IBM Watson IoT etc and even with Arduino IoT Cloud. These are specialized IoT platforms to offer the customers the most commonly used features, such as adding a timer or monitoring the current consumption. There are certain disadvantages to these platforms. One of them is vendor lock-in, and another is the risk of getting hacked.
Sinric Pro uses several libraries and apart from automatic code generation, they provide a lot of working examples. You need to update your Arduino IDE and existing libraries to the latest version and install these 3 libraries :
---
ArduinoJson by Benoit Blanchon (Minimum Version 6.12.0)
WebSockets by Markus Sattler (minimum Version 2.3.5)
SinricPro
On this GitHub repo, you’ll get all the required documentation and examples:
1 | https://github.com/sinricpro |
The biggest problem of the libraries is facing compilation errors. So, first, try to compile to test your setup. This can suck a lot of time. Here is a sample code for testing compilation and your project:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | //#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 "YOUR-WIFI-NAME" #define WIFI_PASS "YOUR-WIFI-PASSWORD" #define APP_KEY "YOUR-APP-KEY" // Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx" #define APP_SECRET "YOUR-APP-SECRET" // Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx" //Enter the device IDs here #define device_ID_1 "SWITCH_ID_NO_1_HERE" #define device_ID_2 "SWITCH_ID_NO_2_HERE" #define device_ID_3 "SWITCH_ID_NO_3_HERE" #define device_ID_4 "SWITCH_ID_NO_4_HERE" // define the GPIO connected with Relays and switches #define RelayPin1 23 //D23 #define RelayPin2 22 //D22 #define RelayPin3 21 //D21 #define RelayPin4 19 //D19 #define SwitchPin1 13 //D13 #define SwitchPin2 12 //D12 #define SwitchPin3 14 //D14 #define SwitchPin4 27 //D27 #define wifiLed 2 //D2 // comment the following line if you use toggle switches instead of tactile buttons //#define TACTILE_BUTTON 1 #define BAUD_RATE 9600 #define DEBOUNCE_TIME 250 typedef struct { // struct for the std::map below int relayPIN; int flipSwitchPIN; } deviceConfig_t; // this is the main configuration // please put in your deviceId, the PIN for Relay and PIN for flipSwitch // this can be up to N devices...depending on how much pin's available on your device ;) // right now we have 4 devicesIds going to 4 relays and 4 flip switches to switch the relay manually std::map<String, deviceConfig_t> devices = { //{deviceId, {relayPIN, flipSwitchPIN}} {device_ID_1, { RelayPin1, SwitchPin1 }}, {device_ID_2, { RelayPin2, SwitchPin2 }}, {device_ID_3, { RelayPin3, SwitchPin3 }}, {device_ID_4, { RelayPin4, SwitchPin4 }} }; typedef struct { // struct for the std::map below String deviceId; bool lastFlipSwitchState; unsigned long lastFlipSwitchChange; } flipSwitchConfig_t; std::map<int, flipSwitchConfig_t> flipSwitches; // this map is used to map flipSwitch PINs to deviceId and handling debounce and last flipSwitch state checks // it will be setup in "setupFlipSwitches" function, using informations from devices map void setupRelays() { for (auto &device : devices) { // for each device (relay, flipSwitch combination) int relayPIN = device.second.relayPIN; // get the relay pin pinMode(relayPIN, OUTPUT); // set relay pin to OUTPUT digitalWrite(relayPIN, HIGH); } } void setupFlipSwitches() { for (auto &device : devices) { // for each device (relay / flipSwitch combination) flipSwitchConfig_t flipSwitchConfig; // create a new flipSwitch configuration flipSwitchConfig.deviceId = device.first; // set the deviceId flipSwitchConfig.lastFlipSwitchChange = 0; // set debounce time flipSwitchConfig.lastFlipSwitchState = true; // set lastFlipSwitchState to false (LOW)-- int flipSwitchPIN = device.second.flipSwitchPIN; // get the flipSwitchPIN flipSwitches[flipSwitchPIN] = flipSwitchConfig; // save the flipSwitch config to flipSwitches map pinMode(flipSwitchPIN, INPUT_PULLUP); // set the flipSwitch pin to INPUT } } bool onPowerState(String deviceId, bool &state) { Serial.printf("%s: %s\r\n", deviceId.c_str(), state ? "on" : "off"); int relayPIN = devices[deviceId].relayPIN; // get the relay pin for corresponding device digitalWrite(relayPIN, !state); // set the new relay state return true; } void handleFlipSwitches() { unsigned long actualMillis = millis(); // get actual millis for (auto &flipSwitch : flipSwitches) { // for each flipSwitch in flipSwitches map unsigned long lastFlipSwitchChange = flipSwitch.second.lastFlipSwitchChange; // get the timestamp when flipSwitch was pressed last time (used to debounce / limit events) if (actualMillis - lastFlipSwitchChange > DEBOUNCE_TIME) { // if time is > debounce time... int flipSwitchPIN = flipSwitch.first; // get the flipSwitch pin from configuration bool lastFlipSwitchState = flipSwitch.second.lastFlipSwitchState; // get the lastFlipSwitchState bool flipSwitchState = digitalRead(flipSwitchPIN); // read the current flipSwitch state if (flipSwitchState != lastFlipSwitchState) { // if the flipSwitchState has changed... #ifdef TACTILE_BUTTON if (flipSwitchState) { // if the tactile button is pressed #endif flipSwitch.second.lastFlipSwitchChange = actualMillis; // update lastFlipSwitchChange time String deviceId = flipSwitch.second.deviceId; // get the deviceId from config int relayPIN = devices[deviceId].relayPIN; // get the relayPIN from config bool newRelayState = !digitalRead(relayPIN); // set the new relay State digitalWrite(relayPIN, newRelayState); // set the trelay to the new state SinricProSwitch &mySwitch = SinricPro[deviceId]; // get Switch device from SinricPro mySwitch.sendPowerStateEvent(!newRelayState); // send the event #ifdef TACTILE_BUTTON } #endif flipSwitch.second.lastFlipSwitchState = flipSwitchState; // update lastFlipSwitchState } } } } void setupWiFi() { Serial.printf("\r\n[Wifi]: Connecting"); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { Serial.printf("."); delay(250); } digitalWrite(wifiLed, HIGH); Serial.printf("connected!\r\n[WiFi]: IP-Address is %s\r\n", WiFi.localIP().toString().c_str()); } 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); SinricPro.restoreDeviceStates(true); } void setup() { Serial.begin(BAUD_RATE); pinMode(wifiLed, OUTPUT); digitalWrite(wifiLed, LOW); setupRelays(); setupFlipSwitches(); setupWiFi(); setupSinricPro(); } void loop() { SinricPro.handle(); handleFlipSwitches(); } |
When you will be able to compile, go to the Sirnic Pro website:
1 | https://sinric.pro/ |
Register yourself. It is free for 3 devices. After login, go to the Rooms
tab and create a room. Then go to the “Devices” tab and add your ESP32. After adding your ESP32 and the logic, you’ll find a Zero Code
button appearing beside the listed devices.
It is like a wizard to add logic. You’ll get the auto-generated Arduino sketch at the end of the wizard.
You can integrate Samsung SmartThings from the API Integrations tab. It is probably the easiest way to integrate Samsung SmartThings:
1 | https://help.sinric.pro/pages/smartthings |
That is it. You only add the relays, LED and pushbutton or piano switch looking checking the above sketch. Except for linking the login credentials, you have nothing to code.