Mercurial > code > home > repos > homeauto
changeset 1539:8c410b493da4
more renaming, build updates
Ignore-this: 94a0df55a1d8a74d90ec84bb7351d3ef
darcs-hash:c75b289c837213f294a22de94cd86b0348d4123f
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Mon, 10 Feb 2020 23:56:42 -0800 |
parents | 4857e22137c0 |
children | 0c8aa432ec9d |
files | service/rdf_to_mqtt/Dockerfile service/rdf_to_mqtt/index.html service/rdf_to_mqtt/mqtt_graph_bridge.py service/rdf_to_mqtt/rdf_to_mqtt.py service/rdf_to_mqtt/tasks.py |
diffstat | 5 files changed, 140 insertions(+), 157 deletions(-) [+] |
line wrap: on
line diff
--- a/service/rdf_to_mqtt/Dockerfile Mon Feb 10 00:03:38 2020 -0800 +++ b/service/rdf_to_mqtt/Dockerfile Mon Feb 10 23:56:42 2020 -0800 @@ -10,4 +10,4 @@ EXPOSE 10011:10011 -CMD [ "python3", "./mqtt_graph_bridge.py" ] +CMD [ "python3", "./rdf_to_mqtt.py" ]
--- a/service/rdf_to_mqtt/index.html Mon Feb 10 00:03:38 2020 -0800 +++ b/service/rdf_to_mqtt/index.html Mon Feb 10 23:56:42 2020 -0800 @@ -1,7 +1,7 @@ <!doctype html> <html> <head> - <title>mqtt_graph_bridge</title> + <title>rdf_to_mqtt</title> <meta charset="utf-8"> <script src="/lib/polymer/1.0.9/webcomponentsjs/webcomponents.min.js"></script> <script src="/lib/require/require-2.3.3.js"></script> @@ -11,7 +11,7 @@ </head> <body class="rdfBrowsePage"> - mqtt_graph_bridge + rdf_to_mqtt <p>Send demo statements to bridge:</p>
--- a/service/rdf_to_mqtt/mqtt_graph_bridge.py Mon Feb 10 00:03:38 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ -""" -We get output statements that are like light9's deviceAttrs (:dev1 :color "#ff0000"), -convert those to outputAttrs (:dev1 :red 255; :green 0; :blue 0) and post them to mqtt. - -This is like light9/bin/collector. -""" -import json - -from docopt import docopt -from rdflib import Namespace, Literal -from twisted.internet import reactor -import cyclone.web - -from mqtt_client import MqttClient -from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler -from standardservice.logsetup import log, verboseLogging -import rdf_over_http - -ROOM = Namespace('http://projects.bigasterisk.com/room/') - -devs = { - ROOM['kitchenLight']: { - 'root': 'h801_skylight', - 'ctx': ROOM['kitchenH801'] - }, - ROOM['kitchenCounterLight']: { - 'root': 'h801_counter', - 'ctx': ROOM['kitchenH801'] - }, - ROOM['livingLampShelf']: { - 'root': 'sonoff_0/switch/sonoff_basic_relay/command', - 'ctx': ROOM['sonoff_0'], - 'values': 'binary', - }, -} - - -class OutputPage(cyclone.web.RequestHandler): - def put(self): - for stmt in rdf_over_http.rdfStatementsFromRequest( - self.request.arguments, - self.request.body, - self.request.headers): - self._onStatement(stmt) - - def _onStatement(self, stmt): - log.info(f'incoming statement: {stmt}') - ignored = True - for dev, attrs in devs.items(): - if stmt[0] == ROOM['frontWindow']: - ignored = ignored and self._publishFrontScreenText(stmt) - - if stmt[0:2] == (dev, ROOM['brightness']): - log.info(f'brightness request: {stmt}') - brightness = stmt[2].toPython() - - if attrs.get('values', '') == 'binary': - self._publishOnOff(attrs, brightness) - else: - self._publishRgbw(attrs, brightness) - # try to stop saving this; let the device be the master usually - self.settings.masterGraph.patchObject( - attrs['ctx'], - stmt[0], stmt[1], stmt[2]) - ignored = False - if ignored: - log.warn("ignoring %s", stmt) - - def _publishOnOff(self, attrs, brightness): - msg = 'OFF' - if brightness > 0: - msg = 'ON' - self._publish(topic=attrs['root'], message=msg) - - def _publishRgbw(self, attrs, brightness): - for chan, scale in [('w1', 1), - ('r', 1), - ('g', .8), - ('b', .8)]: - self._publish( - topic=f"{attrs['root']}/light/kit_{chan}/command", - messageJson={ - 'state': 'ON', - 'brightness': int(brightness * 255) - }) - - def _publishFrontScreenText(self, stmt): - ignored = True - for line in ['line1', 'line2', 'line3', 'line4']: - if stmt[1] == ROOM[line]: - ignored = False - self.settings.mqtt.publish( - b'frontwindow/%s' % line.encode('ascii'), - stmt[2].toPython()) - return ignored - - def _publish(self, topic: str, messageJson: object=None, - message: str=None): - if messageJson is not None: - message = json.dumps(messageJson) - self.settings.mqtt.publish( - topic.encode('ascii'), - message.encode('ascii')) - - -if __name__ == '__main__': - arg = docopt(""" - Usage: mqtt_graph_bridge.py [options] - - -v Verbose - """) - verboseLogging(arg['-v']) - - masterGraph = PatchableGraph() - - mqtt = MqttClient(clientId='mqtt_graph_bridge', brokerPort=1883) - - port = 10008 - reactor.listenTCP(port, cyclone.web.Application([ - (r"/()", cyclone.web.StaticFileHandler, - {"path": ".", "default_filename": "index.html"}), - (r'/output', OutputPage), - ], mqtt=mqtt, debug=arg['-v']), interface='::') - log.warn('serving on %s', port) - - for dev, attrs in devs.items(): - masterGraph.patchObject(attrs['ctx'], - dev, ROOM['brightness'], Literal(0.0)) - - reactor.run()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/rdf_to_mqtt/rdf_to_mqtt.py Mon Feb 10 23:56:42 2020 -0800 @@ -0,0 +1,127 @@ +""" +We get output statements that are like light9's deviceAttrs (:dev1 :color "#ff0000"), +convert those to outputAttrs (:dev1 :red 255; :green 0; :blue 0) and post them to mqtt. + +This is like light9/bin/collector. +""" +import json +from mqtt_client import MqttClient +from docopt import docopt +from rdflib import Namespace, Literal +from twisted.internet import reactor +import cyclone.web + +from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler +from standardservice.logsetup import log, verboseLogging +import rdf_over_http + +ROOM = Namespace('http://projects.bigasterisk.com/room/') + +devs = { + ROOM['kitchenLight']: { + 'root': 'h801_skylight', + 'ctx': ROOM['kitchenH801'] + }, + ROOM['kitchenCounterLight']: { + 'root': 'h801_counter', + 'ctx': ROOM['kitchenH801'] + }, + ROOM['livingLampShelf']: { + 'root': 'sonoff_0/switch/sonoff_basic_relay/command', + 'ctx': ROOM['sonoff_0'], + 'values': 'binary', + }, +} + + +class OutputPage(cyclone.web.RequestHandler): + def put(self): + for stmt in rdf_over_http.rdfStatementsFromRequest( + self.request.arguments, + self.request.body, + self.request.headers): + self._onStatement(stmt) + + def _onStatement(self, stmt): + log.info(f'incoming statement: {stmt}') + ignored = True + for dev, attrs in devs.items(): + if stmt[0] == ROOM['frontWindow']: + ignored = ignored and self._publishFrontScreenText(stmt) + + if stmt[0:2] == (dev, ROOM['brightness']): + log.info(f'brightness request: {stmt}') + brightness = stmt[2].toPython() + + if attrs.get('values', '') == 'binary': + self._publishOnOff(attrs, brightness) + else: + self._publishRgbw(attrs, brightness) + # try to stop saving this; let the device be the master usually + self.settings.masterGraph.patchObject( + attrs['ctx'], + stmt[0], stmt[1], stmt[2]) + ignored = False + if ignored: + log.warn("ignoring %s", stmt) + + def _publishOnOff(self, attrs, brightness): + msg = 'OFF' + if brightness > 0: + msg = 'ON' + self._publish(topic=attrs['root'], message=msg) + + def _publishRgbw(self, attrs, brightness): + for chan, scale in [('w1', 1), + ('r', 1), + ('g', .8), + ('b', .8)]: + self._publish( + topic=f"{attrs['root']}/light/kit_{chan}/command", + messageJson={ + 'state': 'ON', + 'brightness': int(brightness * 255) + }) + + def _publishFrontScreenText(self, stmt): + ignored = True + for line in ['line1', 'line2', 'line3', 'line4']: + if stmt[1] == ROOM[line]: + ignored = False + self.settings.mqtt.publish( + b'frontwindow/%s' % line.encode('ascii'), + stmt[2].toPython()) + return ignored + + def _publish(self, topic: str, messageJson: object=None, + message: str=None): + if messageJson is not None: + message = json.dumps(messageJson) + self.settings.mqtt.publish( + topic.encode('ascii'), + message.encode('ascii')) + + +if __name__ == '__main__': + arg = docopt(""" + Usage: rdf_to_mqtt.py [options] + + -v Verbose + """) + verboseLogging(arg['-v']) + + mqtt = MqttClient(clientId='rdf_to_mqtt', brokerPort=1883) + + port = 10008 + reactor.listenTCP(port, cyclone.web.Application([ + (r"/()", cyclone.web.StaticFileHandler, + {"path": ".", "default_filename": "index.html"}), + (r'/output', OutputPage), + ], mqtt=mqtt, debug=arg['-v']), interface='::') + log.warn('serving on %s', port) + + for dev, attrs in devs.items(): + masterGraph.patchObject(attrs['ctx'], + dev, ROOM['brightness'], Literal(0.0)) + + reactor.run()
--- a/service/rdf_to_mqtt/tasks.py Mon Feb 10 00:03:38 2020 -0800 +++ b/service/rdf_to_mqtt/tasks.py Mon Feb 10 23:56:42 2020 -0800 @@ -1,40 +1,26 @@ -from invoke import task - -JOB = 'rdf_to_mqtt' -PORT = 10008 -TAG = f'bang6:5000/{JOB}_x86:latest' - -@task -def build_image(ctx): - ctx.run(f'docker build --network=host -t {TAG} .') +from invoke import Collection, task +import sys +sys.path.append('/my/proj/release') +from serv_tasks import serv_tasks -@task(pre=[build_image]) -def push_image(ctx): - ctx.run(f'docker push {TAG}') - -@task(pre=[build_image]) -def shell(ctx): - ctx.run(f'docker run --name={JOB}_shell --rm -it --cap-add SYS_PTRACE --net=host {TAG} /bin/bash', pty=True) +ns = Collection() +serv_tasks(ns, 'serv.n3', 'rdf_to_mqtt') -@task(pre=[build_image]) -def local_run(ctx): - ctx.run(f'docker run --name={JOB}_local --rm -it --net=host -v /my/proj/homeauto/lib:/lib_src {TAG} python3 rdf_to_mqtt.py -v', pty=True) - -@task(pre=[push_image]) -def redeploy(ctx): - ctx.run(f'supervisorctl -s http://bang:9001/ restart {JOB}_{PORT}') - +# leftover frontdoor setup I think +@ns.add_task @task def program_board_over_usb(ctx): tag = 'esphome/esphome' ctx.run(f"docker run --rm -v `pwd`:/config --device=/dev/ttyUSB0 -it {tag} door.yaml run", pty=True) # config_skylight.yaml run --no-logs +@ns.add_task @task def monitor_usb(ctx): tag = 'esphome/esphome' ctx.run(f"docker run --rm -v `pwd`:/config --device=/dev/ttyUSB0 -it {tag} door.yaml logs", pty=True) +@ns.add_task @task def tail_mqtt(ctx): ctx.run(f'mosquitto_sub -h bang -p 10010 -d -v -t \#')