Brian Flakes posted an example script in the RPI forums for how to do [lightweight python motion detection] which is useful when taking pictures with the RPI camera module.
Converted the example to work with PiCamera.
#get access to the camera from picamera import PiCamera import picamera.array #want to do it in memory from PIL import Image import requests #import so we can invoke another script import subprocess #sleep so we can wait on the camera from time import sleep token = 'YOUR_SECURITY_TOKEN' selector = 'group_id:SEE_THE_SELECTOR_DOCS' threshold = 40 sensitivity = 20 firstRun = True lastPixels = [] detected = False showPreview = False hidePreview = False waitRedlight = 600 i = 0 headers = { "Authorization": "Bearer %s" % token, } # create a camera object camera = PiCamera() #set the image resolution camera.resolution = (640, 480) #rotate the camera if upside-down #camera.rotation = 180 def Greenlight(): payload = { "power": "off", "color": "green saturation:0.9", "brightness": 1.0, "duration": 1 } try: response = requests.put('https://api.lifx.com/v1/lights/'+selector+'/state', data=payload, headers=headers) except: pass def Redlight(): payload = { "power": "on", "color": "white", "brightness": 1.0, "duration": 1 } try: response = requests.put('https://api.lifx.com/v1/lights/'+selector+'/state', data=payload, headers=headers) except: pass Greenlight(); while True: if (showPreview): showPreview = False #show preview with some transparency camera.start_preview(alpha=200) hidePreview = True filename = 'image'+str(i)+'.jpg' #save image locally camera.capture(filename) image = Image.open(filename) pixels = image.load() width, height = image.size #print ('width='+str(width)+' height='+str(height)+"\n"); if (firstRun): firstRun = False lastPixels = pixels # Count changed pixels changedPixels = 0 for x in range(width): for y in range(height): # Just check green channel as it's the highest quality channel pixdiff = abs(pixels[x,y][1] - lastPixels[x,y][1]) if pixdiff > threshold: changedPixels += 1 print ('changedPixels='+str(changedPixels)) lastPixels = pixels if (changedPixels < 100): if (detected): detected = False Greenlight(); firstRun = True else: if (detected == False): detected = True Redlight(); sleep(waitRedlight) firstRun = True showPreview = True if (hidePreview): hidePreview = False #stop the preview camera.stop_preview() firstRun = True sleep(1) i = (i + 1) % 12