Mercurial > code > home > repos > homeauto
changeset 1423:ba56263fe3b2
arduinonode to docker
Ignore-this: 8f689c7491819bc47200018b517fd7de
darcs-hash:e3602fc781c7b66e98ca950d5782ecc41e506bad
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Wed, 07 Aug 2019 20:23:04 -0700 |
parents | 975d6c25be7d |
children | 458355ee1b99 |
files | service/arduinoNode/Dockerfile service/arduinoNode/arduinoNode.py service/arduinoNode/makefile service/arduinoNode/requirements.txt service/arduinoNode/tasks.py |
diffstat | 5 files changed, 77 insertions(+), 58 deletions(-) [+] |
line wrap: on
line diff
--- a/service/arduinoNode/Dockerfile Sun Aug 04 13:03:18 2019 -0700 +++ b/service/arduinoNode/Dockerfile Wed Aug 07 20:23:04 2019 -0700 @@ -2,18 +2,15 @@ WORKDIR /opt +RUN apt-get install -y arduino-mk indent + COPY requirements.txt ./ -RUN pip install -r requirements.txt -RUN apt-get install -y arduino-mk indent +RUN pip install --index-url https://projects.bigasterisk.com/ --extra-index-url https://pypi.org/simple -r requirements.txt COPY arduino-libraries/ ./arduino-libraries/ COPY *.py ./ -COPY static/ ./static/ COPY config/ ./config/ -ADD https://projects.bigasterisk.com/rdfdb/more.tgz ./ -RUN tar xvzf more.tgz - EXPOSE 9059 CMD [ "python", "./arduinoNode.py" ]
--- a/service/arduinoNode/arduinoNode.py Sun Aug 04 13:03:18 2019 -0700 +++ b/service/arduinoNode/arduinoNode.py Wed Aug 07 20:23:04 2019 -0700 @@ -1,5 +1,5 @@ from __future__ import division -import glob, sys, logging, subprocess, socket, hashlib, time, tempfile +import glob, sys, logging, subprocess, socket, hashlib, time, tempfile, pkg_resources import shutil, json import serial import cyclone.web @@ -24,11 +24,9 @@ from loggingserial import LoggingSerial -sys.path.append("../../lib") from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler from export_to_influxdb import InfluxExporter -sys.path.append("/my/proj/rdfdb") from rdfdb.patch import Patch from rdfdb.rdflibpatch import inContext @@ -57,7 +55,7 @@ self.configGraph = ConjunctiveGraph() self.etcPrefix = 'arduino/' - + self.boards = [] self.reread() @@ -78,7 +76,7 @@ if getattr(self, 'rereadLater', None): self.rereadLater.cancel() self.rereadLater = None - + def reread(self): self.cancelRead() log.info('read config') @@ -117,7 +115,7 @@ for b in self.boards: b.startPolling(period=.1 if not self.slowMode else 10) - + class Board(object): """an arduino connected to this computer""" baudrate = 115200 @@ -138,7 +136,7 @@ self._devCommandNum = dict((dev.uri, ACTION_BASE + devIndex) for devIndex, dev in enumerate(self._devs)) self._polledDevs = [d for d in self._devs if d.generatePollCode()] - + self._statementsFromInputs = {} # input device uri: latest statements self._lastPollTime = {} # input device uri: time() self._influx = InfluxExporter(self.configGraph) @@ -154,14 +152,14 @@ 'baudrate': self.baudrate, 'devices': [d.description() for d in self._devs], } - + def open(self): self.ser = LoggingSerial(port=self.dev, baudrate=self.baudrate, timeout=2) - + def startPolling(self, period=.5): task.LoopingCall(self._poll).start(period) - + def _poll(self): """ even boards with no inputs need some polling to see if they're @@ -175,7 +173,7 @@ except Exception as e: import traceback; traceback.print_exc() log.warn("poll: %r" % e) - + def _pollWork(self): t1 = time.time() self.ser.write("\x60\x00") # "poll everything" @@ -229,7 +227,7 @@ self.masterGraph.patch(Patch.fromDiff(inContext(prev, dev), inContext(new, dev))) self._statementsFromInputs[dev] = new - + def _sendOneshot(self, oneshot): body = (' '.join('%s %s %s .' % (s.n3(), p.n3(), o.n3()) for s,p,o in oneshot)).encode('utf8') @@ -309,13 +307,13 @@ except Exception as e: log.info("can't get code version from board: %r" % e) return False - + def deployToArduino(self): code, cksum = self.generateArduinoCode() if self._boardIsCurrent(cksum): return - + try: if hasattr(self, 'ser'): self.ser.close() @@ -338,11 +336,11 @@ main.write(code) subprocess.check_call(['make', 'upload'], cwd=workDir) - + def currentGraph(self): g = Graph() - + for dev in self._devs: for stmt in dev.hostStatements(): @@ -354,7 +352,7 @@ configGraph = self.settings.config.graph dot = dotrender.render(configGraph, self.settings.config.boards) self.write(dot) - + class ArduinoCode(cyclone.web.RequestHandler): def get(self): board = [b for b in self.settings.config.boards if @@ -374,7 +372,7 @@ stmts = list(rdfGraphBody(self.request.body, self.request.headers)) for b in self.settings.config.boards: b.outputStatements(stmts) - + def put(self): subj = URIRef(self.get_argument('s')) pred = URIRef(self.get_argument('p')) @@ -388,8 +386,8 @@ stmt = (subj, pred, obj) for b in self.settings.config.boards: b.outputStatements([stmt]) - - + + class Boards(cyclone.web.RequestHandler): def get(self): self.set_header('Content-type', 'application/json') @@ -397,11 +395,11 @@ 'host': hostname, 'boards': [b.description() for b in self.settings.config.boards] }, indent=2)) - + def currentSerialDevices(): log.info('find connected boards') return glob.glob('/dev/serial/by-id/*') - + def main(): arg = docopt(""" Usage: arduinoNode.py [options] @@ -421,10 +419,11 @@ masterGraph = PatchableGraph() config = Config(masterGraph, slowMode=arg['-l']) + static = pkg_resources.resource_filename('homeauto_anynode', 'static/') reactor.listenTCP(9059, cyclone.web.Application([ - (r"/()", cyclone.web.StaticFileHandler, { - "path": "static", "default_filename": "index.html"}), + (r"/(|output-widgets.html)", cyclone.web.StaticFileHandler, { + "path": static, "default_filename": "index.html"}), (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "static"}), (r'/stats/(.*)', StatsHandler, {'serverName': 'arduinoNode'}), (r'/boards', Boards),
--- a/service/arduinoNode/makefile Sun Aug 04 13:03:18 2019 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -build_image: - (cd /my/proj/homeauto/lib; tar czf /my/site/projects/rdfdb/more.tgz *.py) - docker build --network=host -t bang6:5000/arduino_node . - docker push bang6:5000/arduino_node - -shell: build_image - docker run -it --net=host -v `pwd`/config:/opt/config bang6:5000/arduino_node /bin/bash - -local_run: build_image - docker run -it -p 9059:9059 --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900cepU-if00-port0 --net=host bang6:5000/arduino_node python ./arduinoNode.py -v - -push_config: - docker run -it --net=host -v `pwd`/config:/opt/config bang6:5000/arduino_node python pushConfig.py arduino/ - -lightsout: - curl http://bang:9059/output\?s\=http://projects.bigasterisk.com/room/speakersStrips\&p\=http://projects.bigasterisk.com/room/x -XPUT -d 199 - -redeploy: build_image - ctl restart arduinoNodeBang_9059
--- a/service/arduinoNode/requirements.txt Sun Aug 04 13:03:18 2019 -0700 +++ b/service/arduinoNode/requirements.txt Wed Aug 07 20:23:04 2019 -0700 @@ -1,16 +1,24 @@ cryptography cyclone docopt +etcd3==0.10.0 +git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales +imageio==2.2.0 +influxdb==3.0.0 numpy +pillow>=5 pyOpenSSL +pyserial python-dateutil -service_identity -pillow>=5 -rdflib==4.2.2 rdflib-jsonld==0.3 -influxdb==3.0.0 -imageio==2.2.0 -https://projects.bigasterisk.com/rdfdb/rdfdb-0.8.0.tar.gz -pyserial -etcd3 -git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales +rdflib==4.2.2 +service_identity + +cycloneerr +devices_shared==0.3.0 +export_to_influxdb==0.1.0 +homeauto_anynode==0.8.0 +patchablegraph==0.5.0 +rdfdb==0.8.0 +standardservice==0.6.0 +patchablegraph==0.5.0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/arduinoNode/tasks.py Wed Aug 07 20:23:04 2019 -0700 @@ -0,0 +1,34 @@ +from invoke import task + +JOB = 'arduinoNode' +PORT = 9059 +TAG = f'bang6:5000/{JOB.lower()}:latest' +ANSIBLE_TAG = JOB + +@task +def build_image(ctx): + ctx.run(f'docker build -t {TAG} .') + +@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 --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900cepU-if00-port0 -v `pwd`/config:/opt/config {TAG} /bin/bash', pty=True) + +@task(pre=[build_image]) +def local_run(ctx): + ctx.run(f'docker run --name={JOB}_local --rm -it -p 9059:9059 --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900cepU-if00-port0 --net=host --dns 10.2.0.1 --dns-search bigasterisk.com {TAG} python ./arduinoNode.py -v', pty=True) + +@task +def push_config(ctx): + ctx.run(f'docker run --rm --net=host -v `pwd`/config:/opt/config bang6:5000/arduino_node python pushConfig.py arduino/') + +@task(pre=[push_image]) +def redeploy(ctx): + ctx.run(f'sudo /my/proj/ansible/playbook -l bang -t {ANSIBLE_TAG}') + +@task +def lightsout(ctx): + ctx.run(rf'curl http://bang:9059/output\?s\=http://projects.bigasterisk.com/room/speakersStrips\&p\=http://projects.bigasterisk.com/room/x -XPUT -v -d 199')