Mail Chime Hack

For several years, I have had a Hanna Products Mail Chime installed on my outdoor mailbox with an indoor receiver. The transmitter is attached to the door of the mailbox. When the door is opened a gravity switch is closed and a signal is sent to the receiver. The receiver sounds an alert and illuminates an LED lamp. The lamp is reset by a momentary contact push-to-close button switch.

I took a receiver apart to see if I could make a simple hack to have a Raspberry Pi sense when the LED lamp was on and then send an email to one of my accounts to indicated the mailbox door had been opened. Another function is to send a signal to a relay module to reset the LED lamp to off.

The project requires some programming skills with Linux and Python, a basic understanding of some electronic components, and some soldering is required. I had my project operating in three short evenings.

Parts List

Hanna Products, Inc. Mail Chime – Amazon $55
Raspberry Pi Model B – Amazon $56
2 1K ohm resisters – Amazon, pack of 100, $6
1 DaFuRui 8Pcs DC 5V 1 Channel Relay Module – Amazon, pack of 8, $13
1 MCP3008 Microchip – Amazon, Pack of 4, $12.50
1 breadboard – Amazon, ELEGOO 3pcs MB-102, $9
Jumper wires – Amazon, Elegoo EL-CP-004, $7

Optional:
Raspberry Pi breakout board and ribbon cable
A case for the Raspberry Pi.

Tools:
Soldering iron and solder
Phillips head screwdriver
Small flathead screwdriver wire stripper

The following is the schematic for the project.

Note the half-moon indentation at one end of the MCP3008 microchip. This will orient the chip to access the correct pins.

Begin by opening the bottom of the mail chime. One phillips screw holds the bottom panel to the housing. The printed circuit board is not fastened to the housing. Then solder 4 jumper wires to the printed circuit board inside of the disassembled mail chime as shown.

Mail Chime Printed Circuit Board

Then plugin the MCP3008 Microchip, and the 2 1K ohm resistors to the breadboard. Then connect the various jumper wires on the breadboard, and from the breadboard to the Raspberry Pi, the relay module and the mail chime. Use the schematic and photograph as guidance. I used a Raspberry Pi breakout board to easily identify the Raspberry Pi connections.

The resistors act as a voltage splitter to decrease the voltage going to the MCP3008 CH0 pin.

Mail chime printed circuit board connected to the bread board.
All components connected.

Use the small flathead screwdriver to connect the jumper wires to the relay module.

Python Scripts

Python scripts are placed in the following directory on the Raspberry Pi:

/home/pi/projects/mailbox/

Note that the indented lines in the following Python scripts are indented with tabs, not spaces.

read_volt.py

#!/usr/bin/python3
import spidev, time
import time
import datetime
import os
 
#Open SPI bus
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz=1000000

#Function to read SPI data from MCP3008 chip
#Channel must be an integer 0-7
def ReadChannel(channel):
     adc = spi.xfer2([1, (8 + channel) << 4, 0])
     data = ((adc[1]&3) << 8) + adc[2]
     return data
#Function to convert data to voltage level
#rounded to specified number of decimal places
def ConvertVolts(data,places):
     volts = (data * 3.3) / float(1023)
     volts = round(volts,places)
     return volts

mySendMail = '/home/pi/projects/mailbox/mail.py'
myResetChime = '/home/pi/projects/mailbox/reset.py'
print ("Check mail was run.")

reading = ReadChannel(0)
voltage = ConvertVolts(reading,2)
print("Reading=%d\tVoltage=%.2f" % (reading, voltage))

#If voltage is greater than or equal to 0.75 V then send an e-#mail
 
if (voltage >= 0.75):
     os.system(mySendMail)
     now = datetime.datetime.now()
     print("Mailbox was opened at: ")
     print(now.strftime('%H:%M %Y-%m-%d'))
     time.sleep(60)
     os.system(myResetChime)
     print("Mailbox Chime has been reset.")

mail.py

#!/usr/bin/python3
import smtplib
import datetime
GMAIL_USER = "user@gmail.com"
GMAIL_PASS = "password"
now = datetime.datetime.now()
text = 'Your mail box has been opened!!!\n\n'
text = text + 'Time: '+now.strftime("%H:%M:%S %Y-%m-%d")+'\n\n'
sent_from = GMAIL_USER 
to = ['wx2dx_bill@verizon.net']
subject = 'Mailbox Alert'
body = text
email_text = """\
From: %s
To: %s
Subject: %s

%s
""" % (sent_from, ", ".join(to), subject, body)

try:
     server = smtplib.SMTP('smtp.gmail.com', 587)
     server.starttls()
     server.login(GMAIL_USER, GMAIL_PASS)
     server.sendmail(sent_from, to, email_text)

 except Exception as e:
     print(e)

 finally:
     server.quit()  

reset.py

#/usr/bin/python3
import RPi.GPIO as GPIO
import time
 
in1 = 16

GPIO.setmode(GPIO.BCM)
GPIO.setup(in1, GPIO.OUT)
 
GPIO.output(in1, GPIO.LOW)   
 
time.sleep(0.25)
GPIO.output(in1, GPIO.HIGH)
 
time.sleep(1)
 
GPIO.output(in1, GPIO.LOW)   
 
GPIO.cleanup()

Crontab Settings

Enter the following one line using the crontab -e command.

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/pi/projects/mailbox/read_volt.py >> /home/pi/projects/mailbox/mailbox.log 2>&1

Crontab will run the read_volt.py Python script every 5 minutes. Any output to standard output and standard error will be written to the mailbox.log file for trouble shooting purposes. When the mail chime is triggered by the mailbox door sensor, there will be current to the mail chime LED, which is then detected by the MCP3008 microchip at CH0. This in turn triggers the code to send an email, then after 60 seconds, the relay is actuated to reset the mail chime.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s