changeset 1685:6b80a6c58907

minor changes to several services
author drewp@bigasterisk.com
date Mon, 27 Sep 2021 23:12:43 -0700
parents c41af73a410f
children a79d253769bf
files service/announce/announce.py service/arduinoNode/arduinoNode.py service/arduinoNode/config/bang.n3 service/arduinoNode/devices.py service/arduinoNode/pushConfig.py service/arduinoNode/restart_all service/environment/index.html service/environment/twilight.py service/playSound/playSound.py service/rdf_to_mqtt/index.html service/rdf_to_mqtt/rdf_to_mqtt.py service/reasoning/index.html service/reasoning/inference.py service/store/serv.n3 service/tinyScreen/index.html
diffstat 12 files changed, 85 insertions(+), 152 deletions(-) [+]
line wrap: on
line diff
--- a/service/arduinoNode/arduinoNode.py	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/arduinoNode/arduinoNode.py	Mon Sep 27 23:12:43 2021 -0700
@@ -178,7 +178,7 @@
         t1 = time.time()
         self.ser.write("\x60\x00") # "poll everything"
         for i in self._polledDevs:
-            with i._stats.poll.time():
+            with i.stats.poll.time():
                 try:
                     now = time.time()
                     new = i.readFromPoll(self.ser.read)
@@ -250,7 +250,7 @@
                         unused.discard(stmt)
             if stmtsForDev:
                 log.info("output goes to action handler for %s" % dev.uri)
-                with dev._stats.output.time():
+                with dev.stats.output.time():
                     self.ser.write("\x60" + chr(self._devCommandNum[dev.uri]))
                     dev.sendOutput(stmtsForDev, self.ser.write, self.ser.read)
                     if self.ser.read(1) != 'k':
--- a/service/arduinoNode/config/bang.n3	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/arduinoNode/config/bang.n3	Mon Sep 27 23:12:43 2021 -0700
@@ -46,8 +46,9 @@
 
 pin:d6 :connectedTo :storageCeilingLedLong .
 :storageCeilingLedLong a :LedOutput .
-  
-pin:d7 :connectedTo ow: .
+
+# too slow
+#pin:d7 :connectedTo ow: .
 ow: a :OneWire;
   :connectedTo ow:dev-1052790f02080086, ow:dev-2809b8a503000035 .
 ow:dev-1052790f02080086 a :TemperatureSensor;
--- a/service/arduinoNode/devices.py	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/arduinoNode/devices.py	Mon Sep 27 23:12:43 2021 -0700
@@ -42,13 +42,13 @@
 
     # subclasses may add args to this
     def __init__(self, graph, uri, pinNumber):
-        scales.init(self, self.__class__.__name__)
-        self._stats = scales.collection(self.__class__.__name__,
-                                        scales.PmfStat('poll'),
-                                        scales.PmfStat('output'),
-        )
         self.graph, self.uri = graph, uri
         self.pinNumber = pinNumber
+        scales.init(self, self.__class__.__name__)
+        self.stats = scales.collection(self.__class__.__name__,
+                                       scales.PmfStat('poll'),
+                                       scales.PmfStat('output'),
+        )
         self.hostStateInit()
 
     def hostStateInit(self):
--- a/service/arduinoNode/pushConfig.py	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/arduinoNode/pushConfig.py	Mon Sep 27 23:12:43 2021 -0700
@@ -4,7 +4,7 @@
 
 from twisted.python.filepath import FilePath
 
-etcd = etcd3.client(host='bang', port=9022)
+etcd = etcd3.client(host='etcd-homeauto', port=9022)
 
 prefix, = sys.argv[1:]
 
--- a/service/environment/index.html	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/environment/index.html	Mon Sep 27 23:12:43 2021 -0700
@@ -2,33 +2,17 @@
 <html>
   <head>
     <title>environment</title>
-    <meta charset="utf-8" />
-    <script src="/lib/polymer/1.0.9/webcomponentsjs/webcomponents.min.js"></script>
-    <script src="/lib/require/require-2.3.3.js"></script>
-    <script src="/rdf/common_paths_and_ns.js"></script>
+    <meta charset="utf-8">
+    <script src="/lib/webcomponents/2.4.0/webcomponents-bundle.js"></script>
 
-    <link rel="import" href="/rdf/streamed-graph.html">
-    <link rel="import" href="/lib/polymer/1.0.9/polymer/polymer.html">
-
+    <script type="module" src="/rdf/streamed-graph.bundle.js"></script>
+    <link rel="stylesheet" href="/rdf/streamed-graph.css">
     <meta name="mobile-web-app-capable" content="yes">
     <meta name="viewport" content="width=device-width, initial-scale=1">
   </head>
-  <body>
-    <template id="t" is="dom-bind">
-      <streamed-graph url="graph/events" graph="{{graph}}"></streamed-graph>
-      <div id="out"></div>
-      <script type="module" src="/rdf/streamed_graph_view.js"></script>
-    </template>
-    <style>
-     .served-resources {
-         margin-top: 4em;
-         border-top: 1px solid gray;
-         padding-top: 1em;
-     }
-     .served-resources a {
-         padding-right: 2em;
-     }
-    </style>
+  <body class="rdfBrowsePage">
+      <streamed-graph url="graph/events" expanded="true"></streamed-graph>
+
 
       <div class="served-resources">
         <a href="stats/">/stats/</a>
--- a/service/environment/twilight.py	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/environment/twilight.py	Mon Sep 27 23:12:43 2021 -0700
@@ -6,7 +6,7 @@
 which I found via http://www.perceptiveautomation.com/userforum/viewtopic.php?t=8627&p=54621
 """
 _src = """
-       Jan.       Feb.       Mar.       Apr.       May        June       July       Aug.       Sept.      Oct.       Nov.       Dec.  
+       Jan.       Feb.       Mar.       Apr.       May        June       July       Aug.       Sept.      Oct.       Nov.       Dec.
 Day Begin End  Begin End  Begin End  Begin End  Begin End  Begin End  Begin End  Begin End  Begin End  Begin End  Begin End  Begin End
      h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m   h m  h m
 01  0656 1731  0646 1801  0614 1830  0528 1859  0445 1929  0419 1957  0421 2007  0445 1947  0513 1905  0539 1818  0608 1738  0638 1720
--- a/service/rdf_to_mqtt/index.html	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/rdf_to_mqtt/index.html	Mon Sep 27 23:12:43 2021 -0700
@@ -71,6 +71,15 @@
       <div><button data-post="output?s=:bedHeadboard&p=:color" data-body="#0000ff">headboard blue</button></div>
     </section>
     <section>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#ffffff">asher bed bar white</button></div>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#000000">asher bed bar black</button></div>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#ff0000">asher bed bar red 1</button></div>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#880000">asher bed bar red .5</button></div>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#440000">asher bed bar red .25</button></div>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#00ff00">asher bed bar green</button></div>
+      <div><button data-post="output?s=:asherBedBar&p=:color" data-body="#0000ff">asher bed bar blue</button></div>
+    </section>
+    <section>
       <div><button data-post="output?s=:frontRoom1&p=:color" data-body="0*3200K">Send (:frontRoom1 :color black)</button></div>
       <div><button data-post="output?s=:frontRoom1&p=:color" data-body="1*3200K">Send (:frontRoom1 :color white)</button></div>
     </section>
@@ -79,27 +88,28 @@
       <div><button data-post="output?s=:frontRoom2&p=:color" data-body="1*3200K">Send (:frontRoom2 :color white)</button></div>
     </section>
     <section>
-      <section>
-        <div><button data-post="output?s=:asherCeiling&p=:color" data-body="0*3200K">Send (:asherCeiling :color black)</button></div>
-        <div><button data-post="output?s=:asherCeiling&p=:color" data-body="1*3200K">Send (:asherCeiling :color white)</button></div>
-      </section>
-      <section>
-        <div><button data-post="output?s=:noname1&p=:color" data-body="0*3200K">Send (:noname1 :color black)</button></div>
-        <div><button data-post="output?s=:noname1&p=:color" data-body="1*3200K">Send (:noname1 :color white)</button></div>
-      </section>
-      <section>
-        <div><button data-post="output?s=:noname2&p=:color" data-body="0*3200K">Send (:noname2 :color black)</button></div>
-        <div><button data-post="output?s=:noname2&p=:color" data-body="1*3200K">Send (:noname2 :color white)</button></div>
-      </section>
-      <section>
-        <div><button data-post="output?s=:noname3&p=:color" data-body="0*3200K">Send (:noname3 :color black)</button></div>
-        <div><button data-post="output?s=:noname3&p=:color" data-body="1*3200K">Send (:noname3 :color white)</button></div>
-      </section>
-      <section>
-        <div><button data-post="output?s=:noname4&p=:color" data-body="0*3200K">Send (:noname4 :color black)</button></div>
-        <div><button data-post="output?s=:noname4&p=:color" data-body="1*3200K">Send (:noname4 :color white)</button></div>
-      </section>
-          
+      <div><button data-post="output?s=:asherCeiling&p=:color" data-body="0*3200K">Send (:asherCeiling :color black)</button></div>
+      <div><button data-post="output?s=:asherCeiling&p=:color" data-body=".2*3200K">asherCeiling dim  </button></div>
+      <div><button data-post="output?s=:asherCeiling&p=:color" data-body="1*3200K">Send (:asherCeiling :color white)</button></div>
+    </section>
+    <section>
+      <div><button data-post="output?s=:noname1&p=:color" data-body="0*3200K">Send (:noname1 :color black)</button></div>
+      <div><button data-post="output?s=:noname1&p=:color" data-body="1*3200K">Send (:noname1 :color white)</button></div>
+    </section>
+    <section>
+      <div><button data-post="output?s=:noname2&p=:color" data-body="0*3200K">Send (:noname2 :color black)</button></div>
+      <div><button data-post="output?s=:noname2&p=:color" data-body="1*3200K">Send (:noname2 :color white)</button></div>
+    </section>
+    <section>
+      <div><button data-post="output?s=:noname3&p=:color" data-body="0*3200K">Send (:noname3 :color black)</button></div>
+      <div><button data-post="output?s=:noname3&p=:color" data-body="1*3200K">Send (:noname3 :color white)</button></div>
+    </section>
+    <section>
+      <div><button data-post="output?s=:noname4&p=:color" data-body="0*3200K">Send (:noname4 :color black)</button></div>
+      <div><button data-post="output?s=:noname4&p=:color" data-body="1*3200K">Send (:noname4 :color white)</button></div>
+    </section>
+    
+    <section>
       <div><button data-post="output?s=:stairTop&p=:color" data-body="0*2200K">Send (:stairTop :color black)</button></div>
       <div><button data-post="output?s=:stairTop&p=:color" data-body="1*200K">Send (:stairTop :color white 200K)</button></div>
       <div><button data-post="output?s=:stairTop&p=:color" data-body="1*1200K">Send (:stairTop :color white)</button></div>
--- a/service/rdf_to_mqtt/rdf_to_mqtt.py	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/rdf_to_mqtt/rdf_to_mqtt.py	Mon Sep 27 23:12:43 2021 -0700
@@ -36,26 +36,11 @@
         'root': 'h801_counter',
         'hasWhite': True,
     },
-    ROOM['livingLampShelf']: {
-        'root': 'sonoff_0/switch/sonoff_basic_relay/command',
-        'values': 'binary',
-    },
-    ROOM['livingLampMantleEntry']: {
-        'root': 'sonoff_1/switch/sonoff_basic_relay/command',
-        'values': 'binary',
-    },
-    ROOM['livingLampMantleChair']: {
-        'root': 'sonoff_2/switch/sonoff_basic_relay/command',
-        'values': 'binary',
-    },
-    ROOM['livingLampToyShelf']: {
-        'root': 'sonoff_3/switch/sonoff_basic_relay/command',
-        'values': 'binary',
-    },
-    ROOM['livingLampPiano']: {
-        'root': 'sonoff_4/switch/sonoff_basic_relay/command',
-        'values': 'binary',
-    },
+    ROOM['livingLampShelf']:       { 'root': 'sonoff_0/switch/sonoff_basic_relay/command', 'values': 'binary', },
+    ROOM['livingLampMantleEntry']: { 'root': 'sonoff_1/switch/sonoff_basic_relay/command', 'values': 'binary', },
+    ROOM['livingLampMantleChair']: { 'root': 'sonoff_2/switch/sonoff_basic_relay/command', 'values': 'binary', },
+    ROOM['livingLampToyShelf']:    { 'root': 'sonoff_3/switch/sonoff_basic_relay/command', 'values': 'binary', },
+    ROOM['livingLampPiano']:       { 'root': 'sonoff_4/switch/sonoff_basic_relay/command', 'values': 'binary', },
     ROOM['theater']: {
         'root': 'theater_blaster/ir_out',
         'values': 'theaterOutputs',
@@ -65,38 +50,15 @@
         'hasWhite': True,
     },
     # https://github.com/Koenkk/zigbee2mqtt.io/blob/new_api/docs/information/mqtt_topics_and_message_structure.md#general
-    ROOM['frontRoom1']: {
-        'root': 'zigbee2mqtt/frontRoom1/set',
-        'hasBrightness': True,
-        'defaults': {
-            'transition': 0,
-        }
-    },
-    ROOM['frontRoom2']: {
-        'root': 'zigbee2mqtt/frontRoom2/set',
-        'hasBrightness': True,
-        'defaults': {
-            'transition': 0,
-        }
-    },
-    ROOM['asherCeiling']: {
-        'root': 'zigbee2mqtt/asherCeiling/set',
-        'hasBrightness': True,
-        'defaults': {
-            'transition': 0,
-        }
-    },
-    ROOM['stairTop']: {
-        'root': 'zigbee2mqtt/stairTop/set',
-        'hasBrightness': True,
-        'defaults': {
-            'transition': 0,
-        }
-    },
-    ROOM['noname1']: { 'root': 'zigbee2mqtt/0xf0d1b8000001ffc6/set', 'hasBrightness': True, 'defaults': { 'transition': 0, } },
-    ROOM['noname2']: { 'root': 'zigbee2mqtt/0xf0d1b80000023583/set', 'hasBrightness': True, 'defaults': { 'transition': 0, } },
-    ROOM['noname3']: { 'root': 'zigbee2mqtt/0xf0d1b80000023708/set', 'hasBrightness': True, 'defaults': { 'transition': 0, } },
-    ROOM['noname4']: { 'root': 'zigbee2mqtt/0xf0d1b80000022adc/set', 'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['frontRoom1']:   { 'root': 'zigbee-dash/frontRoom1/set',             'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['frontRoom2']:   { 'root': 'zigbee-dash/frontRoom2/set',             'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['asherCeiling']: { 'root': 'zigbee-frontbed/0xf0d1b80000022c86/set', 'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['asherBedBar']:  { 'root': 'bed_bar_asher/light/rgb/command',        'hasBrightness': True, 'defaults': {}},
+    ROOM['stairTop']:     { 'root': 'zigbee-dash/stairTop/set',               'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['noname1']:      { 'root': 'zigbee-bang/0xf0d1b8000001ffc6/set',     'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['noname2']:      { 'root': 'zigbee-bang/0xf0d1b80000023583/set',     'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['noname3']:      { 'root': 'zigbee-bang/0xf0d1b80000023708/set',     'hasBrightness': True, 'defaults': { 'transition': 0, } },
+    ROOM['noname4']:      { 'root': 'zigbee-bang/0xf0d1b80000022adc/set',     'hasBrightness': True, 'defaults': { 'transition': 0, } },
 }
 
 
@@ -138,7 +100,7 @@
                 if h.endswith(b'K'):  # accept "0.7*2200K" (brightness 0.7)
                     # see https://www.zigbee2mqtt.io/information/mqtt_topics_and_message_structure.html#zigbee2mqttfriendly_nameset
                     bright, kelvin = map(float, h[:-1].split(b'*'))
-                    msg['state'] = 'ON'                    
+                    msg['state'] = 'ON'
                     msg["color_temp"] = round(1000000 / kelvin, 2)
                     msg['brightness'] = int(bright * 255)  # 1..20 look about the same
                 else:
@@ -150,6 +112,7 @@
                             'g': g,
                             'b': b
                         },
+                        'brightness': max(r, g, b),
                     }
 
                     if attrs.get('hasWhite', False):
--- a/service/reasoning/index.html	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/reasoning/index.html	Mon Sep 27 23:12:43 2021 -0700
@@ -49,6 +49,9 @@
         <button data-url="oneShot" data-body=":frontBedPostSwitch3 :buttonState :press .">asher bed post 3</button>
         <button data-url="oneShot" data-body=":frontBedPostSwitch4 :buttonState :press .">asher bed post 4</button>
         <button data-url="oneShot" data-body=":frontBedPostSwitch5 :buttonState :press .">asher bed post 5</button>
+        <button data-url="oneShot" data-body=":changingCam :grab <http://bang:9057/snapshot/changing-day.jpg> .">changingCam/day</button>
+        <button data-url="oneShot" data-body=":changingCam :grab <http://bang:9057/snapshot/changing-night.jpg> .">changingCam/night</button>
+
         <script>
          Array.from(document.querySelectorAll("button[data-url]")).forEach((el) => {
            el.addEventListener("click", (ev) => {
--- a/service/reasoning/inference.py	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/reasoning/inference.py	Mon Sep 27 23:12:43 2021 -0700
@@ -2,8 +2,8 @@
 see ./reasoning for usage
 """
 
-import contextlib
 import os
+import logging
 
 from prometheus_client import Summary
 from rdflib import Graph, Namespace
@@ -12,6 +12,8 @@
 
 from escapeoutputstatements import escapeOutputStatements
 
+log = logging.getLogger()
+
 READ_RULES_CALLS = Summary('read_rules_calls', 'calls')
 
 ROOM = Namespace("http://projects.bigasterisk.com/room/")
@@ -77,8 +79,10 @@
 
     implied = ConjunctiveGraph()
 
+    bailout_iterations = 100
     delta = 1
-    while delta > 0:
+    while delta > 0 and bailout_iterations > 0:
+        bailout_iterations -= 1
         delta = -len(implied)
 
         for r in rules:
@@ -102,42 +106,3 @@
     for st in implied:
         log.info(f'  {st}')
     return implied
-
-    # based on fuxi/tools/rdfpipe.py
-    target = Graph()
-    tokenSet = generateTokenSet(graph)
-    with _dontChangeRulesStore(rules):
-        network = ReteNetwork(rules, inferredTarget=target)
-        network.feedFactsToAdd(tokenSet)
-
-    return target
-
-
-@contextlib.contextmanager
-def _dontChangeRulesStore(rules):
-    if not hasattr(rules, '_stashOriginalRules'):
-        rules._stashOriginalRules = rules.rules[:]
-    yield
-    for k in list(rules.formulae.keys()):
-        if not k.startswith('_:Formula'):
-            del rules.formulae[k]
-    rules.rules = rules._stashOriginalRules[:]
-
-
-import logging
-import time
-
-log = logging.getLogger()
-
-
-def logTime(func):
-
-    def inner(*args, **kw):
-        t1 = time.time()
-        try:
-            ret = func(*args, **kw)
-        finally:
-            log.info("Call to %s took %.1f ms" % (func.__name__, 1000 * (time.time() - t1)))
-        return ret
-
-    return inner
--- a/service/store/serv.n3	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/store/serv.n3	Mon Sep 27 23:12:43 2021 -0700
@@ -9,6 +9,7 @@
       :internalPort 10015;
       :prodDockerFlags (
       "-p" "10015:10015"
+      "-v" "/opt/homeauto_store:/opt/homeauto_store"
       "--net=host"
       );
       :localDockerFlags (
--- a/service/tinyScreen/index.html	Mon Sep 27 23:15:33 2021 -0700
+++ b/service/tinyScreen/index.html	Mon Sep 27 23:12:43 2021 -0700
@@ -1,10 +1,16 @@
 <!doctype html>
 <html>
   <head>
-    <title></title>
-    <meta charset="utf-8" />
+    <title>tiny screen</title>
+    <meta charset="utf-8">
+    <script src="/lib/polymer/1.0.9/webcomponentsjs/webcomponents.min.js"></script>
+    <script src="/lib/require/require-2.3.3.js"></script>
+    <script src="/rdf/common_paths_and_ns.js"></script>
+
+    <link rel="stylesheet" href="/rdf/browse/style.css">
+
   </head>
-  <body>
+  <body class="rdfBrowsePage">
 
     request state:   boot sleep locked lockedUnknownKey unlockNews
     goal state: