Water Leak Detector

From Phidgets Support

Introduction

If you’ve ever worried about coming home to a flooded basement, this project is for you. We will be creating a water leak detection system that will send you an email if a water leak is detected.


Parts

Phidget Soil Moisture Sensor: The key component of this project.

This project utilizes the following hardware:


If you haven't used a Raspberry Pi with Phidgets before, check out this article.





Software

A simple Python program will run on the Raspberry Pi. It will perform the following task:

  • Create a Voltage Ratio object, and map it to the Phidget Soil Moisture Sensor.
  • Monitor the reading from the sensor and send an email if water is detected.

The program will execute every 30 minutes through a cron job.

Email Configuration

We recommend creating a new Gmail account for this project. In order to send emails from an app, you will need to enable 2-step verification in your account settings:

Water authent.jpg



Next, generate an app password that you can paste into the code below:

Water authent2.jpg

Code

import smtplib
import ssl
from datetime import datetime
import time

from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
from Phidget22.Devices.Log import *
from Phidget22.LogLevel import *
from Phidget22.Net import *

#Email Init
SMTP_SERVER = "smtp.gmail.com" #Change this if you are not using GMAIL
SMTP_PORT = 465  #Change this if you are not using GMAIL

USERNAME = "YOUR EMAIL@gmail.com"
PASSWORD = "YOUR PASSWORD - FOR GMAIL, THIS IS YOUR APP PASSWORD"

TO = USERNAME #Set a recipient

#Other Config
SENSOR_VALUE_DANGEROUS = 0.3  #Determine this value through testing
MINS_30 = 1800

#Send an Email
def sendMessage(time,voltageRatio):
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(SMTP_SERVER,SMTP_PORT,context=context) as server:
        server.login(USERNAME,PASSWORD)
        message = """Subject: Water Leak Detected!

A water leak has been detected!

------------details------------
Time: {0}
Voltage Ratio: {1}
-------------------------------

This email will repeat every {2} minutes until the voltage ratio drops below the threshold of {3} V/V.

""".format(time,voltageRatio,int(MINS_30/60),SENSOR_VALUE_DANGEROUS)
        server.sendmail(USERNAME,TO,message)

def main():
    #Create
    waterSensor = VoltageRatioInput()
    
    #Open
    waterSensor.openWaitForAttachment(2000)
    
    #Get current time
    now = datetime.now()

    #If water level is dangerous, send an email
    if waterSensor.getVoltageRatio() >= SENSOR_VALUE_DANGEROUS:
        sendMessage(now.strftime("%m/%d/%Y, %H:%M:%S"),waterSensor.getVoltageRatio())        

main()

Schedule with Cron

After adding the Python file to your Raspberry Pi, create a cron job that runs every 30 minutes:

Cron water.jpg


Result

You should now have a system that will send out an email when water is detected!

Water result.jpg