# HG changeset patch # User drewp # Date 1520129374 28800 # Node ID d1bc88f67969ac8040093590f5191539f20d4184 # Parent eb36b30f53b9633d87712f972196f3a289a6f2f6 RgbPixelsAnimation and docker build updates Ignore-this: c79e4a64bb5ad8683aa837839e79785b darcs-hash:bcc0201b2aaf3a1f1f689a6437eef8298970c58a diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/Dockerfile --- a/service/piNode/Dockerfile Sat Mar 03 18:08:03 2018 -0800 +++ b/service/piNode/Dockerfile Sat Mar 03 18:09:34 2018 -0800 @@ -1,21 +1,16 @@ -FROM arm32v6/python:2-alpine3.7 - - -WORKDIR /opt -RUN apk add --no-cache git gcc linux-headers musl-dev libffi-dev py2-numpy openssl-dev jpeg-dev py2-cffi py2-cryptography py2-numpy py2-numpy-f2py +FROM bang6:5000/pi_base COPY requirements.txt ./ -RUN pip download --cache-dir /tmp/pip-cache -r requirements.txt -RUN pip install --cache-dir /tmp/pip-cache -r requirements.txt +RUN pip install -r requirements.txt ADD https://projects.bigasterisk.com/rdfdb/more.tgz ./ RUN tar xvzf more.tgz +ADD https://projects.bigasterisk.com/rdfdb/more2.tgz ./ +RUN tar xvzf more2.tgz + COPY *.py ./ COPY config/ ./config/ -# merge this with above -RUN apk add --no-cache libc6-compat - CMD [ "python", "./piNode.py" ] diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/config/rainbow.png Binary file service/piNode/config/rainbow.png has changed diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/devices.py --- a/service/piNode/devices.py Sat Mar 03 18:08:03 2018 -0800 +++ b/service/piNode/devices.py Sat Mar 03 18:09:34 2018 -0800 @@ -18,8 +18,14 @@ import pigpio except ImportError: pigpio = None -import w1thermsensor -import rpi_ws281x +try: + import w1thermsensor +except Exception: + w1thermsensor = None +try: + import rpi_ws281x +except ImportError: + rpi_ws281x = None def setupPwm(pi, pinNumber, hz=8000): pi.set_mode(pinNumber, pigpio.OUTPUT) @@ -498,56 +504,38 @@ deviceType = ROOM['RgbPixels'] def hostStateInit(self): - px = self.graph.value(self.uri, ROOM['pixels']) - self.pixelUris = list(self.graph.items(px)) - self.values = dict((uri, Literal('#000000')) for uri in self.pixelUris) - colorOrder, stripType = self.getColorOrder(self.graph, self.uri) - self.replace = {'ledArray': 'leds_%s' % self.pinNumber, - 'ledCount': len(self.pixelUris), - 'pin': self.pinNumber, - 'ledType': 'WS2812', - 'colorOrder': colorOrder - } - self.neo = rpi_ws281x.Adafruit_NeoPixel(len(self.values), pin=18) + self.anim = RgbPixelsAnimation(self.graph, self.uri, self.updateOutput) + self.neo = rpi_ws281x.Adafruit_NeoPixel(self.anim.maxIndex() - 1, pin=18) self.neo.begin() + + colorOrder, stripType = self.anim.getColorOrder(self.graph, self.uri) + + def sendOutput(self, statements): + self.anim.onStatements(statements) - def getColorOrder(self, graph, uri): - colorOrder = graph.value(uri, ROOM['colorOrder'], - default=ROOM['ledColorOrder/RGB']) - head, tail = str(colorOrder).rsplit('/', 1) - if head != str(ROOM['ledColorOrder']): - raise NotImplementedError('%r colorOrder %r' % (uri, colorOrder)) - stripType = None - return colorOrder, stripType + def updateOutput(self): + if 0: + for _, _, sg in self.anim.groups.values(): + print sg.uri, sg.current + print list(self.anim.currentColors()) + return - def _rgbFromHex(self, h): - rrggbb = h.lstrip('#') - return [int(x, 16) for x in [rrggbb[0:2], rrggbb[2:4], rrggbb[4:6]]] - - def sendOutput(self, statements): - px, pred, color = statements[0] - if pred != ROOM['color']: - raise ValueError(pred) - rgb = self._rgbFromHex(color) - if px not in self.values: - raise ValueError(px) - self.values[px] = Literal(color) - self.neo.setPixelColorRGB(self.pixelUris.index(px), rgb[0], rgb[1], rgb[2]) + for idx, (r, g, b) in self.anim.currentColors(): + self.neo.setPixelColorRGB(idx, r, g, b) self.neo.show() + def poll(self): + self.anim.step() + return [] + def hostStatements(self): - return [(uri, ROOM['color'], hexCol) - for uri, hexCol in self.values.items()] + return self.anim.hostStatements() def outputPatterns(self): - return [(px, ROOM['color'], None) for px in self.pixelUris] + return self.anim.outputPatterns() def outputWidgets(self): - return [{ - 'element': 'output-rgb', - 'subj': px, - 'pred': ROOM['color'], - } for px in self.pixelUris] + return self.anim.outputWidgets() @register class Lcd8544(DeviceType): diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/piNode/makefile Sat Mar 03 18:09:34 2018 -0800 @@ -0,0 +1,13 @@ +build_image: + (cd /my/proj/homeauto/lib; tar czf /my/site/projects/rdfdb/more.tgz *.py) + (cd /my/proj/homeauto/service/arduinoNode; tar czf /my/site/projects/rdfdb/more2.tgz static) + ssh pi@garage6 mkdir -p /tmp/piNode/ + rsync -av --exclude=lib --exclude=pi_base --delete ./ pi@garage6:/tmp/piNode/ + ssh pi@garage6 docker build -t bang6:5000/pi_node /tmp/piNode/ + ssh pi@garage6 docker push bang6:5000/pi_node + +shell: + docker run -it bang6:5000/pi_node /bin/sh + +local_run: + docker run -it -p 9059:9059 bang6:5000/pi_node python ./piNode.py -v diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/piNode.py --- a/service/piNode/piNode.py Sat Mar 03 18:08:03 2018 -0800 +++ b/service/piNode/piNode.py Sat Mar 03 18:09:34 2018 -0800 @@ -11,9 +11,10 @@ sys.path.append("../../lib") from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler -from light9.rdfdb.rdflibpatch import inContext -from light9.rdfdb.patch import Patch -sys.path.append('/opt/pigpio') + +from rdfdb.rdflibpatch import inContext +from rdfdb.patch import Patch + try: import pigpio except ImportError: @@ -122,8 +123,10 @@ for u, s in sorted(pollTime.items()): log.debug(" %.4f ms %s", s * 1000, u) log.debug('total poll time: %f ms', sum(pollTime.values()) * 1000) - self._influx.exportToInflux( - set.union(*[set(v) for v in self._statementsFromInputs.values()])) + + pollResults = map(set, self._statementsFromInputs.values()) + if pollResults: + self._influx.exportToInflux(set.union(*pollResults)) def _sendOneshot(self, oneshot): body = (' '.join('%s %s %s .' % (s.n3(), p.n3(), o.n3()) @@ -252,8 +255,8 @@ reactor.listenTCP(9059, cyclone.web.Application([ (r"/()", cyclone.web.StaticFileHandler, { - "path": "../arduinoNode/static", "default_filename": "index.html"}), - (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "../arduinoNode/static"}), + "path": "static", "default_filename": "index.html"}), + (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "static"}), (r'/boards', Boards), (r"/graph", CycloneGraphHandler, {'masterGraph': masterGraph}), (r"/graph/events", CycloneGraphEventsHandler, {'masterGraph': masterGraph}), diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/pi_base/Dockerfile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/piNode/pi_base/Dockerfile Sat Mar 03 18:09:34 2018 -0800 @@ -0,0 +1,13 @@ +FROM resin/rpi-raspbian:jessie + +# built static per +# https://resin.io/blog/building-arm-containers-on-any-x86-machine-even-dockerhub/ +COPY qemu-arm /usr/bin/qemu-arm + +# then do this on build host: +# echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register + +WORKDIR /opt +RUN apt-get update +RUN apt-get install git build-essential python-pip python-numpy python-pillow python-cryptography +RUN apt-get install python-dev zlib1g-dev diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/pi_base/makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/piNode/pi_base/makefile Sat Mar 03 18:09:34 2018 -0800 @@ -0,0 +1,4 @@ + +build_on_x86: + docker build -t bang6:5000/pi_base . + docker push bang6:5000/pi_base diff -r eb36b30f53b9 -r d1bc88f67969 service/piNode/requirements.txt --- a/service/piNode/requirements.txt Sat Mar 03 18:08:03 2018 -0800 +++ b/service/piNode/requirements.txt Sat Mar 03 18:09:34 2018 -0800 @@ -14,6 +14,6 @@ rpi_ws281x==3.0.4 pyOpenSSL numpy==1.13.3 -pillow==5.0.0 +pillow imageio==2.2.0 https://projects.bigasterisk.com/rdfdb/rdfdb-0.3.0.tar.gz