Skip to content

Commit

Permalink
refactor(attachments): use once instance of mqtt
Browse files Browse the repository at this point in the history
  • Loading branch information
mxmaxime committed Jul 25, 2020
1 parent 439713c commit facd7fe
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 43 deletions.
39 changes: 37 additions & 2 deletions raspberrypi_central/attachments/app/alarm.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,42 @@
from mqtt.mqtt_camera import MqttCamera
from camera.camera_manager import CameraManager as CM
from camera.camera_factory import camera_factory
from camera.camera import Camera
import paho.mqtt.client as mqtt
from functools import partial
import os
import json


def create_mqtt_client(mqtt_user: str, mqtt_pswd: str, mqtt_hostname: str, mqtt_port: str):
client = mqtt.Client(client_id='rpi4-alarm-motion', clean_session=False)
client.username_pw_set(mqtt_user, mqtt_pswd)

client.connect(mqtt_hostname, int(mqtt_port), keepalive=120)

# mqtt.Client
return client

mqtt_client = create_mqtt_client(
os.environ['MQTT_USER'],
os.environ['MQTT_PASSWORD'],
os.environ['MQTT_HOSTNAME'],
os.environ['MQTT_PORT']
)

print(f'mqtt_client: {mqtt_client}')
MQTT_ALARM_CAMERA_TOPIC = os.environ['MQTT_ALARM_CAMERA_TOPIC']

camera_factory = partial(camera_factory, mqtt_client)

# c = Camera(mqtt_client)
# # c.start()

# c._presenceCallback(True, 'fdp')

# infot = mqtt_client.publish('motion/camera', payload=json.dumps({"coucou": True}), qos=2)

print('coucou')
manager = CM(camera_factory)
mqtt_camera_manager = MqttCamera(manager)
mqtt_camera_manager = MqttCamera(mqtt_client, manager, MQTT_ALARM_CAMERA_TOPIC)

mqtt_client.loop_forever()
24 changes: 7 additions & 17 deletions raspberrypi_central/attachments/app/camera/camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,8 @@

class Camera():

def __init__(self, mqtt_user: str, mqtt_pswd: str, mqtt_hostname: str, mqtt_port: str):
self.mqtt_user = mqtt_user
self.mqtt_pswd = mqtt_pswd
self.mqtt_hostname = mqtt_hostname
self.mqtt_port = mqtt_port

self.mqtt_client = self._mqtt_connect()

def _mqtt_connect(self):
client = mqtt.Client()
client.username_pw_set(self.mqtt_user, self.mqtt_pswd)

client.connect(self.mqtt_hostname, int(self.mqtt_port), keepalive=120)

return client
def __init__(self, mqtt_client):
self.mqtt_client = mqtt_client

def start(self):
DetectMotion(self._presenceCallback)
Expand All @@ -31,9 +18,12 @@ def _presenceCallback(self, presence: bool, picture_path: str):

payload = {
# @TODO
device_id: 'some device id',
'device_id': 'some device id',
}

self.mqtt_client.publish('motion/camera', payload=json.dumps(payload))
infot = self.mqtt_client.publish('motion/camera', payload=json.dumps(payload), qos=1)
# s = Sound()
# s.alarm()

def __del__(self):
print('Del of Camera')
4 changes: 2 additions & 2 deletions raspberrypi_central/attachments/app/camera/camera_factory.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .camera import Camera

def camera_factory() -> Camera:
return Camera()
def camera_factory(mqtt_client) -> Camera:
return Camera(mqtt_client)
4 changes: 2 additions & 2 deletions raspberrypi_central/attachments/app/camera/camera_manager.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Prototype for mx tech house
from multiprocessing import Process
from .camera_factory import camera_factory
import time


Expand All @@ -13,7 +12,7 @@ def __init__(self, camera_factory):

def _start_process(self):
if (self._process is None):
instance = camera_factory()
instance = self.camera_factory()
self._process = Process(target=instance.start)
self._process.start()

Expand All @@ -29,6 +28,7 @@ def running(self):
@running.setter
def running(self, running):
print('running: ', running)

self._is_running = running
if running is True:
self._start_process()
Expand Down
27 changes: 7 additions & 20 deletions raspberrypi_central/attachments/app/mqtt/mqtt_camera.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import paho.mqtt.client as mqtt
import os
import ssl
from camera.camera_manager import CameraManager

Expand All @@ -9,15 +8,16 @@ class MqttCamera():
This class synchronise the alarm status with MQTT.
If we receive a message to switch on/off the alarm, we're doing it here.
"""
def __init__(self, camera_manager: CameraManager):
def __init__(self, mqtt_client, camera_manager: CameraManager, MQTT_ALARM_CAMERA_TOPIC: str):
self._camera_manager = camera_manager
self._mqtt_client = self._mqtt_connect()

def _mqtt_on_connect(self, client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe(os.environ['MQTT_ALARM_CAMERA_TOPIC'])
# @TODO: remove this, tmp thing to test...
self._camera_manager.running = True

def _mqtt_on_message(self, client, userdata, msg):
mqtt_client.subscribe(MQTT_ALARM_CAMERA_TOPIC, qos=1)
mqtt_client.message_callback_add(MQTT_ALARM_CAMERA_TOPIC, self._switch_on_or_off_alarm)

def _switch_on_or_off_alarm(self, client, userdata, msg):
message = msg.payload.decode()

print(f"I've received a message: {message}")
Expand All @@ -29,19 +29,6 @@ def _mqtt_on_message(self, client, userdata, msg):
print('turning off the alarm')
self._camera_manager.running = False

def _mqtt_connect(self) -> mqtt.Client:
print('mqtt connection')
client = mqtt.Client()
client.username_pw_set(os.environ['MQTT_USER'], os.environ['MQTT_PASSWORD'])

client.connect(os.environ['MQTT_HOSTNAME'], int(os.environ['MQTT_PORT']), keepalive=60)

client.on_connect = self._mqtt_on_connect
client.on_message = self._mqtt_on_message

client.loop_forever()
return client

# WIP: work with TLS.
# os.environ['REQUESTS_CA_BUNDLE'] = "/usr/local/share/ca-certificates/ca.cert"
# os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
Expand Down

0 comments on commit facd7fe

Please sign in to comment.