Mercurial > code > home > repos > homeauto
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: