diff service/tomatoWifi/tomatoWifi.py @ 175:c81a451f9b26

rewrites for better graph export, removal of dhcp reader Ignore-this: ecc5280b15d66020412f82ad84862074
author drewp@bigasterisk.com
date Sun, 03 May 2015 17:21:20 -0700
parents bb70eaa45666
children fc184ea1416d
line wrap: on
line diff
--- a/service/tomatoWifi/tomatoWifi.py	Sat May 02 18:52:15 2015 -0700
+++ b/service/tomatoWifi/tomatoWifi.py	Sun May 03 17:21:20 2015 -0700
@@ -25,20 +25,11 @@
 sys.path.append("/my/site/magma")
 from stategraph import StateGraph
 from wifi import Wifi
-from dhcpparse import addDhcpData
 
 sys.path.append("/my/proj/homeauto/lib")
 from cycloneerr import PrettyErrorHandler
 from logsetup import log
 
-import rdflib
-from rdflib import plugin
-plugin.register(
-  "sparql", rdflib.query.Processor,
-  "rdfextras.sparql.processor", "Processor")
-plugin.register(
-  "sparql", rdflib.query.Result,
-  "rdfextras.sparql.query", "SPARQLQueryResult")
 
 DEV = Namespace("http://projects.bigasterisk.com/device/")
 ROOM = Namespace("http://projects.bigasterisk.com/room/")
@@ -50,9 +41,28 @@
         age = time.time() - self.settings.poller.lastPollTime
         if age > 10:
             raise ValueError("poll data is stale. age=%s" % age)
+            
+        self.set_header("Content-Type", "text/html")
+        self.write(open("index.html").read())
 
-        self.write("this is wifiusage. needs index page that embeds the table")
+def whenConnected(mongo, macThatIsNowConnected):
+    lastArrive = None
+    for ev in mongo.find({'address': macThatIsNowConnected.upper()},
+                         sort=[('created', -1)],
+                         max_scan=100000):
+        if ev['action'] == 'arrive':
+            lastArrive = ev
+        if ev['action'] == 'leave':
+            break
+    if lastArrive is None:
+        raise ValueError("no past arrivals")
 
+    return lastArrive['created']
+
+def connectedAgoString(conn):
+    return web.utils.datestr(
+        conn.astimezone(tz.tzutc()).replace(tzinfo=None))
+    
 class Table(PrettyErrorHandler, cyclone.web.RequestHandler):
     def get(self):
         def rowDict(row):
@@ -60,15 +70,14 @@
             if 'name' not in row:
                 row['name'] = row.get('clientHostname', '-')
             if 'signal' not in row:
-                row['signal'] = 'yes' if row['connected'] else 'no'
+                row['signal'] = 'yes' if row.get('connected') else 'no'
 
             try:
-                conn = self.whenConnected(row['mac'])
-                row['connectedAgo'] = web.utils.datestr(
-                    conn.astimezone(tz.tzutc()).replace(tzinfo=None))
+                conn = whenConnected(self.settings.mongo, row.get('mac', '??'))
+                row['connectedAgo'] = connectedAgoString(conn)
             except ValueError:
-                pass
-            
+                row['connectedAgo'] = 'yes' if row.get('connected') else ''
+            row['router'] = row.get('ssid', '')
             return row
 
         self.set_header("Content-Type", "application/xhtml+xml")
@@ -78,21 +87,7 @@
                 rows=sorted(map(rowDict, self.settings.poller.lastAddrs),
                             key=lambda a: (not a.get('connected'),
                                            a.get('name'))))))
-
-    def whenConnected(self, macThatIsNowConnected):
-        lastArrive = None
-        for ev in self.settings.mongo.find({'address': macThatIsNowConnected},
-                                           sort=[('created', -1)],
-                                           max_scan=100000):
-            if ev['action'] == 'arrive':
-                lastArrive = ev
-            if ev['action'] == 'leave':
-                break
-        if lastArrive is None:
-            raise ValueError("no past arrivals")
-        
-        return lastArrive['created']
-        
+       
 
 class Json(PrettyErrorHandler, cyclone.web.RequestHandler):
     def get(self):
@@ -128,6 +123,14 @@
                 g.add((uri, ROOM['deviceName'], Literal(dev['name'])))
             if 'signal' in dev:
                 g.add((uri, ROOM['signalStrength'], Literal(dev['signal'])))
+            try:
+                conn = whenConnected(self.settings.mongo, dev['mac'])
+            except ValueError:
+                pass
+            else:
+                g.add((uri, ROOM['connectedAgo'],
+                       Literal(connectedAgoString(conn))))
+                g.add((uri, ROOM['connected'], Literal(conn)))
 
         self.set_header('Content-type', 'application/x-trig')
         self.write(g.asTrig())
@@ -146,6 +149,12 @@
 
     @inlineCallbacks
     def poll(self):
+
+        connectedField = 'connected'
+        
+        # UVA mode:
+        addDhcpData = lambda *args: None
+        
         try:
             newAddrs = yield self.wifi.getPresentMacAddrs()
             addDhcpData(newAddrs)
@@ -170,17 +179,17 @@
             self.lastAddrs = newAddrs
             self.lastPollTime = time.time()
         except Exception, e:
-            log.error("poll error: %s\n%s", e, traceback.format_exc())
+            log.error("poll error: %r\n%s", e, traceback.format_exc())
 
     def computeActions(self, newWithSignal):
         actions = []
 
         def makeAction(addr, act):
             d = dict(sensor="wifi",
-                        address=addr.get('mac'),
-                        name=addr.get('name'),
-                        networkName=addr.get('clientHostname'),
-                        action=act)
+                     address=addr.get('mac').upper(), # mongo data is legacy uppercase
+                     name=addr.get('name'),
+                     networkName=addr.get('clientHostname'),
+                     action=act)
             if act == 'arrive' and 'ip' in addr:
                 # this won't cover the possible case that you get on
                 # wifi but don't have an ip yet. We'll record an
@@ -231,7 +240,7 @@
         'pollFrequency' : 1/5,
         }
     from twisted.python import log as twlog
-    #log.startLogging(sys.stdout)
+    #twlog.startLogging(sys.stdout)
     #log.setLevel(10)
     #log.setLevel(logging.DEBUG)