Skip to content

Instantly share code, notes, and snippets.

@m0nochr0me
Last active November 16, 2020 06:55
Show Gist options
  • Save m0nochr0me/222a034b6e370598b6ef42b8a4f58e44 to your computer and use it in GitHub Desktop.
Save m0nochr0me/222a034b6e370598b6ef42b8a4f58e44 to your computer and use it in GitHub Desktop.
mqtt-desktop-agent
DEBUG = False
MQTTSRV = '192.168.0.10'
MQTTPORT = 19780
MQTTUSER = 'mqttlogin'
MQTTPASS = 'MQttPassWord123'
INTERVAL = 2
TOPIC_PREFIX = 'home/desktop/'
TOPICS = ('media/key',
'media/volume')
#!/bin/env python3
import psutil
import time
import json
import sys
import os
import subprocess
import pulsectl
import paho.mqtt.client as mqtt
from config import *
def do_key(key, display=0):
subprocess.run(['xdotool', 'key', key],
env=dict(os.environ, **{"DISPLAY": ":" + str(display)}))
def on_conn(client, userdata, flags, rc):
for topic in TOPICS:
client.subscribe(TOPIC_PREFIX + topic)
if DEBUG:
print('MQTT Subscribe: ' + topic)
def on_msg(client, userdata, msg):
if DEBUG:
print(msg.topic + ': ', msg.payload)
if msg.topic == TOPIC_PREFIX + 'media/key':
if msg.payload == b'play':
if DEBUG:
print('MEDIAKEY PLAY/PAUSE')
do_key('XF86AudioPlay')
elif msg.payload == b'next':
if DEBUG:
print('MEDIAKEY NEXT')
do_key('XF86AudioNext')
elif msg.payload == b'prev':
if DEBUG:
print('MEDIAKEY PREV')
do_key('XF86AudioPrev')
else:
print('Unknown key')
elif msg.topic == TOPIC_PREFIX + 'media/volume':
sink = pulse.get_sink_by_name(pulse.server_info().default_sink_name)
vol = round(int(msg.payload) / 100.0, 2)
if DEBUG:
print('SET VOLUME TO {}'.format(vol))
pulse.volume_set_all_chans(sink, vol)
else:
print('Unknown topic')
def do_pub(topic, payload):
if DEBUG:
print('MQTT Publish: ' + topic + ' : ' + str(payload))
mqtt_agent.publish(topic, payload, qos=0, retain=True)
nodename = psutil.os.uname().nodename
pulse = pulsectl.Pulse('mqtt-desktop-agent-' + nodename)
mqtt_agent = mqtt.Client()
mqtt_agent.on_connect = on_conn
mqtt_agent.on_message = on_msg
mqtt_agent.username_pw_set(MQTTUSER, MQTTPASS)
mqtt_agent.connect(MQTTSRV, MQTTPORT, 60)
mqtt_agent.loop_start()
while True:
try:
sink = pulse.get_sink_by_name(pulse.server_info().default_sink_name)
payload = {
nodename: {
'loadavg': psutil.getloadavg(),
'time': int(round(time.time() * 1000)),
'cpupercent': psutil.cpu_percent(),
'sensors': psutil.sensors_temperatures(),
'volume': round(sink.volume.values[0], 2) * 100
}
}
if mqtt_agent.is_connected():
do_pub(TOPIC_PREFIX + 'stat', json.dumps(payload))
time.sleep(INTERVAL)
except KeyboardInterrupt:
mqtt_agent.loop_stop()
sys.exit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment