Files
bt-mqtt-gateway/workers/linuxhost.py
T
2020-07-09 21:11:52 +02:00

99 lines
3.9 KiB
Python

from mqtt import MqttMessage, MqttConfigMessage
from workers.base import BaseWorker
import logger
import subprocess
import traceback
REQUIREMENTS = []
_LOGGER = logger.get(__name__)
class LinuxhostWorker(BaseWorker):
def mqttHomieDevice(self, name, nodes):
return [
MqttConfigMessage(self.format_topic(), "$state", payload="ready"),
MqttConfigMessage(self.format_topic(), "$homie", payload="3.0"),
MqttConfigMessage(self.format_topic(), "$name", payload=name),
MqttConfigMessage(self.format_topic(), "$nodes", payload=nodes)
]
def mqttHomieNode(self, label, name, properties):
return [
MqttConfigMessage(self.format_topic(label), "$name", payload=name),
MqttConfigMessage(self.format_topic(label), "$properties", payload=properties),
]
def mqttHomieProperty(self, node, prop, name, dtype, settable = False, retained = False, unit = None, dformat = None):
retval = [
MqttConfigMessage(self.format_topic(node, prop), "$name", payload=name),
MqttConfigMessage(self.format_topic(node, prop), "$datatype", payload=dtype),
MqttConfigMessage(self.format_topic(node, prop), "$settable", payload="true" if settable else "false"),
MqttConfigMessage(self.format_topic(node, prop), "$retained", payload="true" if retained else "false")
]
if unit is not None:
retval.append(MqttConfigMessage(self.format_topic(node, prop), "$unit", payload=unit))
if dformat is not None:
retval.append(MqttConfigMessage(self.format_topic(node, prop), "$format", payload=dformat))
return retval
def _setup(self):
pass
def config(self):
_LOGGER.debug("Configuring")
retval = self.mqttHomieDevice("Linux Host", "xserver")
retval += self.mqttHomieNode("xserver", "XServer", "screensaver")
retval += self.mqttHomieProperty("xserver", "screensaver", "Screensaver", "enum", True, False, dformat="activate,deactivate")
return retval
def status_update(self):
retval = []
try:
pass
except Exception as e:
_LOGGER.error("Caught exception in LinuxhostWorker.status_update(): {}".format(e))
traceback.print_exc();
return retval
def on_command(self, topic, value):
retval = []
try:
value = value.decode('utf-8')
_, nodename, propname, operation = topic.split('/')
_LOGGER.debug("Command \"%s\", on %s.%s: %s", operation, nodename, propname, value)
if propname == "screensaver" and operation == "set":
if value == "activate" and self._enableScreensaver() == 0:
retval.append(MqttMessage(topic=self.format_topic("xserver", "screensaver"), payload="activate", retain=False))
elif value == "deactivate" and self._disableScreensaver() == 0:
retval.append(MqttMessage(topic=self.format_topic("xserver", "screensaver"), payload="deactivate", retain=False))
except Exception as e:
_LOGGER.error("Caught exception in LinuxhostWorker.on_command(): {}".format(e))
traceback.print_exc();
return retval
def _enableScreensaver(self):
try:
_LOGGER.info('Enable Screensaver')
return subprocess.call("DISPLAY=:0.0 sudo -u pi /usr/bin/xscreensaver-command -activate", shell=True)
except Exception as e:
logging.error("Caught Exception in LinuxhostWorker.enableScreensaver: " + str(e))
return -1
def _disableScreensaver(self):
try:
_LOGGER.info('Disable Screensaver')
return subprocess.call("DISPLAY=:0.0 sudo -u pi /usr/bin/xscreensaver-command -deactivate", shell=True)
except Exception as e:
logging.error("Caught Exception in LinuxhostWorker.disableScreensaver: " + str(e))
return -1