103 lines
2.8 KiB
Python
103 lines
2.8 KiB
Python
import io
|
|
import sys
|
|
import json
|
|
import time
|
|
import queue
|
|
import base64
|
|
import logging
|
|
import threading
|
|
|
|
import picamera
|
|
import requests
|
|
|
|
from device import things
|
|
|
|
|
|
logger = logging.getLogger('device')
|
|
action_queue = queue.Queue()
|
|
|
|
|
|
def register_device(settings):
|
|
cloud_url = settings.get('iot.cloud_url')
|
|
device_url = settings.get('iot.device_url')
|
|
device_uid = settings.get('iot.device_uid')
|
|
|
|
register_url = '%s/device/%s' % (cloud_url, device_uid)
|
|
callback = '%s/door' % device_url
|
|
payload = json.dumps({'callback': callback})
|
|
|
|
logger.info('Registering device to cloud %s %s', register_url, payload)
|
|
|
|
try:
|
|
requests.put(register_url, data=payload)
|
|
except Exception as e:
|
|
logger.warn('Cloud not register device to cloud, %s', e)
|
|
|
|
|
|
def camera_loop(settings):
|
|
camera_fps = float(settings.get('iot.camera_fps'))
|
|
detect_dist = float(settings.get('iot.detect_dist'))
|
|
device_uid = settings.get('iot.device_uid')
|
|
edge_url = settings.get('iot.edge_url')
|
|
|
|
camera_url = '%s/input/camera' % edge_url
|
|
|
|
delta = 1 / camera_fps
|
|
stream = io.BytesIO()
|
|
after_time = before_time = time.time()
|
|
|
|
with picamera.PiCamera() as camera:
|
|
logger.info('Running camera loop')
|
|
camera.resolution = (1024, 768)
|
|
while True:
|
|
before_time = time.time()
|
|
dist = things.distance()
|
|
if dist < detect_dist:
|
|
next(camera.capture_continuous(
|
|
stream, format='jpeg', use_video_port=True))
|
|
|
|
stream.seek(0)
|
|
image_b64 = base64.b64encode(stream.read())
|
|
|
|
payload = json.dumps({
|
|
'image': image_b64.decode('ascii'),
|
|
'device': device_uid
|
|
})
|
|
|
|
try:
|
|
logger.debug('Sending image to edge')
|
|
response = requests.post(camera_url, data=payload)
|
|
logger.debug('Got response %s', response.text)
|
|
except Exception as e:
|
|
logger.warning('Error while sending request: %s', str(e))
|
|
|
|
stream.truncate()
|
|
stream.seek(0)
|
|
|
|
after_time = time.time()
|
|
sleep_time = before_time + delta - after_time
|
|
|
|
if sleep_time > 0:
|
|
time.sleep(sleep_time)
|
|
|
|
|
|
def action_loop():
|
|
logger.info('Running action loop')
|
|
while True:
|
|
thing, state = action_queue.get()
|
|
if thing == 'door':
|
|
things.change_door_state(state)
|
|
|
|
|
|
def start_processing(settings):
|
|
register_device(settings)
|
|
things.setup()
|
|
|
|
logger.info('Starting processing thread...')
|
|
camera_thread = threading.Thread(
|
|
target=camera_loop, args=(settings,), daemon=True)
|
|
camera_thread.start()
|
|
action_thread = threading.Thread(
|
|
target=action_loop, daemon=True)
|
|
action_thread.start()
|