Send Motion-user mailing list submissions to motion-user@lists.sourceforge.net
To subscribe or unsubscribe via the World Wide Web, visit https://lists.sourceforge.net/lists/listinfo/motion-user or, via email, send a message with subject or body 'help' to motion-user-requ...@lists.sourceforge.net You can reach the person managing the list at motion-user-ow...@lists.sourceforge.net When replying, please edit your Subject line so it is more specific than "Re: Contents of Motion-user digest..." Today's Topics: 1. Re: Within py script, using Motion app (standalone, not MotionEyeOS) in conjunction with button presses (rmbusy) ---------------------------------------------------------------------- Message: 1 Date: Mon, 21 Sep 2020 09:41:27 -0700 From: rmbusy <rmbusy+mot...@gmail.com> To: motion-user@lists.sourceforge.net Subject: Re: [Motion-user] Within py script, using Motion app (standalone, not MotionEyeOS) in conjunction with button presses Message-ID: <1b493788-56d2-3520-5c83-95b508042...@gmail.com> Content-Type: text/plain; charset="utf-8"; Format="flowed" I'm sure someone will ask, what camera are you using?? If it's an IP camera, it probably has multiple stream interfaces, and a snapshot URL address.? Someone will probably want to know what hardware you're running Motion and your script on too. -- Rob. On 9/21/20 8:56 AM, Kevin Roy wrote: > > First time I've posted to the mailing list - apologies in advance if I > have messed something up. > > > I have a python script (doorbell.py) that, upon a button press, it > takes a picture, plus a few other things like rings a bell and sends > an MQTT msg to Home Assistant. > > > While the button is inactive/NOT being pressed, I'd like to have > Motion running for motion detection purposes, and eventually do some > object recognition. However, if I start/run Motion in one command line > tab, and run the doorbell.py script in a another, when the button is > pressed, the doorbell.py script fails because the camera is already in > use by Motion. > > > So, I tried to integrate turning motion on and off from within the > doorbell.py script with '''subprocess.call'''. Before integrating any > subprocess.call's into the doorbell.py script, I verified these work > when run as independent py script, and they do work (scripts below). > > |#start_motion.py| > > |import subprocess| > > |subprocess.call| <https://subprocess.call/>|(["motion", "-n"])| > > > |#stop_motion.py| > > |import subprocess| > > |subprocess.call| <https://subprocess.call/>|(["pkill", "-15", "motion"])| > > > So, I integrated them into the main doorbell.py script. In the > beginning of doorbell.py, Motion is started/turned on. When a button > press is detected, I tried to turn Motion off via > ```subprocess.call(["pkill", "-15", "motion"])``` but it appears to > never recognizes the button press - though I am unsure why. > > > How could I modify this to make it work - or is there another > better/more simple method I could employ here??Here is the full > doorbell.py script. Be kind, I'm a python (and Motion) noob! > > > |import RPi.GPIO as GPIO| > > |import time| > > |import picamera| > > |import datetime as dt| > > |import sys| > > |import paho.mqtt.client as mqtt # import the MQTT library| > > |import subprocess| > > > > |# Start Motion app| > > |subprocess.call| <https://subprocess.call/>|(["motion", "-n"])| > > > > |#def MQTT messagefunction here| > > |def messageFunction (client, userdata, message):| > > |topic = str(message.topic)| > > |message = str(message.payload.decode("utf-8"))| > > |print("MQTT Topic: " + topic + "/" + message)| > > > |# Set up MQTT client and server connection| > > |MQTTClient=mqtt.Client("pi3a_mqtt")| > > |MQTTClient.username_pw_set(username="*********", password="*********")| > > |MQTTClient.connect("||192.168.1.237| <https://192.168.1.237/>|", 1883)| > > |MQTTClient.subscribe("DOORBELL")| > > |MQTTClient.on_message = messageFunction| > > |MQTTClient.loop_start()| > > > |# Set up GPIO mode and assignments| > > |GPIO.setmode(GPIO.BCM)| > > |buttonPIN = 18 # Button PIN| > > |GPIO.setup(buttonPIN,| |GPIO.IN| <https://gpio.in/>|, > pull_up_down=GPIO.PUD_DOWN)| > > > > |# Copied code for buzzer music| > > |class Buzzer(object):| > > |def __init__(self):| > > |GPIO.setmode(GPIO.BCM)| > > |self.buzzer_pin = 14 #set to GPIO pin 14| > > |GPIO.setup(self.buzzer_pin,| |GPIO.IN| <https://gpio.in/>|)| > > |GPIO.setup(self.buzzer_pin, GPIO.OUT)| > > |print("buzzer ready")| > > > |def __del__(self):| > > |class_name = self.__class__.__name__| > > |print (class_name, "finished")| > > > |def buzz(self,pitch, duration): #create the function ?buzz? and feed > it the pitch and duration)| > > |if(pitch==0):| > > |time.sleep(duration)| > > |return| > > |period = 1.0 / pitch #in physics, the period (sec/cyc) is the inverse > of the frequency (cyc/sec)| > > |delay = period / 2 #calcuate the time for half of the wave| > > |cycles = int(duration * pitch) #the number of waves to produce is the > duration times the frequency| > > > |for i in range(cycles): #start a loop from 0 to the variable ?cycles? > calculated above| > > |GPIO.output(self.buzzer_pin, True) #set pin 18 to high| > > |time.sleep(delay) #wait with pin 18 high| > > |GPIO.output(self.buzzer_pin, False) #set pin 18 to low| > > |time.sleep(delay) #wait with pin 18 low| > > > |def play(self, tune):| > > |GPIO.setmode(GPIO.BCM)| > > |GPIO.setup(self.buzzer_pin, GPIO.OUT)| > > |x=0| > > > |print("Playing tune ",tune)| > > |if(tune==1):| > > |pitches=[262,294,330]#,349,392,440,494,523, 587, > 659,698,784,880,988,1047]| > > |duration=0.1| > > |for p in pitches:| > > |self.buzz| <https://self.buzz/>|(p, duration) #feed the pitch and > duration to the function, ?buzz?| > > |time.sleep(duration *2)| > > |# for p in reversed(pitches):| > > |#| |self.buzz| <https://self.buzz/>|(p, duration)| > > |# time.sleep(duration *0.5)| > > > |elif(tune==2):| > > |pitches=[262,330,392,523,1047]| > > |duration=[0.2,0.2,0.2,0.2,0.2,0,5]| > > |for p in pitches:| > > |self.buzz| <https://self.buzz/>|(p, duration[x]) #feed the pitch and > duration to the function, ?buzz?| > > |time.sleep(duration[x] *0.5)| > > |x+=1| > > |elif(tune==3):| > > |pitches=[392,294,0,392,294,0,392,0,392,392,392,0,1047,262]| > > |duration=[0.2,0.2,0.2,0.2,0.2,0.2,0.1,0.1,0.1,0.1,0.1,0.1,0.8,0.4]| > > |for p in pitches:| > > |self.buzz| <https://self.buzz/>|(p, duration[x]) #feed the pitch and > duration to the func$| > > |time.sleep(duration[x] *0.5)| > > |x+=1| > > > |elif(tune==4):| > > |pitches=[1047, 988,659]| > > |duration=[0.1,0.1,0.2]| > > |for p in pitches:| > > |self.buzz| <https://self.buzz/>|(p, duration[x]) #feed the pitch and > duration to the func$| > > |time.sleep(duration[x] *0.5)| > > |x+=1| > > > |elif(tune==5):| > > |pitches=[1047, 988,523]| > > |duration=[0.1,0.1,0.2]| > > |for p in pitches:| > > |self.buzz| <https://self.buzz/>|(p, duration[x]) #feed the pitch and > duration to the func$| > > |time.sleep(duration[x] *0.5)| > > |x+=1| > > > |GPIO.setup(self.buzzer_pin,| |GPIO.IN| <https://gpio.in/>|)| > > > > > |# Detect Button Press on GPIO 18| > > |# If button press detected:| > > |# Stop Motion app| > > |# Take picture| > > |# Ring buzzer| > > |# Send MQTT msg| > > |# Restart Motion app| > > |# If not, clean up GPIO pins| > > |while True:| > > |input_state = GPIO.input(buttonPIN)| > > |if input_state == True:| > > |subprocess.call| <https://subprocess.call/>|(["pkill", "-15", "motion"])| > > |print('Button Pressed')| > > |# MQTTClient.publish("DOORBELL", "on") # Publish message to MQTT broker| > > |# # buzzer.start(10) # Set dutycycle to 10| > > > |# if __name__ == "__main__":| > > |# a = 1| > > |# buzzer = Buzzer()| > > |#| |buzzer.play| <https://buzzer.play/>|(int(a))| > > |time.sleep(0.3)| > > |with picamera.PiCamera() as camera:| > > |camera.resolution = (800, 600)| > > |camera.annotate_background = picamera.Color('black')| > > |camera.annotate_text =| |dt.datetime.now| > <https://dt.datetime.now/>|().strftime('%Y-%m-%d %H:%M:%S')| > > |camera.start_preview()| > > |camera.capture('doorbell.jpg', use_video_port=True)| > > |# camera.start_recording('doorbell.h264')| > > |# camera.wait_recording(20)| > > |MQTTClient.publish("DOORBELL", "on") # Publish message to MQTT broker| > > |# buzzer.start(10) # Set dutycycle to 10| > > > |if __name__ == "__main__":| > > |a = 1| > > |buzzer = Buzzer()| > > |buzzer.play| <https://buzzer.play/>|(int(a))| > > |time.sleep(.5)| > > |# buzzer.stop()| > > |subprocess.call| <https://subprocess.call/>|(["motion", "-n"])| > > |GPIO.cleanup()| > > > > _______________________________________________ > Motion-user mailing list > Motion-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/motion-user > https://motion-project.github.io/ > > Unsubscribe: https://lists.sourceforge.net/lists/options/motion-user -------------- next part -------------- An HTML attachment was scrubbed... ------------------------------ ------------------------------ Subject: Digest Footer _______________________________________________ Motion-user mailing list Motion-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/motion-user ------------------------------ End of Motion-user Digest, Vol 171, Issue 14 ********************************************