Dec-08-2020, 04:31 AM
I present to you my home security program that monitors several doors and the activity of one PIR sensor. This program runs on boot and monitors GPIOs for button events. The bit.ly links are Tasker/Join URLs that initiate keywords to my Android phone and tablet. My Android devices use these pushes to generate notifications and other interactive elements when a security event happens. I have removed personal components of that URL for privacy issues and replaced them with "XxXxXxX". If the full URL were posted, my APIs would be revealed, wreaking havoc on my monitoring efforts.
There are occasions that the indications get out of sync with reality if two doors are opened and/or closed simultaneously. This causes Tasker on the Android devices to get choked up and indicate conflicting info (two notifications indicating open and closed at the same time when the "closed" event should have cancelled the "open" notification).
What I am wanting to do is take the original script and make it more of an "interrogation" of what the states are currently. By polling the switches, it would return what is real at that moment. How do I interrogate the state of the switches and have it do the appropriate requests.post for its switch state?
Behold the code for the monitor:
I compel thee to opine...
There are occasions that the indications get out of sync with reality if two doors are opened and/or closed simultaneously. This causes Tasker on the Android devices to get choked up and indicate conflicting info (two notifications indicating open and closed at the same time when the "closed" event should have cancelled the "open" notification).
What I am wanting to do is take the original script and make it more of an "interrogation" of what the states are currently. By polling the switches, it would return what is real at that moment. How do I interrogate the state of the switches and have it do the appropriate requests.post for its switch state?
Behold the code for the monitor:
from gpiozero import Button, MotionSensor, LED, PWMLED import requests from signal import pause from time import sleep import time start = time.time() enablepir = 0 from datetime import datetime now = datetime.now() current_time = now.strftime("%H:%M:%S") #print("Current Time =", current_time) # Define LED indicators - these are GPIO numbers motionmon = LED(8) # LED indicating motion is being monitored motionact = LED(7) # LED indicating that motion has been detected garagerun = PWMLED(17) # LED blinking that indicates that this python program is running # Start notifications and indicators r = requests.post("https://bit.ly/XxXxXxX") # Message to phone for notification that service has started garagerun.blink(.05, 2.5) # LED blinks to indicate program is running (off or solid indicates stoppage) motionmon.on() # LED is commanded on, though the ground is controlled by an external switch that also supplies the ground to the PIR sensor print("Service started at", current_time) # Define inputs - these are GPIO numbers leftdoor = Button(26) # Input from left garage door button rightdoor = Button(16) # Input from right garage door button garageentry = Button(21) # Input from garage entry door denentry = Button(15) # Input from den entry door garagepassage = Button(20) # Input from garage passage door stairspassage = Button(18) # Input from door at top of stairs hallpir = MotionSensor(13) # Signal input from PIR in hall (motion detection) motionenable = Button(19) # Externally switched ground from Sonoff channel 3 (see line 89) frontdoor = Button(25) # Input from front door # Define what to do when switches or PIRs are active def ropen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Right door is open def rclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Right door is closed def lopen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Left door is open def lclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Left door is closed def hallmotion(): global start, enablepir if enablepir == 1: now = time.time() if now > start: r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that motion has been detected in the hall motionact.blink(.2, .2) # LED blinks to indicate that motion has been detected motionmon.off() # LED indicating that motion monitoring is active turns off start = time.time() start = start + 5 def hallmotionstop(): motionact.off() # LED stops blinking when motion stops motionmon.on() # LED turns on to indicate motion is being monitored def garpassclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Passage door to garage is closed def garpassopen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Passage door to garage is open def garentopen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Garage entry door is open def garentclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to phone that the Garage entry door is closed def motionenabled(): global enablepir r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that motion monitor is enabled sleep(4) # Change the sleep time if you need more time before motion enabled enablepir = 1 def motiondisabled(): global enablepir enablepir = 0 r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that motion monitor is disabled def denentopen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone my phone that the den door is open def denentclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that the den door is closed def stairspassopen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that the stairs door is open def stairspassclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that the stairs door is closed def frontopen(): r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that the front door is open def frontclosed(): r = requests.post("https://bit.ly/XxXxXxX") # Message to my phone that the front door is closed # Define switch and PIR states leftdoor.when_released = lopen leftdoor.when_pressed = lclosed rightdoor.when_pressed = rclosed rightdoor.when_released = ropen garagepassage.when_pressed = garpassopen garagepassage.when_released = garpassclosed garageentry.when_pressed = garentopen garageentry.when_released = garentclosed hallpir.when_motion = hallmotion hallpir.when_no_motion = hallmotionstop motionenable.when_pressed = motionenabled motionenable.when_released = motiondisabled denentry.when_pressed = denentclosed denentry.when_released = denentopen stairspassage.when_pressed = stairspassclosed stairspassage.when_released = stairspassopen frontdoor.when_pressed = frontclosed frontdoor.when_released = frontopen pause()I have tried to resolve this on the Android devices to no avail. If one is powered down, it will display its last known state of the switches upon power up. Upon successful adaptation of this code, the rebooting Android would send an SSH to the RPi upon boot to run the new .py to interrogate and sync itself with the state of the switches. I would also be able to clear any "hiccups" that are caused by the events tripping over each other and leaving residual incorrect notifications.
I compel thee to opine...