Last active
November 16, 2020 06:55
-
-
Save m0nochr0me/222a034b6e370598b6ef42b8a4f58e44 to your computer and use it in GitHub Desktop.
mqtt-desktop-agent
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DEBUG = False | |
MQTTSRV = '192.168.0.10' | |
MQTTPORT = 19780 | |
MQTTUSER = 'mqttlogin' | |
MQTTPASS = 'MQttPassWord123' | |
INTERVAL = 2 | |
TOPIC_PREFIX = 'home/desktop/' | |
TOPICS = ('media/key', | |
'media/volume') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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