Useful Resources

Reference material or other items like datasheets, articles, or whitepapers. Useful for consideration in projects or general technical reference.

Sonoff: A Versatile WiFi Switch

I have been playing a lot with home automation technologies and the ESP82XX/arduino platform as hardware interfaces to my ever expanding control system. Most of the stuff I’m implemented has been Z-Wave, but though Z-Wave is an excellent technology, it is rather pricey to acquire. Since the ESP8266 & ESP8285 chips have started showing up in some finished electronics, it is now possible, now more than ever, to reprogram these devices with your own custom firmware!

One such device is made by iTead Studio and is called Sonoff. Sonoff allows you to switch an AC load using your mobile device or PC from anywhere via their own cloud. In my home automation implementation, I want as little cloud involvement as possible – to minimize attack risk, and to keep other firms from data mining my habits at home. The only way to do that is to use technologies that allow local control and without cloud reliance. Unmodified, the Sonoff is an excellent device and generally available for $7 per unit. If you don’t mind sharing your usage data with iTead Studio or relying on their cloud infrastructure to operate your device, then there’s no need to modify it – just use it as prescribed.

For those who want total control and privacy, you can easily use 3rd party firmware or write your own! In my case, I wrote my own firmware which enables a simple HTTP interface which can be called by my Domoticz controller or manually. Since I have a VPN connection to my home on a DDNS hostname, I can easily and securely operate any devices from anywhere in the world with no need for an outside 3rd party, right from my mobile. To flash a custom firmware, you will need a few things:

  • Sparkfun FTDI Basic 3.3v USB to Serial interface
  • 5 pin header (to solder into the Sonoff unit)
  • Arduino IDE software – to program the ESP8285 chip in the Sonoff
  • Screwdriver
  • Soldering Iron
  • Custom Firmware of your choosing or your own
  • Male to Female Dupont wires to wire the FTDI breakout to the header you’ll install (see diagrams)

*** WARNING *** WARNING *** WARNING ***

This project/information deals with MAINS CONNECTED equipment!  You should NOT attempt to undertake anything described herein unless you are familiar with and confident with working with electricity and electrical safety!  Risk of DEATH, FIRE, ELECTRIC SHOCK, and PROPERTY DAMAGE can result if you are attempt anything described here without being familiar with the concepts and safety herein.   I will not be liable for your use of any of this information should you or someone else be killed or injured.  I implore you to seek qualified and experienced help if you are unfamiliar with or unsure of anything described here.  PLEASE BE SAFE!

Let’s Get Started!

First, you will CAREFULLY disassemble your Sonoff unit and remove the curcuit board inside.  You will notice an unpopulated header where you will solder your 5 pin header to.  This is the programming interface.  (click for larger view)

Once you have soldered on the 5 pin header, you will now connect your FTDI serial breakout to your Sonoff:  (Click for larger view)

Once connected, now you will load your firmware into the IDE and choose the “Generic ESP8285” board and 1M size flash as shown: (click for larger view)

To flash: (NOTE: there is NO WAY to go back to stock firmware!  this is a final operation!!!)

  1. Remove 3.3v lead
  2. Hold down button & reconnect 3.3v lead (at the same time)
  3. Release the button
  4. Flash your firmware

That’s it!  Reassemble your Sonoff switch and your Sonoff should be ready to use!

Here’s my firmware.  You are free to use/modify it.   In my application I wanted the IP hardcoded, but you can easily change this to be DHCP.  I’m currently (at the time of this writing) trying to figure out how to serve the HTTP interface from SPIFFS but not quite there yet so for now, it is hardcoded and functional.

Here’s how mine looks:

Very simple!  You’ll notice that in my code, the switch responds to the URLs of /on and /off which makes it stupid simple to integrate with controllers like Domoticz, Wink, Smartthings, etc:  (click for larger view)

Once you configure this in your controller, you can then operate it as any other part of your system, and even with Amazon Echo (Alexa)!

Simple Download Manager for Linux/Mac

If you’re like me and you travel often, you know all too well how badly hotel wifi sucks.  Often, any attempt to download a large file is often met with frustration when the signal drops and you have to restart your download all over again.  Fortunately, there is a simple and blissful answer to this.  Enter, the persistent wget download script:

download-mgr2

As you can see here, only a minimum of code is needed to ensure you get that large file, no matter how many times your hotel connection craps out.  Simply create a password file (if downloading from a SSL site) and supply any needed user/password credentials.  This allows you to simply paste in a link and then walk away while the script does its magic.

Dependencies:

You need to install wget into your linux or mac machine.  Once you have that package installed, then this script will work just fine.

In this example, I’m downloading a large movie file from my NAS at home while I’m overseas.  You can see how this works here:

download-mgr

I’m on the east coast and can’t stay up late to listen live. So, I have setup a script on my Linux server that tunes in his show (I also set it up as a cron job so it is automatic) and the script saves the stream to a file on my NAS each night. From there, I can easily (and quickly) download it to my phone and listen ANYWHERE & ANYTIME without having to pay for access to the time travel archive. It’s like having a dedicated DVR for Art’s show!  It’s pure brilliance! Nice to have you back Art, and so far, the show is OUTSTANDING!

Here, I would like to help others who may be further east than I am and can’t be awake when his show airs.  If you are *somewhat* savvy with Linux, you can use this script to tune in and save his show (WITH BUMPER MUSIC INTACT) on your own system and listen as your schedule and life allow:stream-record

After setting up this script, you must call it in crontab to ensure it runs on Art’s posted schedule (note: please be sure to adjust the time/day values depending on what timezone your system adheres to).  here’s my crontab entry:

00 0    * * 2-6 root    /root/record.sh

This assumes you placed the script in /root/   but it can be any location you like.  Also, be sure you created any temporary and final directories as shown in the script or it will not work!

I wrote this script to only start the d-star daemons on a DV hotspot when there is a viable internet connection.  The reason for this is to simplify “in-the-field” use and only allow the system to start when there is an available internet connection.  Without this script, it was often a problem to ensure that the daemons always started AFTER the internet became available.  This script makes it easy to use a portable DV hotspot on D-Star in a simple “plug & play” way. Copy and paste this script to any text editor of your choice.

PLEASE NOTE: This code was modeled on an ODROID C1 (same price as the raspberry pi) but should be adaptable for the raspberry pi as well.

 

Global Functions File: (copy to /scripts/functions & set executable)

 

#!/bin/bash
#################################################################
#                                                               #
# Global functions for DV Hotspot automated management          #
# release v1    3-13-2015       John Rogers     K1WIZ           #
#                                                               #
#                                                               #
#################################################################

################# Check for internet reachability               
netcheck() {
N1=`ping -c 1 8.8.8.8 | grep '1 received' | wc -l`
	echo $N1 > /tmp/.netflag
}

################# start the gateway IF it is not already running
gwstart() {
        if [ "$G1" -eq 0 ]; then
                if [ "$N1" -eq 1 ]; then
                        /usr/local/bin/dstarrepeaterd -confdir:/etc &
                        	sleep 10
                        /usr/local/bin/timeserverd -confdir:/etc &
                        	sleep 10
                        /usr/local/bin/ircddbgatewayd -confdir:/etc &
                else
                        echo "$(date) NOT STARTED - NO INTERNET CONNECTION" >> /tmp/hs-log.log
                fi
        else
                echo "GATEWAY IS UP - RETURN TO LOOP" > /dev/null 2>&1
        fi
}

################# Check status of daemons
daemon() {
G1=`ps -ef | grep [i]rcddbgate | wc -l`
	echo $G1 > /tmp/.gwflag
R1=`ps -ef | grep [d]star | wc -l`
	echo $R1 > /tmp/.rptrflag
}

################# Misc Checks
safeshut() {
pwroff=`/usr/local/bin/gpio read 27`
	echo $pwroff > /tmp/.shutflag
        if [ "$pwroff" -eq 0 ]; then
                /sbin/poweroff
        else
                return 1
        fi
}
reset() {
restart=`/usr/local/bin/gpio read 26`
	echo $restart > /tmp/.restartflag
        if [ "$restart" -eq 0 ]; then
                /sbin/reboot
        else
                return 1
        fi
}

################# Initialize GPIO Channels
gpioinit() {
	/usr/local/bin/gpio mode 21 out
		/usr/local/bin/gpio write 21 0
	/usr/local/bin/gpio mode 22 out
		/usr/local/bin/gpio write 22 0
	/usr/local/bin/gpio mode 23 out
		/usr/local/bin/gpio write 23 0
	/usr/local/bin/gpio mode 24 out
		/usr/local/bin/gpio write 24 0
}

################# Drive GPIO & LEDS
leddriver() {
	gwflag=`cat /tmp/.gwflag`
		/usr/local/bin/gpio write 21 $gwflag
	rptrflag=`cat /tmp/.rptrflag`
		/usr/local/bin/gpio write 22 $rptrflag
	net=`cat /tmp/.netflag`
		/usr/local/bin/gpio write 23 $net
	shut=`cat /tmp/.shutflag`
		/usr/local/bin/gpio write 24 $shut
}

 

Management Loop Script calling functions above: (copy to /scripts/dvstart.sh & make executable)

(call this script from /etc/rc.local and background it with a “&”)

#!/bin/bash

# THIS SCRIPT WAITS FOR VIABLE INTERNET CONNECTION BEFORE STARTING HOTSPOT
# Written by: John Rogers, K1WIZ
# Permission is granted for free use as long as this notice is intact.

. /scripts/functions


for (( ; ; ))
        do
                safeshut
                reset
                netcheck
                daemon
                leddriver
                gwstart
                sleep 10
        done

So I recently decided to try a Banana Pro ARM microcomputer to evaluate for my next project.  I was disappointed that the unit output had overscan on my TV.  Fortunately there is a simple fix for this annoying problem which the folks at LeMaker do not mention in their forums.

 

1) Press Source on your remote
2) Move down to your HDMI source and press Tools
3) Select Edit name
4) Scroll down to PC and select that one
Your screen goes blank for a second – and mission accomplished.

banana-pro-interfaces

I wrote a short python script to read a GPIO pin and watch for a state change (from a momentary contact switch) in order to execute a safe, clean, & orderly shutdown of the raspberry pi computer, since no on-board provision exists out of the box. It is necessary to ensure a clean shutdown in order to avoid the chance that you might corrupt your SD card:


import os
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)

prev_input = 0
while True:
input = GPIO.input(4)
if ((not prev_input) and input):
os.system("/sbin/poweroff")
prev_input = input
#slight pause to debounce
time.sleep(0.05)

This script is used as an LED driver to show the operational status of the ircddbgateway & dstarrepeater daemons. If the daemons are up and running, an LED will be lit from the assigned GPIO to show simple operational status. Permission is granted to freely use and distribute for all purposes.


#!/bin/bash

gateway() {
G1=`ps -ef | grep [i]rcddbgate | wc -l`
echo $G1 > /sys/class/gpio/gpio17/value
}

repeater() {
R1=`ps -ef | grep [d]star | wc -l`
echo $R1 > /sys/class/gpio/gpio25/value
}

for (( ; ; ))
do
gateway && repeater
sleep 10
done

For added fun, you might also want to light an LED to indicate viable connectivity to the internet so that you know if you can connect to a reflector or not:


#!/bin/bash

netcheck() {
N1=`ping -c 1 8.8.8.8 | grep '1 received' | wc -l`
echo $N1 > /sys/class/gpio/gpio27/value
}

for (( ; ; ))
do
netcheck
sleep 20
done

If you’ve built a D-Star hotspot and sometimes find the DV modem (GMSK modem) occasionally loses connection on the USB bus, I wrote a helpful script to check the presence of the modem and if not found on the expected device node, instructs the hotspot host to reboot and bring the system back on the air.  This is published free and clear and anyone may use it and distribute it without permission so long as the preamble remains intact:

 


#!/bin/bash
#########################################################################
# UPDATED: 10-24-2014 #
# #
# This script checks the status of the DV modem and if found #
# to be missing, will reboot your hotspot and log the event. #
# #
# This is useful for applications where the DV modem loses #
# connection and functionality is halted in an unattended setting. #
# #
# OPERATION: #
# This assumes your DV modem is normally detected as /dev/ttyACM0 #
# When a DV modem disappears, the running dstarrepeater software locks #
# /dev/ttyACM0 and when the DV modem tries to reconnect, Linux #
# enumerates the device as the next available device node, #
# /dev/ttyACM1. Therefore, this script looks for the next enumerated #
# ttyACM device and if detected, reboots your Hotspot or repeater. #
# #
# This script was written by John Rogers, K1WIZ and permission #
# is granted for use and distribution so long as this notice #
# is unaltered and not removed. #
# #
# TO USE: #
# Simply place this script in /root/ #
# Rename the script file extension from .txt to .sh and make it #
# executable as follows: #
# #
# mv hotspot-dv-modem-check-script.txt hotspot-dv-modem-check-script.sh #
# chmod +x hotspot-dv-modem-check-script.sh #
# #
# call it every 5 minutes by setting a line in your /etc/crontab file #
# as follows: #
# #
# */5 * * * * /root/hotspot-dv-modem-check-script.sh #
# #
# Save the file and restart cron service (refer to your Linux #
# distro for instructions on restarting cron or simply reboot #
# your hotspot. #
#########################################################################

check=`ls /dev/ttyACM1 | wc -l`

timestamp() {
date
}

present() {
P1=`timestamp`
P2=`echo ". . . DV MODEM IS PRESENT"`
echo $P1 $P2 > /dev/null 2>&1
}

notpresent() {
P1=`timestamp`
P2=`echo ". . . DV MODEM IS NOT PRESENT, REBOOTING HOTSPOT"`
echo $P1 $P2;
/sbin/reboot;
}

if [ "$check" = 1 ]; then
notpresent >> /var/log/dvstat.log
exit 0
else
present
exit 0
fi
return 0