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