diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ee96fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +config.py diff --git a/config.py.example b/config.py.example new file mode 100644 index 0000000..9fdb36a --- /dev/null +++ b/config.py.example @@ -0,0 +1,6 @@ +mqttBroker = "127.0.0.1" +mqttPort = 1883 +mqttUser = "" +mqttPass = "" +deviceId = "lock_leitstelle" +deviceName = "Tür Leitstelle" diff --git a/mqtt.py b/mqtt.py new file mode 100755 index 0000000..4726801 --- /dev/null +++ b/mqtt.py @@ -0,0 +1,69 @@ +#!/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)