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. Also, I used a labeled breakout board for the Raspberry Pi instead of a direct connection.
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.

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.


Use the small flathead screwdriver to connect the jumper wires to the relay module.
Python Scripts
UPDATE: Google no longer permits logins from 3rd party software. I have made a few changes to the mail.py script to set it up for alternate domains. Those changes are in red. Note that the proper name for the SMTP Server Name is required.
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 MAIL_USER = "user@domain.com" MAIL_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 = MAIL_USER to = ['bill.smith@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 Server Name>', 587) server.starttls()server.login(MAIL_USER, MAIL_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 troubleshooting 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.
Sending SMS texts is more complicated but it can be done. Here’s how:
https://www.fullstackpython.com/blog/send-sms-text-messages-python.html
LikeLike
Hi Bill,
Thank you for documenting this. I have a mail chime and for years wanted to trigger a text message when the LED is on. You did a great job at documenting it and I hope to duplicate your work this week.
73 AI4Y
LikeLike
I found one wiring issue with your schematic
MCP3008 Pin 11 should go to RPi pin 19 and not pin 21.
MCP3008 Pin 12 should go to RPi pin 21 and not pin 19
Once I corrected the wiring the RPi would read the ADC voltage correctly.
On my RPi I had to modify read_volt.py as follows:
Change:
mySendMail = ‘/home/pi/projects/mailbox/mail.py’
myResetChime = ‘/home/pi/projects/mailbox/reset.py’
To:
mySendMail = ‘python /home/pi/projects/mailbox/mail.py’
myResetChime = ‘python /home/pi/projects/mailbox/reset.py’
I also created a bash file to call from cron as follows:
vi /home/pi/projects/mailbox/check_mailbox.sh
#!bin/bash
export PATH=/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/pi/projects/mailbox/
cd /home/pi/
python3 /home/pi/projects/mailbox/read_volt.py
My crontab entry is :
0-59 * * * * /home/pi/projects/mailbox/check_mailbox.sh >> /home/pi/projects/mailbox/mailbox.log 2>&1
Again, thank you for sharing all the photos, wiring, schematic, etc. Much appreciated!
LikeLike
Thanks for your comment. I was using a breakout board instead of a direct connection to the Raspberry Pi. That may account for the pin number discrepancy. The labels (MOS1, MOS0 and CLK) are correct. I will make a note in my post.
LikeLike
Richard, I, too, would prefer text notifications from my chime mail so I would be very appreciative of any guidance you might provide based on your experience with your project. Thanks
LikeLike
Hi Grady, I followed Bills instruction and it worked. I already noted the one wiring exception and script modifications that allowed it to work for me. Beyond that, just take your time.
LikeLike