Author: Walrus
Greenhouse computer ravings continued.
![]() |
| Fat man in the greenhouse. |
Weather Station woes….
Data is coming through! And it has even uploaded to Weather Underground!
And, now, having typed that, I look again, and it has stopped working.
Oh, well… Hang on, it’s back! Electronics, don’t you just love them?
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.
More to follow…
Recent python door cam code – ugly, but works.
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
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. |
Marmalade

I was never all that happy with the previous batch of marmalade I made in 2014. I thought it had been boiled too much, as it was quite a dark colour, and recently, I noticed that what I thought was the last jar was getting quite low.* There are only a couple of weeks of the year when the right oranges for marmalade making are in the shops, and last week I found some in Tesco. I grabbed the last Kilo.
![]() |
| These are Seville oranges; look at those pips! |
Put the chopped up peels in the pan with the juice, and bring them to the boil.
That old sugar thermometer is no longer doing its job properly! It was showing something a bit below 105°C, but I thought the marmalade was looking ready, so I checked it with a cheap electronic thermometer, and as you can see, the marmalade was done! If I had heated it until the old thermometer said it was done, I would have had another batch of over-boiled marmalade.
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.

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.

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!

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.

Here’s the current state of the thing.

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.

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.


















