Showing posts with label Home Automation. Show all posts
Showing posts with label Home Automation. Show all posts

Tuesday, 20 June 2017

HOME AUTOMATION: Voice control with Google Home + IFTTT + myopenHAB

Recently I purchased a Google Home Assistant and it's been a lot of fun to play with the native features like shopping lists, reminds and Chromecast control I was really excited to dig in to getting the Home Assistant tied in to my openHAB setup. While the HA does not native support openHAB, it does support IFTTT and now openHAB also has added support for IFTTT through myopenHAB.
I followed the steps below to get my setup working.


Install the "openHAB Cloud Connector" Add-on

I've already covered this in a previous post, make sure myopenHAB is set up correctly and ensure you have exposed the items you want to connect with your HA.

Note: I've seen it take up to 36 hours for settings updated from the cloud connect plugin to appear in the IFTTT actions menu


IFTTT Integration

Register for IFTTT and create a custom applet by selecting the "My Applets" link

IFTTT home page



Create a new applet and click on the blue "+ this" button. This was confusing to me at first because I don't think it looks much like a link/button.

Select "New Applet"

Click the "+ this" button


Filter the available connections by typing "google" and select the "Google Assistant" service.
There are a number of options to choose from with the Google Assistant service, the simplest applet would use the "Say a simple phrase" function.



It's important to think about the various ways you might want to say the command you wish to execute. I've had to change a number of my applets because what I thought was natural when making the applet didn't roll off the tongue when I was sitting on the couch.


Next thing to do is to set the "that" part of IFTTT by clicking the "+ that" button and filtering the services for openHAB. Once the openHAB service is selected there is only one action, so no place to go wrong here.



Now select the item that was exposed through the openhab Cloud Connector Add-on. Once again, if your items aren't showing up you may need to give it more time to be updated. I've seen it take up t 36 hours.


That's it! Finish off the applet creation, give it a few seconds and test it out.

Sunday, 12 March 2017

HOME AUTOMATION: Teptron move control from Linux

UPDATE: this method does not appear to work with the latest Teptron Move firmware. The developer of csrmesh is looking in to the problem but there is no current solution for controlling the Teptron Move from anything other than the app.

My biggest pain point with the Teptron Move automated blinds device at the moment is the lack of app updates and any functionality other than just simply commanding the blinds from my phone. Because of this I have basically removed the devices from my blinds. You can read more about my issues with the device in an old post.

I recently started to think about how I could potentially expose the CSR bluetooth mesh that the Move uses to my wireless network. This would allow me to get the automation I'm looking for out of my OpenHAB controller. I came across a project on GitHub claiming to have reverse engineered the CSRMesh protocol for the Teptron Move and decided to give it a shot.

I did a little more digging and found some posts on the domoticz forums talking about how to integrate the linux script with the domoticz home automation solution to automated the Move units, so I decided to investigate the possibility of integrating the devices with my OpenHAB system.

Installing The Script

Git is not installed on the Ubuntu image for the Pine64. Install with the following commands:
 apt-get install git  

If it's the first time using git on your machine you need to:
  • Generate an rsa key 
  • Follow the Github instructions to add the rsa key to you github account
I also found this article useful to debug my problem.

If you don't follow these steps you will get the error:
 Permission denied (publickey).  
 fatal: Could not read from remote repository.  

Now create a new directory clone the csrmesh repository into that directory:
 mkdir Downloads  
 cd Downloads  
 git clone git@github.com:nkaminski/csrmesh.git  

Build and install the project:
 python setup.py build  
 sudo python setup.py install  

The script also needs the bluez software installed:
 sudo apt-get installed bluez  

If you are trouble getting your bluetooth running on an Raspberry Pi 3 with OpenHABian I have explained how I did it in an older post.


Bluetooth Setup

If your device doesn't support Bluetooth natively you will need to do some work with a USB Bluetooth adapter to get connected  to the Move units.

Insert the USB adapter in to the Pine64 and run the following command to check the device was recognised:
 dmesg  

 If the device was recognised by the linux kernel you should see an output something like this
 [449253.083342] input: Logitech Logitech BT Mini-Receiver as /devices/soc.0/1c1b000.ohci1-controller/usb4/4-1/4-1.2/4-1.2:1.0/input/input5  
 [449253.083769] hid-generic 0003:046D:C71B.0001: input: USB HID v1.11 Keyboard [Logitech Logitech BT Mini-Receiver] on usb-sunxi-ohci-1.2/input0  
 [449253.159418] usb 4-1.3: new full-speed USB device number 4 using sunxi-ohci  
 [449253.303636] input: Logitech Logitech BT Mini-Receiver as /devices/soc.0/1c1b000.ohci1-controller/usb4/4-1/4-1.3/4-1.3:1.0/input/input6  
 [449253.304398] hid-generic 0003:046D:C71C.0002: input,hiddev0: USB HID v1.11 Mouse [Logitech Logitech BT Mini-Receiver] on usb-sunxi-ohci-1.3/input0  
 [449253.581549] usb 4-1.1: new full-speed USB device number 5 using sunxi-ohci  
 [449253.750067] usbcore: registered new interface driver btusb  
 [449253.875233] Bluetooth: BNEP (Ethernet Emulation) ver 1.3  
 [449253.875245] Bluetooth: BNEP filters: protocol multicast  
 [449253.875282] Bluetooth: BNEP socket layer initialized  
 [470188.654809] sunxi-bt bt.28: set block: 0  
 [470188.654971] sunxi-bt bt.28: check bluetooth io_regulator voltage: 1800000  
 [470193.118153] sunxi-bt bt.28: block state already is 0  

We can now run one of the bluez commands to check if the bluetooth adapter was recognised and is available for us:
 hcitool dev  

If everything is in order with your setup you should see an output like the one below and you can continue on to the next section:
 ubuntu@pine64:~$ hcitool dev  
 Devices:  
     hci0  00:1F:20:51:CC:AA  

If you don't see any devices listed then you will have to do some work to enable the Bluetooth adapter. You should have a utility installed called rfkill that is used to enable and disable wireless devices. If it's not installed you can install it with the command:
 sudo apt-get install rfkill  

Run the following command to see your connection status:
 ubuntu@pine64:~$ rfkill list  
 0: sunxi-bt: Bluetooth  
     Soft blocked: Yes  
     Hard blocked: no  
 1: phy0: Wireless LAN  
     Soft blocked: no  
     Hard blocked: no  
 2: phy1: Wireless LAN  
     Soft blocked: no  
     Hard blocked: no  
 3: hci0: Bluetooth  
     Soft blocked: Yes  
     Hard blocked: no  

The following command will remove the soft block on the Bluetooth adapter:
 sudo rfkill unblock bluetooth  

Now run the "rfkill list" command again and you should see the soft block has been removed.

Success! The Bluetooth output has been enabled and we should be able to see available Bluetooth devices if we run the hcitool dev command again. We can confirm the device is working by scanning for available Bluetooth devices:
 hcitool scan  

The above command will scan for regular Bluetooth devices but will not be able to to see Low Energy (BLE) devices. In order to scan the available BLE devices we need to run the command:
 sudo hcitool lescan


Testing The Script

Typically we would do a hcitool scan to get a devices MAC address, but the csrmesh network doesn't allow us to do this (at least in my setup). I've connected to the CSRMesh network from my Windows laptop and used that connection to gather the device address to include in the script.
The address I grabbed from my PC was: BTHLE\Dev_43c55b040006

The Github documentation tells us to format the command in the following way:
 ./bin/csrmesh-cli move --pin 8888 --dest 43:c5:5b:04:00:06 --objid 1 --position 255  

You need to make sure you are running this command from within the csrmesh folder that was cloned earlier. If everything worked you should see your Move unit move to the set position and the output:
 Running: gatttool -b 43:c5:5b:04:00:06 --char-write-req -a 0x0021 -n 0fe2bd00809bb9d83b76b48585673a77b747ff  
 Characteristic value was written successfully  

Note: The only gotcha here is the pin for the Move units. Here you will need to remember the password you set to the CSRMesh network when you first set up your move unit. If like me you have forgotten this, perform a factory reset on the unit by removing the battery, hold down the stop key then re-insert the battery. The notification light on the bottom of the device should be on solid. Keep holding the stop key for at least 5 seconds at which point the device should be reset. In my experience you don't get any feedback that it has performed the reset. With the device having been factory reset you can restart the Android app and enter a new password.

The next step here is to now enable the device for use with OpenHAB.


UPDATE:
I've written a post on how to get this script working with openHAB here

Thursday, 2 February 2017

HOME AUTOMATION: ESP8266, Blynk and OTA Updates

I previously used Blynk to set up remote access to my house via my phone and a electric door strike. Since then I learned of the Arduino Over The Air (OTA) update library that would allow me to remotely update the firmware of my device so naturally I immediately wanted to add this feature.

Arduino OTA Library:

You can read about the library on the Arduino github site here, but basically there are three ways you can implement the OTA update:

  1. Arduino IDE
  2. Web Browser
  3. HTTP Server
I've decided to go for the Arduino IDE scenario that is described here.
The requirements for this process are:
  • Arduino IDE (tested with 1.6.8)
  • Python 2.7


Arduino IDE OTA Update:

Basically all you really is the command "ArduinoOTA.begin();" in the setup routine and the command "ArduinoOTA.handle();" in the loop function. This is the bare minimum you need to get it working, but we'll add some more things like error handling and some basic security.

EDIT: I couldn't get the Arduino IDE security feature working on my windows 10 machine, it seems there are a few bugs still being worked out 


Blynk and OTA Code:


/**************************************************************
 * Blynk is a platform with iOS and Android apps to control
 * Arduino, Raspberry Pi and the likes over the Internet.
 * You can easily build graphic interfaces for all your
 * projects by simply dragging and dropping widgets.
 *
 *   Downloads, docs, tutorials: http://www.blynk.cc
 *   Blynk community:            http://community.blynk.cc
 *   Social networks:            http://www.fb.com/blynkapp
 *                               http://twitter.com/blynk_app
 *
 * Blynk library is licensed under MIT license
 * This example code is in public domain.
 *
 **************************************************************
 * This example runs directly on ESP8266 chip.
 *
 * WARNING! ESP8266 SSL support is still experimental.
 *          More info here: https://github.com/esp8266/Arduino/issues/43
 *
 * Note: This requires ESP8266 support package:
 *   https://github.com/esp8266/Arduino
 *
 * Please be sure to select the right ESP8266 module
 * in the Tools -> Board menu!
 *
 * Change WiFi ssid, pass, and Blynk auth token to run :)
 *
 **************************************************************/

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#define RELAY_PIN D1

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266_SSL.h>
#include <Ticker.h>
#include <ArduinoOTA.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "XXXX";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "XXXX";
char pass[] = "XXXX";
char hostOTA[] = "DoorLock";
char passOTA[] = "XXXX";

bool vPinState = false;               // Set the default virtual pin state
int maxRelayOnTime = 10;              // Set the max on time of the relay 
int minRelayOnTime = 1;               // Set the minimum on time of the relay
int vDelayTime = minRelayOnTime;      // Set the initial delay time value
Ticker doorLatch;                     // Callback fuction instance

void setPinLow()
{
  digitalWrite(RELAY_PIN, 0);
  doorLatch.detach();
}

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);

  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, 0);

  ArduinoOTA.setHostname(hostOTA);
  //ArduinoOTA.setPassword(passOTA);
  ArduinoOTA.onStart([]() {
    Serial.println("OTA: Start");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nOTA: End");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("OTA: Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("OTA: Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("OTA: Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("OTA: Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("OTA: End Failed");
  });
  ArduinoOTA.begin();
  Serial.println("OTA: Ready");
}

void loop()
{
  ArduinoOTA.handle();
  Blynk.run();
}

BLYNK_WRITE(V0)
{
  // Get the virtual input state
  vPinState = param.asInt();

  // If the virtual input went high
  if(vPinState)
  {
    // Open the relay
    digitalWrite(RELAY_PIN, 1);
    // Turn off the relay after the defined delay time
    doorLatch.attach(vDelayTime, setPinLow);
  }
}

BLYNK_WRITE(V1)
{
  // Get the input from the virtual input slider
  vDelayTime = param.asInt();

  // Constrain the virtual slider input to within the preset bounds
  vDelayTime = constrain(vDelayTime, minRelayOnTime, maxRelayOnTime);
}


How to update your device OTA:

Once you get the code loaded on to your device you should see the unit appear in your list of ports under the 'Tools' heading.
I had to reboot my machine to get this to work for me. Now you can upload code to your device over the network as if it was connected via USB.


Saturday, 21 January 2017

HOME AUTOMATION: WeMo Maker as electric door latch relay

I recently tested the WeMo Maker to replace the electric door strike relay I had installed that was controlled via my doorbell. I picked it up for $69 from Bunnings Warehouse.
The idea was that I would replace the wireless relay that came with my doorbell for the Wemo Maker and then use the WeMo app (possibly with IFTTT) to unlock the door from my phone. I didn't plan to use the sensor input feature on the device. 




Setup was easy, I followed the instructions that came with the device and was up and running in about 15 minutes. It was soon after setup that I realised the limitations of the device...


The issues:

In order to work as an electric door strike relay I required the device to function as a momentary switch, turning on for a short amount of time and then turning back off to lock the door again. Typically devices built for door unlocking operations have a latching delay that can be set by a jumper, meaning that when the door is remotely unlocked it will be held unlocked for the set amount of time. So with the WeMo Maker I needed it to do the same.
When I took a look at the settings of the device I noticed there was no setting for the 'on time' of the relay. Some googling led me to discover that the WeMo Maker is only capable of a 300ms on time as set by the firmware, making the device pretty much useless for my remote entry needs without some extra circuitry.

IFTTT to the rescue:

WeMo have made their products compatible with the IFTTT platform making it possible to connect hundreds of services to the device.
After sifting through all the services trying to find one that allowed me to connect a countdown timer to the device, I found that one of the default WeMo Maker IFTTT actions was "on then off after 2 seconds". Perfect!

The results:

In reality the way this setup had me using the device was not ideal, be default the device didn't allow me to set a relay 'on time'. While I was able to get around this with IFTTT the reality of the service was that I was getting an approximately 8 second delay from pressing the button widget on my phone to having the door lock open. Combine this with the relatively short amount of time that the lock was open and the result was me having to just repeatedly pull on the door waiting for it to unlock after pressing the unlock button. Not ideal given the cost of the device. 

Wednesday, 18 January 2017

HOME AUTOMATION: Automated blinds - Teptron Move

Adding automated blinds to my home automation system has always been something I wanted to do. The promise of waking up to natural lighting the morning or coming home to a cool house on a hot day is what I imagine is an essential part of the house of the future.

I did some research and didn't find much in the way of a cheap DIY solution on the market, most of the solutions were at least a couple of hundred dollars per unit and required 240v wiring.
That was until I found the Teptron Move Kickstarter campaign, promising to give me everything I wanted for about $60 per blind including a solar charging panel. It was the cheapest of the DIY solutions I found and didn't require and extra wiring.




The reality:

The Kickstarter campaign took longer than expected (as usual) but I did eventually get my Bluetooth controlled blinds. I'm using the units on block-out roller blinks and opted to install with the double sided adhesive tape to try the system out before drilling any holes.
My experience with the system has been mixed, but here are the main points:
  • Be careful where you place the mechanism. May work on the way up but not down. My blinds catch on the Move unit on their way down so I need to stand by the unit to flick the bottom of the blind over the unit.
  • When I initially ordered the device there was no mention of load rating. I have big blinds and am right on the edge of capability for two out of three blinds and overweight on the third. This is probably not an issue if you are using the device for vertical blinds
  • Being over the load rating I needed to pull some serious tension on the beaded chain to get the device to work properly. As you can imagine this does not work well with the double sided tape over a long period of time in the heat of summer.
  • It's not always convenient to use my phone to open the blind. This point has probably been my single biggest issue with the Move unit
  • In my situation the physical buttons are impossible to get to when the blind is closed


Chain tension and double sided tape over time

Chain cover moved as it was getting in the way

Physical buttons hidden by the blind when closed


App (Android) v1.02

It was immediately obvious that the developers had over promised on this one. It's been a few months now and updates don't seem to be making it out, there is not much functionality at the moment and a few things are clearly missing:
  • I was only able to pair with one phone. I initially did it from a tablet then had to reset the device to connect with my phone, but somehow now both my phone and tablet can connect with the unit and set blind position
  • No automation functionality at the moment
  • No IFTTT support 
  • My blinds are back to front to the pictures shown
  • Blind doesn't always go to the correct position as per the slider bar, but has never gone past the end points
My blind is closed in the state shown


No automation support

Conclusion:

After using the devices for a little over one month the biggest issue I have with my system is not the devices fault, but my blinds catch on the way down and jam up on the unit itself. It's really annoying. I'm waiting on another Kickstarter campaign to send me my 3D printer so I can make a deflector bracket for the blind.

Blind caught in chain on the way down


My second biggest pain point with the device is that it's not as convenient as I thought it would be due to the placement of the manual control buttons. In my configuration the physical buttons are hidden behind the blind and it's really annoying to access.

Move unit hidden behind the blind

In reality without the automation component of the blinds I use the physical buttons 95% of the time, so it's pretty annoying to use at the moment. I'm considering a couple of hacks to expose the buttons for use with a wired remote but I'm not of the possibility of that at the moment, the unit isn't as easy to pull apart as I first though.


Update - 21/01/2017

I've tried to disassemble my move unit with no luck. The unit really doesn't appear to be made to disassemble...





Update - 24/01/2017

I contacted Teptron directly, they tell me the device is glued together and would need to be destroyed to be disassembled. Going to need to think of something else...

Sunday, 15 January 2017

HOME AUTOMATION: Web Enabled Relay with Blynk

One of the most useful parts of my home automation system is internet enabled entry control that lets me use my phone to get in to my house when I don't have keys on me or it's just easier to use my phone. This setup requires an electric door strike and an wifi enabled relay.

I've tried a number of ways to get an easy to use solution to work from both the web and my phone including:

I won't go over the pros and cons of each here, I'll just give the details on how to get it working with Blynk.


Why Blynk?

There are a lot or reasons listed on the Blynk website, but the reasons I went for it over the competition were:
  • Android and iOS app
  • Arduino support 
  • Really easy to use
  • Free account option 
  • SSL support
  • Local server support
I'm yet to find anything that was as simple to use as Blynk. From the time I took out my tub of Wemos modules it took me 15 minutes to get a working example (including some troubleshooting!)


To get my wireless relay set up I used the following:
  • Wemos D1 mini (ESP8266)
  • Wemos D1 mini relay shield 
  • 12v power supply 
  • Electric door strike 
  • Soldering iron and heat shrink 
  • Blynk account (done via the app)
  • Computer with Arduino Studio installed and Sparkfun ESP8266 library installed via the library manager
  • Android or iOS device with the Blynk app installed


The default Blynk examples only show how to mirror the pins of the Arduino from the Android/iOS app. I wasn't able to find any way to hold a pin high once triggered for a set period of time within the Android app, so I developed an Arduino sketch (below) that uses virtual IO to trigger and latch physical IO.


Arduino Programming

The Wemos D1 Mini board has a built in USB to serial converter so all we need to do is plug in a micro USB cable to the device and install the required drivers.
Once we have Arduino Studio installed we need to install the toolchain for the ESP8266 board, I did this by following the instructions on the esp8266 github page. Wemos also has some libraries for their boards that give some examples of using their shields.

Once this is all setup the D1 mini can be programmed as you would any other Arduino board. Blynk also has a library that can be installed from the library manager with examples for the ESP8266 boards. One of those examples shows how to connect to Blynk servers using SSL.

Tip: Debugging over serial can be useful to ensure your device is connecting to your wireless network. Make sure your serial terminal is set to the correct baud rate, in the default examples the baud rate is set to 9600 but the default terminal rate is 155200 kbps

I'm using the below program to set the relay on-time via a virtual input and then toggle the relay via another virtual input. You will need the Blynk and Ticker libraries to compile the example.

 /**************************************************************  
  * Blynk is a platform with iOS and Android apps to control  
  * Arduino, Raspberry Pi and the likes over the Internet.  
  * You can easily build graphic interfaces for all your  
  * projects by simply dragging and dropping widgets.  
  *  
  *  Downloads, docs, tutorials: http://www.blynk.cc  
  *  Blynk community:      http://community.blynk.cc  
  *  Social networks:      http://www.fb.com/blynkapp  
  *                http://twitter.com/blynk_app  
  *  
  * Blynk library is licensed under MIT license  
  * This example code is in public domain.  
  *  
  **************************************************************  
  * This example runs directly on ESP8266 chip.  
  *  
  * WARNING! ESP8266 SSL support is still experimental.  
  *     More info here: https://github.com/esp8266/Arduino/issues/43  
  *  
  * Note: This requires ESP8266 support package:  
  *  https://github.com/esp8266/Arduino  
  *  
  * Please be sure to select the right ESP8266 module  
  * in the Tools -> Board menu!  
  *  
  * Change WiFi ssid, pass, and Blynk auth token to run :)  
  *  
  **************************************************************/  
 #define BLYNK_PRINT Serial  // Comment this out to disable prints and save space  
 #define RELAY_PIN D1  
 #include <ESP8266WiFi.h>  
 #include <BlynkSimpleEsp8266_SSL.h>  
 #include <Ticker.h>  
 // You should get Auth Token in the Blynk App.  
 // Go to the Project Settings (nut icon).  
 char auth[] = "XXXXXXXX";  
 // Your WiFi credentials.  
 // Set password to "" for open networks.  
 char ssid[] = "XXXXXXXX";  
 char pass[] = "XXXXXXXX";  
 bool vPinState = false;        // Set the default virtual pin state  
 int maxRelayOnTime = 10;       // Set the max on time of the relay   
 int minRelayOnTime = 1;        // Set the minimum on time of the relay  
 int vDelayTime = minRelayOnTime;   // Set the initial delay time value  
 Ticker doorLatch;           // Callback fuction instance  
 void setPinLow()  
 {  
  digitalWrite(RELAY_PIN, 0);  
  doorLatch.detach();  
 }  
 void setup()  
 {  
  Serial.begin(9600);  
  Blynk.begin(auth, ssid, pass);  
  pinMode(RELAY_PIN, OUTPUT);  
  digitalWrite(RELAY_PIN, 0);  
 }  
 void loop()  
 {  
  Blynk.run();  
 }  
 BLYNK_WRITE(V0)  
 {  
  // Get the virtual input state  
  vPinState = param.asInt();  
  // If the virtual input went high  
  if(vPinState)  
  {  
   // Open the relay  
   digitalWrite(RELAY_PIN, 1);  
   // Turn off the relay after the defined delay time  
   doorLatch.attach(vDelayTime, setPinLow);  
  }  
 }  
 BLYNK_WRITE(V1)  
 {  
  // Get the input from the virtual input slider  
  vDelayTime = param.asInt();  
  // Constrain the virtual slider input to within the preset bounds  
  vDelayTime = constrain(vDelayTime, minRelayOnTime, maxRelayOnTime);  
 }  

Android App:

My Blynk project (Android) looks like this:

New device setup screen
Physical Pin and Virtual Pin Mapping
Slider controlling the unlocked time using Virtual Pin 1
Unlock button linked to Virtual Pin 0

Example configuration of relay on physical pin D1

Example configuration of relay on Physical Pin D4. Note the inverse logic configuration of the LED as it is ON when pin D4 is pulled low.


Tip: if you are using the Wemos boards and use the generic ESP8266 board in the Blynk App the built-in led is pin 2 and the relay is pin 5 (D1 on the wemos web page)


Wiring:

My door strike is set up as per the wiring diagram below. I followed the instructions that came with my door strike.




Conclusion:

And that's it! It's as easy as that. I've had my setup running for a few days now with no issues. My past experience with ESP8266 solutions doesn't give me the greatest confidence in device up-time so I'll monitor the solution and see how stable it is.

It's worth noting that I'm not entirely sure how secure Blynk is, so at the moment I'm being cautious and running a local copy of the Blynk server hosted on my local network. I'll need to do some investigating in to this one.