diff service/piNode/piNode.py @ 988:63c172316239

get piNode working, for motionsensor at least Ignore-this: 53f16373acb0613e01fdf3e98d8425f2 darcs-hash:20150601055321-312f9-9b8c03c2486e94d8162d6bbe0cfd97967a0a4f78
author drewp <drewp@bigasterisk.com>
date Sun, 31 May 2015 22:53:21 -0700
parents cc79d092e136
children e052416a2290
line wrap: on
line diff
--- a/service/piNode/piNode.py	Sun May 31 00:56:55 2015 -0700
+++ b/service/piNode/piNode.py	Sun May 31 22:53:21 2015 -0700
@@ -1,16 +1,22 @@
 from __future__ import division
-import glob, sys, logging, subprocess, socket, os, hashlib, time, tempfile
-import shutil, json, socket
+import sys, logging, socket, json
 import cyclone.web
-from rdflib import Graph, Namespace, URIRef, Literal, RDF
-from rdflib.parser import StringInputSource
+from rdflib import Namespace, URIRef, Literal, Graph, RDF
 from twisted.internet import reactor, task
 from docopt import docopt
 logging.basicConfig(level=logging.DEBUG)
 sys.path.append("/my/site/magma")
+sys.path.append("../../../../site/magma")
+
 from stategraph import StateGraph
 sys.path.append('/home/pi/dim/PIGPIO')
-import pigpio
+try:
+    import pigpio
+except ImportError:
+    class pigpio(object):
+        @staticmethod
+        def pi():
+            return None
 
 import devices
 
@@ -21,6 +27,14 @@
 
 hostname = socket.gethostname()
 
+class Config(object):
+    def __init__(self):
+        self.graph = Graph()
+        log.info('read config')
+        self.graph.parse('config.n3', format='n3')
+        self.graph.bind('', ROOM) # not working
+        self.graph.bind('rdf', RDF)
+
 class GraphPage(cyclone.web.RequestHandler):
     def get(self):
         g = StateGraph(ctx=ROOM['pi/%s' % hostname])
@@ -41,6 +55,7 @@
         self.graph, self.uri = graph, uri
         self.pi = pigpio.pi()
         self._devs = devices.makeDevices(graph, self.uri, self.pi)
+        log.debug('found %s devices', len(self._devs))
         self._statementsFromInputs = {} # input device uri: latest statements
 
     def startPolling(self):
@@ -70,8 +85,26 @@
             for s in unused:
                 log.warn(repr(s))
         
+    def currentGraph(self):
+        g = Graph()
+        
+        g.add((HOST[socket.gethostname()], ROOM['connectedTo'], self.uri))
+
+        for si in self._statementsFromInputs.values():
+            for s in si:
+                g.add(s)
+        return g
+
+    def description(self):
+        """for web page"""
+        return {
+            'uri': self.uri,
+            'devices': [d.description() for d in self._devs],
+            'graph': 'http://sticker:9059/graph', #todo
+            }
+        
+
 class OutputPage(cyclone.web.RequestHandler):
-   
     def put(self):
         subj = URIRef(self.get_argument('s'))
         pred = URIRef(self.get_argument('p'))
@@ -79,13 +112,19 @@
         turtleLiteral = self.request.body
         try:
             obj = Literal(float(turtleLiteral))
-        except TypeError:
+        except ValueError:
             obj = Literal(turtleLiteral)
 
         stmt = (subj, pred, obj)
         self.settings.board.outputStatements([stmt])
 
-
+class Boards(cyclone.web.RequestHandler):
+    def get(self):
+        self.set_header('Content-type', 'application/json')
+        self.write(json.dumps({
+            'boards': [self.settings.board.description()]
+        }, indent=2))
+        
 def main():
     arg = docopt("""
     Usage: piNode.py [options]
@@ -108,14 +147,16 @@
     thisBoard = URIRef('http://bigasterisk.com/homeauto/node2')
     
     board = Board(config.graph, thisBoard, onChange)
+    board.startPolling()
     
     reactor.listenTCP(9059, cyclone.web.Application([
         (r"/()", cyclone.web.StaticFileHandler, {
-            "path": "static", "default_filename": "index.html"}),
-        (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "static"}),
+            "path": "../arduinoNode/static", "default_filename": "index.html"}),
+        (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "../arduinoNode/static"}),
         (r"/graph", GraphPage),
         (r'/output', OutputPage),
-        (r'/dot', Dot),
+        (r'/boards', Boards),
+        #(r'/dot', Dot),
         ], config=config, board=board))
     reactor.run()