DIY-IOT: Status.py source code

This post is a support-article to the DIY-IOT series, and contain the source code for the project.

status.py

This script control the status LED. If no connection to the internet, the LED is red, and green otherwise.


#/*
# * -----------------------------------------------------------------------------------
# * "THE BEER-WARE LICENSE" (Revision 42):
# * <steen@ieee.org> wrote this file.  As long as you retain this notice you
# * can do whatever you want with this stuff. If we meet some day, and you think
# * this stuff is worth it, you can buy me a beer in return.   Steen Garbers Enevoldsen
# * -----------------------------------------------------------------------------------
# */

import os
import RPi.GPIO as GPIO
import socket, struct
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.OUT) # Green LED
GPIO.setup(10, GPIO.OUT) # Blue LED
GPIO.setup(11, GPIO.OUT) # Red LED

# Initialize: All LEDs off.
GPIO.output(9, GPIO.LOW)
GPIO.output(10, GPIO.LOW)
GPIO.output(11, GPIO.LOW)

# Start: LED is red
GPIO.output(11, GPIO.HIGH)

# Find default gateway, geeky method: read and parse directly from /proc/net/route
# If you know in advance, it's easier to just set hostname="IPaddress"
with open("/proc/net/route") as fh:
    for line in fh:
    fields = line.strip().split()
    if fields[1] != '00000000' or not int(fields[3], 16) & 2:
        continue
    hostname = socket.inet_ntoa(struct.pack("<L", int(fields[2], 16)))

while True:
    time.sleep(1)
    response = os.system("ping -c 1 " + hostname)
    if response == 0:
        # Network is reachable, LED=Green
        GPIO.output(11, GPIO.LOW)
        GPIO.output(9, GPIO.HIGH)
    else:
        # Network is NOT reachable, LED=Red
        GPIO.output(11, GPIO.HIGH)
        GPIO.output(9, GPIO.LOW)