Raspberry Pi Python Tool Chain

Introduction

I didn’t like Python when I was first introduced to it a couple of years ago. Since that time I’ve learned that it is a great quick-n-dirty language that can be used to build an app or what we used to call a “hack”. The extent of its built-in features and the enormous amount of open source code makes it a natural do-it-yourself language.

Install Tool Chain or Installation Scripts

The first step is to install several tools to facilitate installation of Python modules.

sudo apt-get install -y python-pip git
sudo apt-get install -y build-essential python-dev python-smbus
sudo apt-get install -y i2c-tools

I like to use Flask so install the following for a basic environment.

sudo pip install flask 
sudo pip install requests 
sudo pip install flask-httpauth

My do-it-yourself home automation system uses MQTT for messaging. My Python apps subscribe and publish using the Paho implementation.

sudo pip install paho-mqtt

I like to use Adafruit’s I2C backpack for LED and OLED devices. Their libraries usually require the Python imaging module.

sudo apt-get install -y python-imaging python-pil

More to follow.

Setting up a systemctl service on a Pi

Each Internet of Things (IOT) device in my Do It Yourself Home Automation System (Diyhas) has three elements.

  1. Headless Raspberry Pi server with Wi-FI and Bluetooth (Pi Zero W for example)
  2. Build and production Python directory structure with my device or subsystem Python modules and a variety of Open Source modules.
  3. Boot configuration using systemctl

The systemctl process is used to manage the IOT application.

Configuring a Basic systemctl Service Configuration File

I’m going to use my basic DiyhasClock.py application as an example. My basic file structure requires to three directories: ../fonts, ../logs and ../systemd. The DiyhasClock service requires a configuration file called DiyhasClock.service. This file has three sections:

  • [Unit] — contains options not dependent on the type of the service. It contains directives like description, service behavior and dependencies with other services.
  • [Service] — categorizes services by their process and daemonizing behavior
  • [Install] — optional and defines the behavior if the service is enabled or disabled

The first step is to create a service configuration file in development directory.

cd /home/pi/systemd
vi DiyhasClock.service

The first section of the configuration file contains a [Unit] with a simple Description and the After directive which states that it requires multi-user run level.

[Unit]
Description=DiyhasClock
After=multi-user.target

The [Service] section has two directives. The Type specifies that the service runs after the boot sequence is complete, i.e., idle. The ExecStart is the full command and path to execute. In my case I use Python, the directory of the Python code and a log file.

[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/systemd/DiyhasClock.py > /home/pi/logs/DiyhasClock.log 2>&1

The remaining section is used to add DiyhasClock.service to the multi-user run level when the Raspberry Pi server is booted.

[Install]
WantedBy=multi-user.target

The next step is to move the completed DiyhasClock.service to the systemctl directory.

Adding the DiyhasClock Service to the Boot Sequence

The next steps are relatively simple. Move the DiyhasClock.service to the systemctl directory and enabling the service.

sudo cp DiyhasClock.service /lib/systemd/system/DiyhasClock.service
sudo chmod 644 /lib/systemd/system/DiyhasClock.service
sudo systemctl daemon-reload
sudo systemctl enable DiyhasClock.service

Reboot and test the installation. For convenience I always create an aliases file to manage my IOT applications.

cd 
vi .bash_aliases

The file contains the following systemctl specific aliases.

alias stop='sudo systemctl stop DiyhasClock.service'
alias status='sudo systemctl -l status DiyhasClock.service'
alias start='sudo systemctl start DiyhasClock.service'
alias restart='sudo systemctl restart DiyhasClock.service'
alias catlog='cat /home/pi/logs/DiyhasClock.log'
alias taillog='tail -f /home/pi/logs/DiyhasClock.log'

That’s all I need to manage an IOT production device.

 

 

 

Creating a New Headless Pi Server

Introduction

Every time I receive a new Raspberry Pi, I go through the same error prone discovery process of creating my personal development environment. I know its going to be Python based with Flask, Paho MQTT, Adafruit modules, my own Python models and a standard pi user file structure. I also setup a “systemd” init configuration and modify the .bash_aliases file with “status”, “restart”, “stop”, etc. to manage the process started by the boot sequence.

Since I don’t have the space to add a USB keyboard and mouse to my already crowded desk, I’ve settled on headless servers. IMHO a headless Raspberry Pi server is also an ideal Internet of Things host. This “how to guide” is for Mac OS users like myself.

Getting Started

Go to the Raspberry Pi download page, select the latest “lite” image. You will need to unpack or unzip the file.  Raspian Lite Image

Use Etcher to copy the img file to your SD card. It is usually /dev/disk2. Use Etcher to burn the img to the SD card

Ok, now the fun begins. A headless server needs SSH enabled. Simply create an empty file call “ssh” on the boot level.

cd /Volumes/boot
touch ssh

If you can’t see /Volumes/boot try reinserting the SD card.  You should see the boot volume on Finder.

I’ve standardized on Wi-Fi for most of my devices, which is a must for the Raspberry Pi Zero W. The next step is to configure your local Wi-Fi access point.

vi wpa_supplicant.conf

Insert the following into the blank file on the boot level. NO SPACES!

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="SSID"
psk="PASSWORD"
key_mgmt=WPA-PSK
}

Eject the SD card using finder. Insert it into your Raspberry Pi, power it up and cross your fingers!

First Login to Pi Zero

Special instructions for the Raspberry Pi Zero are needed to attach a Wi-Fi dongle to the USB port. First connect your Pi Zero to your network with a RJ45 connector. Boot the Pi Zero and update/upgrade the OS to support USB/Wi-Fi.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rpi-update

If you get a command not found error on the rpi-update then simply install it with apt-get. Some earlier distributions did not include this command.

sudo apt-get install rpi-update

The latest kernel has changed the /etc/network/interfaces file to use /etc/network/interfaced.d files. What I found that works is to add the following lines to the end of the /etc/network/interfaces file.

cd /etc/network
sudo vi interfaces

Add the following to the end of the file.

allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

This may mess up dhcp but I’ve just started working with the Pi Zero USB/Wi-Fi.

First login to Pi Zero W

Login the new server and run raspi-config to set password, hostname and enable I2C.

sudo raspi-config
  • Change the password and hostname
  • Expand memory
  • Enable the camera and I2C bus

Update the operating system with latest.

sudo apt-get update

Configure the Apple Bonjour service and Apple networking

sudo apt-get install avahi-daemon
sudo apt-get install netatalk

Edit the .bashrc file to enable ll and other aliases. See systemctl

vi .bashrc

Reboot and test your installation.

 

Hands Free Kitchen Light (IOT)

My new project is a Internet of Things kitchen counter LED light strip. The goal was to implement a 21st century light switch using bright and energy efficient LED lights. This required the replacement the mechanical switch with a hand-motion proximity sensor for on and off. Other features include:

  • ESP-01 microprocessor and web server to control the light – an important maker CPU
  • Motion sensor to turn off the light, when the kitchen is unoccupied for a user defined time interval
  • 12 volt power with MOSFET (Adafruit IRLB8721) switch for the LEDs and a 3.3 volt switching regulator for the system components
  • The user interface was to be a simple Web site for status, clock and system configuration, and remote light control, that could also update the ESP-01’s  EEPROM
  • OLED 128×64 display for system status, debug stuff and Wi-Fi network information

The ESP-01 presents a couple of problems, because it only has two GPIO ports. I needed to use the I2C bus to communicate with the OLED, which used both GPIO. So I decided to use an MCP23008 IC to handle interrupts (INPUT) and to control the MOSFET (OUTPUT). This enabled me to use I2C bus and added 8 more GPIO ports.

I used two two proximity devices on this project. The first is the PIR motion sensor. I really like the Parallax, Inc. PIR Sensor – Rev B, because it can operate on 3.3 volts and has a red LED to indicate detection of motion. The second proximity sensor is the Adafruit, VCNL4010 Proximity/Light sensor. It measures both near proximity and ambient light. The VCNL4010 uses the I2C bus to communicate data and it has a configurable interrupt signal.  I used the MCP23008 to handle both interrupts – PIR and VNCL4010.

IMG_1886

Breadboard prototype

I added a cool on/off switch from Adafruit as the final touch. The Rugged Metal On/Off Switch with Blue LED Ring – 16mm Blue On/Off looks great.

The software features included: (a) NTP time set, (b) AP mode when the ESP-01 could not connect to its predefined SSID/password, (c) defaults in EEPROM, (d) my version of the VNCL4010 library, (e) my MCP23008 library with interrupt handling, and (f)  RESTful interface for the website configuration stuff.

The next step was to fit everything in a small wooden box that I would mount on the wall.

IMG_1908

Beta version in a small wooden box

I had a lot of trouble with the VNCL4010 when it was installed in the box. I need to spend time determining how much of the PCB board needs to be exposed from a hole or mount in the box.  My first attempt blinked on and off after a couple of minutes.

Below is a short video of the light working. I’m planning to move everything to an Adafruit proto-board and finding a smaller box.

Next steps in a couple of weeks.

 

 

Adafruit.IO Prototype

Amazon, Intel, IBM and many other companies have started building Internet of Things platforms and cloud services. These services are exactly what I’ve been looking for as a way to safely and securely gain Internet access to my home automation system. I buy a lot of great products from Adafruit and discovered they have an IOT platform.  Adafruit.IO is a beta version and I started experimenting with their MQTT SDK this week.

My plan was to build a standalone test bed to learn how to publish sensor data to Adafruit.IO and subscribe to switches and triggers. I built the breadboard below with an ESP-1 to handle the MQTT interface and an ATMega328 to process environment sensors and the alarms (flashing LED and loud piezo buzzer).

2016-02-10 07.20.15

Power was one challenge. I needed 3.3 volts for the ESP-1 and the ATMega328 (LM1117).  A 5 volt rail (7805)was needed for the MQ2 and PIR sensors. A 12 volt rail (power supply rated at 1 amp) was needed for the flashing LED and a loud piezo (not shown).

Programming two processors is an added complication but I’ve got the process down and its pretty reliable. The Arduino IDE is not state of the art but its much better than some of the development environments I used to work with in the olden days.

The photo below is my first prototype of a dashboard from Adafruit.IO

AdafruitDashboard1

I’ve created feeds for humidity, temperature and light. The alarm button turns the flashing LED alarm light on and off pretty quickly. I’ll add gas and motion later tonight. I also want to test the trigger capability as well.

Sensors

  • MQ2 gas sensor
  • DHT11 temperature and humidity
  • Photo resistor light
  • PIR motion sensor

That’s it for now and it took me only a couple of days to get it working. The Adafruit.IO forum was also helpful and support was responding almost as fast as I posted questions.

 

Fireplace Mantel Christmas Project

I created an interactive fireplace decoration using an ATmega328, two 8×8 Matrix LED backpacks, a 128×64 OLED, a piezo buzzer and an IR remote sensor. Basic functions include the following

  • 8×8 LED depict snow falling, a flashing light tree and “Merry Christmas” scrolling marque
  • OLED wishes you a Merry Christmas, and has Naughty and Nice lists with names that can change
  • Piezo buzzer plays Jingle Bells
  • IR Remote controls both displays; plays Jingle Bells; and adds people to the Naughty and Nice lists.

I soldered one of the I2C address pads on one of the 8×8 Matrix LED to differentiate displays (0x70 and 0x71). I used an antique wooden glove box as the project box.

Mantel

The video demonstrates the simple functions of this fireplace decoration.

IOT Digital Alarm Clock

I’ve started work on a new version of my alarm clock. I wanted to add a couple of improvements to the first version which was based on an ATMega328pu processor and NRF24 radio. This version would use an ESP-1 for both communication and standalone configuration.

IMG_1153

IOT Digital Alarm Clock Breadboard

Hardware features:

  1. ESP8266 ESP-1 Wi-Fi web server
  2. ATMega328pu 8 Mhz Real-time processor
  3. DS1307 real time clock
  4. OLED display user interface (status and controls)
  5. 7-segment LED digital time display
  6. Piezo buzzer and flashing LED for alarm
  7. Photo-resistor to measure room light
  8. I2C bus for communication
  9. 3.3 volt for all components

Software features:

  1. Sync time from NTP at power up
  2. Web form to manually set time
  3. Web form to control alarm clock settings
  4. Star Wars Imperial March alarm sound
  5. ATMega328 handles analog and digital devices
ESP-1 uses I2C to control all components

ESP-1 uses I2C to control all components

The OLED can be hidden and only needed at startup to determine the status of the system and to show the IP address of the device.

ATMega328 handles all analog and digital devices.

ATMega328 handles all analog and digital devices.

A simple web form is used to (a) manually set date and time; (b) set the alarm time; (c) enable the alarm clock and (d) sound a system alarm.

Simple web for served by the ESP-1

Simple web for served by the ESP-1

The video below demonstrates the basic features using the breadboard design.

The next step is to complete the software development and move everything to a protoboard and antique box.

Raspberry Pi Surveillance Project

I wanted to add video surveillance to my home automation project, which was a good excuse to add another Raspberry Pi to the project. I’d tried using an ATMega328 with the Pi but found it too cumbersome to write Python code and Arduino ATMega code. It worked with an I2C interface but I wanted something simpler.

The diagram below illustrates the Adafruit photo-board with all of the necessary interfaces to 5 volt and 3.3 volt devices.

Raspberry Pi Interface Board

Raspberry Pi Interface Board

Project Enclosure

Project Enclosure

Features of a Raspberry Pi 2 Surveillance project:

  • Raspberry Pi 2 – REST server (HTTP communication and control)
  • Surveillance – Raspberry Pi camera for video capture
  • Panic Button – hardware debounced button (3.3 volts)
  • Motion sensor – PIR sensor at 5 volts
  • Night Light – large LED at 3.3 volts
  • Identification – IR Sensor to check for “me”
  • iBeacon sensor – BLE USB dongle checking for my iPhone iBeacon
  • Alarm – 555 Timer driving a loud speaker

I enclosed the project in a plain wooden box. As you can see the cable management was a hassle with the hinge and external interfaces on the door.

Raspberry Pi Surviellance

Raspberry Pi Surveillance

All of the code is in Python. There are four main packages

  1. REST server code
  2. Hardware interace – interrupts
  3. Camera controls with 2 rotating JPEG images
  4. BLE iBeacon scanner

I will publish the code to GitHub when I get a chance.

ESP Light Switch – Part II

Continuation of my ESP8266 DC power switch. Once I had the breadboard working I soldered the components onto an Adafruit Proto-Board and enclosed the electronics in an antique wooden box. I’ve been combining the “old” with the “new” by reusing old or antique wooden boxes as my Arduino, Raspberry Pi and ESP8266 projects.

Final Project Enclosure

Final Project Enclosure

The next version (there are always things to improve) will use a 220 Ohm resistor for the LED indicator. I will also add some type of relay for an AC version. I really like the cloths pin box which I found in an antique store in Kalispell, Montana.

ESP8266 Light Switch Design

ESP8266 Light Switch Design

The diagram depicts a modified version (new 220 Ohm resister, etc.) of the proto-board solution. I’ve also added pins to support debugging on the proto-board by providing RX, TX and GND pins from the ESP-1.