What the system does?
It detects open door, makes a snapshot from two cameras (one camera is located outside, the other one is located inside), and sends a push notification to your mobile phone via the pushbullet service and a pushbullet app. The notification includes a message with time when the door was opened and two camera snapshots, the second notification is sent when the door is closed, it also includes the time and two camera images from inside and outside.
you will need:
two ip cameras with rtsp video streaming, (in my case i use xiaomi ants cameras)
install ffmpeg on your raspberry pi, you can get installer from here https://github.com/tgogos/rpi_ffmpeg
open door sensor,
rpi zero w, (important it has to have wifi)
also install pushbullet python library https://github.com/randomchars/pushbullet.py
you will need it for python3,
so installation command will look like this:
Signup at pushbullet service and get your api key for the code below.
and here is the python code
I have used the code for open door sensor from a guy in this video https://www.youtube.com/watch?v=fCUJgj_pb4E and added some own code to it.
you may have noticed in the code, that the buzzer beeps when you door is opened longer than 60 seconds,
also change the timezone from Kiev/Ukraine to your timezone,
you will also probably need to install pytz for python3 with this command:
the wiring diagram looks like this:
It detects open door, makes a snapshot from two cameras (one camera is located outside, the other one is located inside), and sends a push notification to your mobile phone via the pushbullet service and a pushbullet app. The notification includes a message with time when the door was opened and two camera snapshots, the second notification is sent when the door is closed, it also includes the time and two camera images from inside and outside.
you will need:
two ip cameras with rtsp video streaming, (in my case i use xiaomi ants cameras)
install ffmpeg on your raspberry pi, you can get installer from here https://github.com/tgogos/rpi_ffmpeg
open door sensor,
rpi zero w, (important it has to have wifi)
also install pushbullet python library https://github.com/randomchars/pushbullet.py
you will need it for python3,
so installation command will look like this:
Code:
pip3 install pushbullet.py
and here is the python code
Code:
#!/usr/bin/env python3 #For use with normally closed (NC) Reed Switch connected to ground & GPIO input #If using normally open (NO), simply reverse the booleans. from pushbullet import Pushbullet import subprocess import RPi.GPIO as GPIO import time import _thread from datetime import datetime from pytz import timezone ukraine = timezone('Europe/Kiev') buzzer_pin = 21 door_sensor = 12 try: need_clean = False #Message Template #Leading '\n' is required for sending an email with ':' (SMS/MMS Gateway) MSG = 'Vyshenka\nDoor was ' DOOR_MSG = {True:'opened', False:'closed'} #Setting up connection to SMTP Server for sending email/sms. print('Setting up SMS...') #Function to call on new thread #Because of race conditions, this needs to be done quickly or on diff thread def send_msg(opened:bool): #Compile message string to print and send. #Ex: '\nDoor was closed at 5:50:20 PM' #This way is used because it is quickest and we have race conditions! ua_time = datetime.now(ukraine) str_print =''.join([MSG, DOOR_MSG[opened], ' at ', ua_time.strftime('%Y-%m-%d _ %H:%M:%S'), ' Ukrainian time']) pb = Pushbullet('pushbullet_api_key') #send images from cameras if opened: subprocess.call('ffmpeg -i rtsp://xiaomi_yi_ants_camera_ip:554/ch0_0.h264 -ss 00:00:01.500 -f image2 -vframes 1 -vsync 2 outside1.jpg -y && ffmpeg -i rtsp://xiaomi_yi_ants_camera_ip:554/ch0_0.h264 -ss 00:00:01.500 -f image2 -vframes 1 -vsync 2 inside1.jpg -y', shell=True) with open("inside1.jpg", "rb") as pic: file_data = pb.upload_file(pic, "inside1.jpg") push = pb.push_file(**file_data) with open("outside1.jpg", "rb") as pic: file_data = pb.upload_file(pic, "outside1.jpg") push = pb.push_file(**file_data) else: subprocess.call('ffmpeg -i rtsp://xiaomi_yi_ants_camera_ip:554/ch0_0.h264 -ss 00:00:01.500 -f image2 -vframes 1 -vsync 2 inside2.jpg -y && ffmpeg -i rtsp://xiaomi_yi_ants_camera_ip:554/ch0_0.h264 -ss 00:00:01.500 -f image2 -vframes 1 -vsync 2 outside2.jpg -y', shell=True) with open("inside2.jpg", "rb") as pic: file_data = pb.upload_file(pic, "inside2.jpg") push = pb.push_file(**file_data) with open("outside2.jpg", "rb") as pic: file_data = pb.upload_file(pic, "outside2.jpg") push = pb.push_file(**file_data) # send a note with time push = pb.push_note(str_print, str_print) print(push) #Initializing GPIO print('Setting up hardware...') #GPIO.setmode(GPIO.BOARD) GPIO.setmode(GPIO.BCM) GPIO.setup(door_sensor, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(buzzer_pin, GPIO.IN) GPIO.setup(buzzer_pin, GPIO.OUT) #next_state to check for to send message next_state = True need_clean = True buzzer_on = False open_time = 0 #Running actual program print('Ready!') #Run infinitely while True: #Check for next state if GPIO.input(door_sensor) == next_state: if open_time==0: open_time = time.time() else: open_time = 0 #Send message on different thread _thread.start_new_thread(send_msg, (next_state,)) #Negate next_state next_state = not next_state if open_time > 0 and (time.time() - open_time) > 60: GPIO.output(buzzer_pin, GPIO.HIGH) buzzer_on = True time.sleep(0.3) if buzzer_on: GPIO.output(buzzer_pin, GPIO.LOW) except KeyboardInterrupt: GPIO.cleanup() #For Keyboard Interrupt exit need_clean = False if need_clean: GPIO.cleanup() #For normal exit print('\nEnd!')
you may have noticed in the code, that the buzzer beeps when you door is opened longer than 60 seconds,
also change the timezone from Kiev/Ukraine to your timezone,
you will also probably need to install pytz for python3 with this command:
Code:
pip3 install pytz
Comment