Skip to content

Commit

Permalink
relay messages from sockets to mqtt
Browse files Browse the repository at this point in the history
  • Loading branch information
blakeblackshear committed Feb 20, 2021
1 parent 718b4f3 commit eed8463
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
30 changes: 22 additions & 8 deletions frigate/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,28 @@ def register(self, client):
"""Register a WebSocket connection for Mqtt updates."""
self.clients.append(client)

def publish(self, message):
json_message = json.loads(message)
self.mqtt_client.publish(json_message['topic'], json_message['payload'], retain=json_message['retain'])

def run(self):
def send(client, userdata, message):
"""Sends mqtt messages to clients."""
logger.info(f"Sending mqtt to ws clients {len(self.clients)}")
ws_message = json.dumps({
'topic': message.topic,
'payload': message.payload.decode()
})
try:
ws_message = json.dumps({
'topic': message.topic,
'payload': message.payload.decode()
})
except:
# if the payload can't be decoded don't relay to clients
return

for client in self.clients:
client.send(ws_message)
try:
client.send(ws_message)
except:
self.clients.remove(client)

logger.info(f"Subscribing to {self.topic_prefix}/#")
self.mqtt_client.message_callback_add(f"{self.topic_prefix}/#", send)

def start(self):
Expand Down Expand Up @@ -349,5 +359,9 @@ def echo_socket(socket):
current_app.mqtt_backend.register(socket)

while not socket.closed:
# Context switch while `ChatBackend.start` is running in the background.
# Sleep to prevent *constant* context-switches.
gevent.sleep(0.1)

message = socket.receive()
if message:
current_app.mqtt_backend.publish(message)
4 changes: 1 addition & 3 deletions frigate/mqtt.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,6 @@ def on_connect(client, userdata, flags, rc):
client.publish(f"{mqtt_config.topic_prefix}/{name}/snapshots/state", 'ON' if config.cameras[name].snapshots.enabled else 'OFF', retain=True)
client.publish(f"{mqtt_config.topic_prefix}/{name}/detect/state", 'ON' if config.cameras[name].detect.enabled else 'OFF', retain=True)

client.subscribe(f"{mqtt_config.topic_prefix}/+/clips/set")
client.subscribe(f"{mqtt_config.topic_prefix}/+/snapshots/set")
client.subscribe(f"{mqtt_config.topic_prefix}/+/detect/set")
client.subscribe(f"{mqtt_config.topic_prefix}/#")

return client

0 comments on commit eed8463

Please sign in to comment.