99 lines
3.9 KiB
Python
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
|