Greenhouse computer, part the third.

Click for bigger!

































Here’s the greenhouse computer in situ. The air from the fan is now directed across the sensors on the Sense HAT, with the intention of measuring the temperature of the air in the green house, rather than the air in the case that the Pi 3 has warmed up. It’s just a balsawood duct, as thats an easy material to cut and glue.

The small case above the main one contains a Pi compatible camera with a fish eye lens and two infra red lights, for night photography.


The program it runs is fairly long, and specific to this hardware combination, but I can add it if anyone asks…

Greenhouse Computer Version 2

Work in progress…

























Well, the previous greenhouse computer could report the temperature, barometic pressure, and humidity, but it didn’t control anything, and the electric fan heater’s thermostat wasted a lot of electricity during the previous winter, as it wasn’t accurate, and the greenhouse got warmer than necessary.


The greenhouse needs to be kept above 5Ā°C, to keep the citrus plants that over-winter in it alive, but not much warmer, and the fan heater doesn’t have any decent form of regulation.

Anyway… Here comes Version 2 of the greenhouse computer. The three boards are, starting at the bottom of the stack,

  • A Raspberry Pi 3B+
  • A Relay card with four mains relays
  • and a Pi Sense HAT.
The problem you get with putting these units in a case is that the Pi warms up the air in the case, so the Sense HAT gives false temperature readings. In Version 1 of the computer, there was a fan blowing air from outside the case onto the HAT’s sensors, and that’s what I’m doing in Version 2. The fan has just gone in, but I still need to put trunking to direct its air stream over those sensors.

You can see a nice long camera lead on the left, so the camera can go in a separate case. The mains wiring feeds mains to a couple of sockets on the back of the case, one for the heater, and one spare. The relays switch the sockets on and off.


More to follow…

Recent python door cam code – ugly, but works.

Updated version of the code…
It deals with the occasional hangs in the camera capture process by
rebooting when they happen. A line in /etc/rc.local runs the program again.

# Program for PiDoorCam

# Detects motion, and when it spots some, takes a high resolution
# picture, and sends the picture to PiScreen

import io
import os
import picamera
import ftplib
import time
from datetime import datetime
from PIL import Image
import requests

camera = picamera.PiCamera()
picamera.PiCamera.CAPTURE_TIMEOUT = 30

# If we detect 100 pixels that changed by 30, we have seen movement.
#difference = 30
#pixels = 100
# Desensitise!
#difference = 30
difference = 50
pixels = 150

# May as well use the maximum resolution of the camera.
# This is for V1. V2 is 3280 x 2464.
width = 2592
height = 1944

# I copied this voodoo motion detection from somewhere. Changed the timeout
#  setting above to prevent the occasional failures to complete captures.
def compare():
   camera.resolution = (100, 75)
   stream = io.BytesIO()
   format = ‘bmp’
   # Handle occasional ‘Timed out waiting for capture to end’
   try:
      camera.capture(stream, format)
   except:
      print (“Camera timed out, reboot needed!”)
      os.system(“sudo reboot now”)
       
   stream.seek(0)
   im = Image.open(stream)
   buffer = im.load()
   stream.close()
   return im, buffer

# Function to take a new high resolution picture, send it to PiScreen
# send it to my phone, and then delete it.
def newimage(width, height):
    when = datetime.now()
    filename = “door-%04d%02d%02d-%02d%02d%02d.jpg” % (when.year, when.month, when.day, when.hour, when.minute, when.second)
    camera.resolution = (width, height)
    camera.capture(filename)

    connected = True
    ftp = ftplib.FTP()
    ftp.connect(“PiScreen”)
   
    try:
        ftp.login(“pi”,”******************”)
    except ftplib.all_errors:
        connected = False
        print (“Failed to connect to server %s” % e)   
       
    if connected:
        ftp.storbinary(‘STOR ‘+filename, open(filename, “rb”))
        print (“Sent “, filename)

    ftp.quit()

# Code to send the Pushover message. Make picture smaller first.
    im = Image.open(filename)
    im.resize((324,243),Image.ANTIALIAS)
    im.save(filename)
   
    r = requests.post(“https://api.pushover.net/1/messages.json”, data = {
        “token”: “***********************************”,
        “user”: “*************************************”,
        “device”: “***********”,
        “sound”: “intermission”,
        “message”: filename
    },
    files = {
        “attachment”: (filename, open(filename, “rb”), “image/jpeg”)
    })
# Check r for problems – maybe put a delay here?
    if r.status_code != 200:
        print(“Pushover message failed.”)
    else:
        print(“Pushover accepted the message.”)
       
# Now delete the file.
    os.remove(filename)
    # Delay to avoid being nasty to Pushover server.
    time.sleep(5)

# Main program.

camera.rotation = 180
print(“Running door.py”)
image1, buffer1 = compare()

newimage(width, height)

while (True):

   image2, buffer2 = compare()

   changedpixels = 0
   for x in range(0, 100):
      for y in range(0, 75):
         pixdiff = abs(buffer1[x,y][1] – buffer2[x,y][1])
         if pixdiff > difference:
            changedpixels += 1

   if changedpixels > pixels:
      newimage(width, height)

   image1 = image2
   buffer1 = buffer2



Code below is an older version, the “error handling” doesn’t actually work.

# Program for PiDoorCam

# Detects motion, and when it spots some, takes a high resolution
# picture, and sends the picture to PiScreen

import io
import os
import picamera
import ftplib
import time
from datetime import datetime
from PIL import Image
import requests

camera = picamera.PiCamera()
picamera.PiCamera.CAPTURE_TIMEOUT = 30

# If we detect 100 pixels that changed by 30, we have seen movement.
#difference = 30
#pixels = 100
# Desensitise!
difference = 30
pixels = 150

# May as well use the maximum resolution of the camera.
# This is for V1. V2 is 3280 x 2464.
width = 2592
height = 1944

# I copied this voodoo motion detection from somewhere. Changed the timeout
#  setting above to prevent the occasional failures to complete captures.
def compare():
   camera.resolution = (100, 75)
   stream = io.BytesIO()
   format = ‘bmp’
   # Handle occasional ‘Timed out waiting for capture to end’
   try:
      camera.capture(stream, format)
   except:
      print (“Retrying camera.capture()”)
      camera.capture(stream, format)
 
   stream.seek(0)
   im = Image.open(stream)
   buffer = im.load()
   stream.close()
   return im, buffer

# Function to take a new high resolution picture, send it to PiScreen
# send it to my phone, and then delete it.
def newimage(width, height):
    when = datetime.now()
    filename = “door-%04d%02d%02d-%02d%02d%02d.jpg” % (when.year, when.month, when.day, when.hour, when.minute, when.second)
    camera.resolution = (width, height)
    camera.capture(filename)

    connected = True
    ftp = ftplib.FTP()
    ftp.connect(“PiScreen”)
 
    try:
        ftp.login(“pi”,”**********************************”)
    except ftplib.all_errors:
        connected = False
        print (“Failed to connect to server %s” % e) 
     
    if connected:
        ftp.storbinary(‘STOR ‘+filename, open(filename, “rb”))
        print (“Sent “, filename)

    ftp.quit()

# Code to send the Pushover message. Make picture smaller first.
    im = Image.open(filename)
#    im.resize((648,486),Image.ANTIALIAS)
    im.resize((324,243),Image.ANTIALIAS)
    im.save(filename)
 
    r = requests.post(“https://api.pushover.net/1/messages.json”, data = {
        “token”: “**********************************”,
        “user”: “********************************”,
        “device”: “************”,
        “sound”: “intermission”,
        “message”: filename
    },
    files = {
#        “attachment”: (“image.jpg”, open(filename, “rb”), “image/jpeg”)
        “attachment”: (filename, open(filename, “rb”), “image/jpeg”)
    })
# Check r for problems – maybe put a delay here?
    if r.status_code != 200:
        print(“Pushover message failed.”)
    else:
        print(“Pushover accepted the message.”)
       
# Now delete the file.
    os.remove(filename)
    # Delay to avoid being nasty to Pushover server.
    time.sleep(5)

# Main program.

camera.rotation = 180
print(“Running door.py”)
image1, buffer1 = compare()

newimage(width, height)

while (True):

   image2, buffer2 = compare()

   changedpixels = 0
   for x in range(0, 100):
      for y in range(0, 75):
         pixdiff = abs(buffer1[x,y][1] – buffer2[x,y][1])
         if pixdiff > difference:
            changedpixels += 1

   if changedpixels > pixels:
      newimage(width, height)

   image1 = image2
   buffer1 = buffer2

The Wisdom of the Ancients – Part 94

I tried to find this one one Google, but there was no sign of it!


mpirun mca_oob_tcp_recv_handler  invalid message type: 43


Basically, it means you have not noticed you are trying to control a cluster of Raspberry Pi 3 B+ computers that are running Raspbian Stretch with a Raspberry Pi that has somehow still got Raspbian Jessie on it.


You’re welcome!

Oyster, before I got all the bricks.



Online webcam project, part 2.

Trigger warning.

Stop! Don’t look at the following photographs if you are offended by ugly applicationsĀ of hot glue.

I found what I thought would be the ideal case for the camera and Pi in the kitchen. It was one of those Tesco plastic food boxes with clips and a watertight seal, and it had nasty cracks in the base in just the right spot to cut a hole for the lens. Using a variety of inappropriate tools, I made the necessary hole, and fixed the lens into it with hot glue.

Ugly hot glue!

As I warned you, very ugly hot glue. Note that it covers the join between the two parts of the lens, which I hope will ensure our good Welsh rain can’t get in between the lens elements. The next steps were to screw the inner lens cap in place, and mount the Raspberry Pi Zero inside the box. I was going to put it in the same part of the box as the lens and camera, but every arrangement I tried had the USB wireless antenna rather close to the camera and its cable. So, I mounted the Pi Zero in the lid of the box with a goodly lump of White Tac.

img_20160919_144721

A notch in the edge of the box, for the power cable, was the next thing. It’s at the bottom, and only a very small percentage of the rain around here falls upwards, so it may be OK without any sealant. I have more White Tac if there is a problem…

Software

Getting the camera to take a picture every ten minutes is not a problem, thanks to cron and the bash shell.

The intention is to use lftp to upload the pictures to the web host, but finding a decent example of code that will do that is not proving easy. Please feel free to comment if you have something suitable.

I shouldn’t have too much difficulty hacking out a web page for the picture to live in, as I am not planning anything fancy, so I’ll just use HTML, like the rest of my site.

Online webcam project, part 1.

Having decided to share the view at the back of our house with the rest of the world, I’ve finally got started. After all, it’s a pretty amazing view at times. Here’s what it was like recently. Even when it’s blurred, it’s good!

img_3650

I’m using a standard Raspberry Pi camera, and a Pi Zero to do this. Here’s the camera. I took a cheap Vivitar wide angle converter, made a hole in the rear lens cap, and glued the camera’s mounting kit to it, using a cheap glue gun.

img_20160919_103757

Here’s the current state of the thing.

img_20160919_103847

I connected to the PI with x11vnc, and took a test shot. The result is nicely in focus, thanks to the cunning design of the adapter lens, and gives a good wide angle view of the study.

test

Next, I need to set up the Raspberry Pi to upload pictures to my web site every few minutes, make a page on the web site for people to gawp at, and put the Pi in a waterproof case.