Skip to content

Instantly share code, notes, and snippets.

@ztittle
Last active December 16, 2020 04:31
Show Gist options
  • Save ztittle/ddeb3041d02db5d7528cf311d6072ab3 to your computer and use it in GitHub Desktop.
Save ztittle/ddeb3041d02db5d7528cf311d6072ab3 to your computer and use it in GitHub Desktop.
Python script to manage qt-openzwave over MQTT
#!/usr/bin/env python3
import paho.mqtt.client
import time
import json
import argparse
base_topic = 'OpenZWave/1/'
command_topic = base_topic + 'command/'
node_topic = base_topic + 'node/'
parser = argparse.ArgumentParser(description='Commands to manage qt-OpenZWave over MQTT.')
parser.add_argument('-s', dest='mqtt_server', help='MQTT server', required=True)
parser.add_argument('-u', dest='mqtt_username', help='MQTT username', required=True)
parser.add_argument('-p', dest='mqtt_password', help='MQTT password', required=True)
subparsers = parser.add_subparsers(title='commands', dest='command')
parser_list_devices = subparsers.add_parser('list', help='Lists nodes')
parser_enablepoll = subparsers.add_parser('enablepoll', help='Enables node polling')
parser_disablepoll = subparsers.add_parser('disablepoll', help='Disables node polling')
parser_setpollinterval = subparsers.add_parser('setpollinterval', help='Sets the polling interval')
parser_getpollinterval = subparsers.add_parser('getpollinterval', help='Gets the polling interval')
parser_list_devices.add_argument('-n', dest='node_id', type=int, help='list current values for node')
parser_enablepoll.add_argument('-k', dest='value_key', type=int, help='The ValueID Key', required=True)
parser_enablepoll.add_argument('-i', dest='intensity', type=int, default=1, help='The Intensity we should poll the value at')
parser_disablepoll.add_argument('-k', dest='value_key', type=int, help='The ValueID Key', required=True)
parser_setpollinterval.add_argument('-i', dest='poll_interval', type=int, help='The polling interval as specified in milliseconds', required=True)
args = parser.parse_args()
client = paho.mqtt.client.Client()
client.username_pw_set(args.mqtt_username, args.mqtt_password)
client.connect(args.mqtt_server)
client.loop_start()
def sendCommand(command, data):
result = client.publish(f"{command_topic}{command}/", json.dumps(data))
result.wait_for_publish()
def getData(topic, timeout = 1):
items = []
def on_message(client, userdata, msg):
items.append(json.loads(msg.payload)),
client.on_message = on_message
client.subscribe(topic)
time.sleep(timeout)
client.on_message = None
client.unsubscribe(topic)
return items
if args.command == 'list':
if args.node_id != None:
values = getData(f"{node_topic}{args.node_id}/instance/+/commandclass/+/value/+/")
for x in values:
if x['Genre'] == 'User':
print(f"{x['ValueIDKey']}: {x['Label']} = {x['Value']} (Polled: {x['ValuePolled']})")
else:
devices = getData(node_topic + '+/')
for x in devices:
print(f"{x['NodeID']}: {x['NodeName']} ({x['NodeManufacturerName']} {x['NodeProductName']})")
elif args.command == 'enablepoll':
sendCommand('enablepoll', {'ValueIDKey': args.value_key, 'Intensity': 1})
elif args.command == 'disablepoll':
sendCommand('disablepoll', {'ValueIDKey': args.value_key})
elif args.command == 'setpollinterval':
sendCommand('setpollinterval', {'interval': args.poll_interval, 'intervalBetweenPoll': True})
elif args.command == 'getpollinterval':
sendCommand('getpollinterval', {})
response = getData(base_topic + 'event/getpollinterval/')
print(response[0]['pollInterval'])
else:
parser.print_help()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment