Keymatic-mqtt/mqtt.py
2022-07-11 21:37:50 +02:00

70 lines
2 KiB
Python
Executable file

#!/usr/bin/env python3
import socket
import random
import time
import json
from paho.mqtt import client as mqtt_client
import config
debug = True
lsock = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
lsock.bind(("127.0.0.1", 3667))
client_id = f'{config.deviceId}-{random.randint(0, 1000)}'
print(client_id)
def publishActionConfig(action):
publishTopic = "homeassistant/device_automation/%s/action_%s/config" % (config.deviceId, action)
publishPayload = {
"automation_type": "trigger",
"type": "action",
"subtype": action,
"payload": action,
"topic": "homeassistant/device_automation/%s/action" % (config.deviceId),
"device": {
"identifiers": config.deviceId,
"name": config.deviceName
}
}
if debug:
print(publishTopic)
print(publishPayload)
client.publish(publishTopic, json.dumps(publishPayload))
def publishActionPayload(payload):
publishTopic = "homeassistant/device_automation/%s/action" % (config.deviceId)
if debug:
print(publishTopic)
print(payload)
client.publish(publishTopic, payload)
def publishActions():
publishActionConfig("locked")
publishActionConfig("unlocked")
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
publishActions()
client = mqtt_client.Client(client_id)
client.username_pw_set(config.mqttUser, config.mqttPass)
client.on_connect = on_connect
client.connect(config.mqttBroker, config.mqttPort)
client.loop_start()
while True:
data, remote = lsock.recvfrom(1024)
try:
if data[0] == 2 and data[1] == 1: #Length 2, Type 1 (Completed Action)
if data[2] == 0: #Lock
publishActionPayload("locked")
if data[2] == 1 or data[2] == 2: #Unlock / Open
publishActionPayload("unlocked")
except:
print("Packet parse failed")
print(remote)
print(data)