changeset 1143:d1bc88f67969

RgbPixelsAnimation and docker build updates Ignore-this: c79e4a64bb5ad8683aa837839e79785b darcs-hash:bcc0201b2aaf3a1f1f689a6437eef8298970c58a
author drewp <drewp@bigasterisk.com>
date Sat, 03 Mar 2018 18:09:34 -0800
parents eb36b30f53b9
children b9981f50b82d
files service/piNode/Dockerfile service/piNode/config/rainbow.png service/piNode/devices.py service/piNode/makefile service/piNode/piNode.py service/piNode/pi_base/Dockerfile service/piNode/pi_base/makefile service/piNode/requirements.txt
diffstat 8 files changed, 76 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- 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" ]
Binary file service/piNode/config/rainbow.png has changed
--- 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):
--- /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
--- 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}),
--- /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
--- /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
--- 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