smart-lights uses conduit v1 to switch room lights from the cloud | Remote by Ouwen uses conduit to easily control a Legget & Pratt remote from the cloud |
Conduit is an entirely open-source web service that allows you to securely control and interface with fleets of ESP8266-based IoT devices from anywhere in the world (even if those devices themselves don't have public or static IP addresses). Conduit offers a centralized RESTful API to do things like eaisly execute arbitrary firmware functions on your device or receive data from your device(s). You can use the already deployed service or spin up your own instance (useful if you want to ensure all of your infrastructure stays behind a private network--say a hospital network).
You can do all this simply by dropping in a few lines of code into your firmware and then issuing RESTful API requests to the conduit web service to call your firmware functions. Skip ahead to a full minimal example if you're ready to get started right away!
A central conduit API server is already deployed at https://api.conduit.suyash.io (should be used for all API routes) with a user-friendly front-end deployed at https://conduit.suyash.io.
Method | Route | Sample Request | Notes |
---|---|---|---|
POST | /api/login | { "email": "test@test.com", "password": "test" } |
Authenticate with Conduit, get issued a JWT |
POST | /api/call | {"token": "JWT token from login", "device_name": "myDeviceName", "function_name": "ledToggle", "wait_for_device_response": "true"} |
Call a function (ledToggle) on one of your ESP8266 devices (named "myDeviceName" here)! |
POST | /api/user_info | {"token": "JWT token from login"} |
This returns information about your user account, including your account secret which you must include in your firmware. |
Below is a minimal example of firmware code needed to get started with Conduit to blink an LED. See the next section for a complete example.
#include <Arduino.h>
#include <Conduit.h> // get from suyashkumar/conduit-firmware-library or platformio
#define LED D0
const char* ssid = ""; // wifi ssid
const char* password = ""; // wifi password
const char* device_name = ""; // you pick this! IDentifier for your device
const char* server_url = "api.conduit.suyash.io"; // location of the API server
const char* account_secret = ""; // register and call /api/user_info to get this
Conduit conduit(device_name, server_url, account_secret);
int ledStatus = 0;
int ledToggle(RequestParams *rq){
digitalWrite(LED, (ledStatus) ? HIGH : LOW); // LED is on when LOW
ledStatus = (ledStatus) ? 0 : 1;
Serial.println(rq->request_uuid);
conduit.sendResponse(rq, (ledStatus) ? "ON":"OFF");
}
void setup(void){
Serial.begin(115200); // Start serial
digitalWrite(LED, HIGH);
conduit.startWIFI(ssid, password); // Config/start wifi
conduit.init();
conduit.addHandler("ledToggle", &ledToggle);
}
void loop(void){
conduit.handle();
}
and now you can call ledToggle
on that device from anywhere in the world by using the following APIs:
-
Get your login token by authenticating POST https://api.conduit.suyash.io/api/login:
curl 'https://api.conduit.suyash.io/api/login' \ -H 'content-type: application/json;charset=UTF-8' \ --data-binary '{"email":"YOUR_EMAIL", "password":"YOUR_PASSWORD"}' --compressed
-
POST https://api.conduit.suyash.io/api/call:
curl 'https://api.conduit.suyash.io/api/call' \ -H 'content-type: application/json;charset=UTF-8' \ --data-binary '{"token":"YOUR_LOGIN_TOKEN","device_name":"YOUR_DEVICE_NAME","function_name":"ledToggle","wait_for_device_response":true}' --compressed
Conduit is currently in active development, so please feel free to contact me with comments/questions and submit pull requests!
Controlling an LED on the ESP8266 from the Cloud takes less than 5 minutes with Conduit. Example firmware code to go along with this tutorial can be found here
Please make sure you've installed the relevant drivers (here if you're using the nodemcu ESP8266 chip linked above) and installed the platformio build system (simply brew install platformio
if you're on a mac).
- Create a conduit account at https://conduit.suyash.io/#/login
- Retreive your account secret from the Account view at https://conduit.suyash.io/#/account
- Clone the conduit firmware repo and change into the
examples/basic_functionality
directory.
git clone https://github.com/suyashkumar/conduit-firmware-library.git
cd examples/basic_functionality
- Open
src/main.ino
. Fill in the following lines (account secret comes from step 2):
const char* ssid = ""; // wifi ssid
const char* password = ""; // wifi password
const char* device_name = ""; // you pick this! IDentifier for your device
const char* server_url = "api.conduit.suyash.io"; // location of the API server
const char* account_secret = ""; // register and call /api/user_info to get this
- Build the project using platformio. You should install platformio (if you haven't already) to build this properly. Ensure you're in the root directory of the example (not
src
) and run:
platformio run
If your ESP8266 chip is connected via usb already, to build and upload the program run:
platformio run --target upload
NOTE: to properly upload to an ESP8266 chip, you must have installed the ESP8266 drivers on your system already.
- You should be set! You can now go to the conduit interact view (https://conduit.suyash.io/#/interact) and type in your device name (that you chose in step 4) and
ledToggle
as the function and hit "Execute!" to see your LED on your device toggle! You can also issue RESTful API requests to conduit to trigger functions on your device from any app that you build as mentioned here
Copyright (c) 2018 Suyash Kumar
See conduit/LICENSE for license text (MIT).