Skip to content

Instantly share code, notes, and snippets.

@cmchap
Last active May 28, 2024 12:55
Show Gist options
  • Save cmchap/5480533 to your computer and use it in GitHub Desktop.
Save cmchap/5480533 to your computer and use it in GitHub Desktop.
Raspberry Pi Water Sensor - Incredibly vague schematic here: http://fritzing.org/projects/raspberry-pi-water-sensor/
#!/usr/bin/python
#########
# About #
#########
# This script uses a Raspberry Pi to sense for the presense or absense of water.
# If there is water, an email is sent and a buzzer goes off.
# When it's dry again, another email is sent, and the buzzer turns off.
# To run this script at boot, edit /etc/rc.local to include (no quotes) 'sudo python <pathtoyourscript>.py'
# Schematic here: http://fritzing.org/projects/raspberry-pi-water-sensor/
###########
# License #
###########
# Released under the WTFPL.
#Full text and more information here: http://en.wikipedia.org/wiki/WTFPL
########################################
# Gmail login credentials to send email#
########################################
username = 'exampleusername' #you don't need the "@gmail.com" bit.
password = 'examplepassword'
############################
# General Email Parameters #
############################
From = "[email protected]"
To = "recipientaddress#domain.com"
#######################################
# Email Parameters when sensor is Wet #
#######################################
Subject_wet = "RPi Water Sensor is WET"
Body_wet = "Your water sensor is wet."
#######################################
# Email Parameters when semsor is Dry #
#######################################
Subject_dry = "RPi Water Sensor is DRY"
Body_dry = " Your water sensor is dry again!"
import smtplib
from email.mime.text import MIMEText
import RPi.GPIO as GPIO
import string
import time
# Function Definitions
#takes either "wet" or "dry" as the condition.
def email(condition):
print "Attempting to send email"
if condition == 'wet':
Body = string.join((
"From: %s" % From,
"To: %s" % To,
"Subject: %s" % Subject_wet,
"",
Body_wet,
), "\r\n")
if condition == 'dry':
Body = string.join((
"From: %s" % From,
"To: %s" % To,
"Subject: %s" % Subject_dry,
"",
Body_dry,
), "\r\n")
# The actual mail send
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
print "Logging in..."
server.login(username,password)
print "Logged in as "+username+"."
server.sendmail(From, [To], Body)
server.quit()
print "Email sent."
#Tests whether wter is present.
# returns 0 for dry
# returns 1 for wet
# tested to work on pin 18
def RCtime (RCpin):
reading = 0
GPIO.setmode(GPIO.BCM)
GPIO.setup(RCpin, GPIO.OUT)
GPIO.output(RCpin, GPIO.LOW)
time.sleep(0.1)
GPIO.setup(RCpin, GPIO.IN)
# This takes about 1 millisecond per loop cycle
while True:
if (GPIO.input(RCpin) == GPIO.LOW):
reading += 1
if reading >= 1000:
return 0
if (GPIO.input(RCpin) != GPIO.LOW):
return 1
# Turns on the piezo buzzer
# tested to work on pin 17
def buzz_on (pin):
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.HIGH)
# Turns off the piezo buzzer
# tested to work on pin 17
def buzz_off(pin):
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
# Main Loop
print 'Waiting for wetness...'
while True:
time.sleep(1) # check for wetness every second
if RCtime(18) == 1:
buzz_on(17)
print "Sensor is wet"
email('wet')
print "Waiting for dryness..."
while True:
time.sleep(1) # check for dryness every second
if RCtime(18) == 0:
buzz_off(17)
print "Sensor is dry again"
email('dry')
print "Waiting for wetness..."
break
@cmchap
Copy link
Author

cmchap commented Oct 23, 2020

@speedy-10
I haven't tested this, but I think you need to change smtp.gmail.com:587 on line 78 to your email provider's smtp server and port.

I found on the web that t-online.de uses securesmtp.t-online.de and port 465 for its smtp configuration, so that whole line should be server = smtplib.SMTP('securesmtp.t-online.de:465')

for web.de I think it should be server = smtplib.SMTP('smtp.web.de:587')

Depending on the email provider's smtp server configuration, you may have issues with 2-factor authentication or other security settings, but trying the above would be a good starting point.

@speedy-10
Copy link

speedy-10 commented Oct 23, 2020

Hi, I've tried both, without success. Now I found a nice video, in which the following code ist presented:

# Datum: 22.10.2020

import smtplib

# Benutzerdaten z.B. bei web.de
user = '[email protected]'
pwd = 'password'

mail_text = 'Hallo,\n\das ist Text!\n\n'
subject = 'Test-Alarm'

MAIL_FROM = '[email protected]'
RCPT_TO = '[email protected]'
DATA = 'From:%s\nTo:%s\nSubject:%s\n\n%s' % (MAIL_FROM, RCPT_TO, subject, mail_text)




server = smtplib.SMTP('smtp.web.de:587')
server.starttls()
server.login(user, pwd)
server.sendmail(MAIL_FROM, RCPT_TO, DATA)
server.quit()

But even here (with the correct USER and PASSWORD) I got an error:

File "/home/USER/Downloads/melder.py", line 23, in <module>
    server.starttls(context=context)
  File "/home/USER/apps/thonny/lib/python3.7/smtplib.py", line 771, in starttls
    server_hostname=self._host)
  File "/home/USER/apps/thonny/lib/python3.7/ssl.py", line 423, in wrap_socket
    session=session
  File "/home/USER/apps/thonny/lib/python3.7/ssl.py", line 870, in _create
    self.do_handshake()
  File "/home/USER/apps/thonny/lib/python3.7/ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_ILLEGAL_PARAMETER] sslv3 alert illegal parameter (_ssl.c:1076)

(With an e-mail adress from t-online.de, I got the same error message.)

I didn't find a solution in the internet so far. Does anyone know, how to use this properly?

Regards

@speedy-10
Copy link

speedy-10 commented Oct 24, 2020

It worked with gmail, but you had to change something: allow unsecure apps.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment