def post(self): vals = {} for k, v in request.form.iteritems(): base = vals keys = k.split(".") for i in range(len(keys) - 1): base = base.setdefault(keys[i], {}) base[keys[len(keys) - 1]] = v loc_data = vals.pop("location") id = loc_data.pop("_id") if id: loc = Location(id=id) loc._map(loc_data) else: loc = Location(data=loc_data) for k, v in vals.iteritems(): if not v.get('_enabled'): v['_enabled'] = False for i in loc.interfaces: inter = i.interface if inter.__class__.__name__ == k: inter._map(v) inter.save() break else: i = interfaces.get(k)(data=v) i.save() li = LocationInterface() li.interface = i loc.interfaces.append(li) loc.save() logging.info(loc.json()) flash("Saved!", "success") return redirect(url_for('.location', id=loc._id))
def location_beacon(location_id): loc = Location(id=location_id) gb = loc.get_interface('GimbalBeacon') try: data = request.get_json() except: data = {} logging.info("Test: {}".format(data)) logging.info(gb) try: gb.go(g.INFLUX, g.MQ, data=data) gb._last_run = datetime.utcnow() gb.save() except Exception as e: logging.error(e.message) return jsonify({'success':True})
def get(self, id=None): if id: loc = Location(id=id) ints = { interface.interface.__class__.__name__: interface.interface for interface in loc.interfaces } for k, v in interfaces.iteritems(): if not ints.get(k): ints.update({k: v()}) else: loc = Location() ints = {key: value() for (key, value) in interfaces.iteritems()} return render_template("locations/create.html", location=loc, interfaces=ints)
def get_locations(): locs = [] for loc in Location.find(): j = loc.json() net = loc.get_interface('NetAtmo') j['current'] = net.get_current(g.INFLUX) if net else {} locs.append(j) return jsonify(locs)
def post(self): vals = {} for k,v in request.form.iteritems(): base = vals keys = k.split(".") for i in range(len(keys)-1): base = base.setdefault(keys[i], {}) base[keys[len(keys)-1]] = v loc_data = vals.pop("location") id = loc_data.pop("_id") if id: loc = Location(id=id) loc._map(loc_data) else: loc = Location(data=loc_data) for k,v in vals.iteritems(): if not v.get('_enabled'): v['_enabled'] = False for i in loc.interfaces: inter = i.interface if inter.__class__.__name__ == k: inter._map(v) inter.save() break else: i = interfaces.get(k)(data=v) i.save() li = LocationInterface() li.interface = i loc.interfaces.append(li) loc.save() logging.info(loc.json()) flash("Saved!", "success") return redirect(url_for('.location', id=loc._id))
def ping_node(): for loc in Location.find(): try: n = loc.get_interface('Node') if n.id: logging.info("Pinging Node: {}".format(n.id)) n.publish(MQTT, "6,1") time.sleep(1) n.publish(MQTT, "6,0") time.sleep(1) except Exception as e: logging.error(e)
def run_interfaces(): for loc in Location.find(): try: logging.info("Monitoring Location: {}".format(loc.name)) for i in loc.interfaces: logging.info("Running Interface: {}".format(i.interface.__class__.__name__)) try: i.interface.run(INFLUX, MQ) except Exception as e: logging.error(e) logging.info("Finished Interface: {}".format(i.interface.__class__.__name__)) except Exception as e: logging.error(e) MQ.release()
def post(self, location): location = Location(id=location) logging.info("Level: {} | X:{}, Y:{} | Beacon: {}".format( request.form.get('level'), request.form.get('x'), request.form.get('y'), request.form.get('beacon_id'))) b = Beacon.find_one({'id': request.form.get('beacon_id')}) if not b: b = Beacon() b.x = request.form.get('x') b.y = request.form.get('y') b.id = request.form.get('beacon_id') b.level = request.form.get('level') b.location = location b.save() return jsonify({'success': True, 'id': str(b._id)})
def run_interfaces(): for loc in Location.find(): try: logging.info("Monitoring Location: {}".format(loc.name)) for i in loc.interfaces: if i.interface._enabled: logging.info("Running Interface: {}".format(i.interface.__class__.__name__)) try: i.interface.run(INFLUX, MQ) except Exception as e: logging.error(e) logging.info("Finished Interface: {}".format(i.interface.__class__.__name__)) except Exception as e: logging.error(e) MQ.release()
def compare_tlc(): diffs = {} for l in Location.find(): vibes = l.tlc if isinstance(vibes, dict): for k,v in vibes.iteritems(): if not isinstance(v,float): continue a = diffs.setdefault(k, {'min':999999, 'max':0}) if v > a['max']: a['max'] = v if v < a['min']: a['min'] = v largest = {k:(v['max']-v['min']) for k,v in diffs.iteritems()} largest = sorted(largest.items(), cmp=lambda x,y: cmp(x[1], y[1]), reverse=True) return largest
def run(self, message): logging.info(message) location = Location.find_one({'interfaces.interface.id':ObjectId(message['tags']['interface'])}) val = message['fields']['value'] if val > 550: fiveminsago = datetime.utcnow()-timedelta(minutes=5) if fiveminsago > self.last_run: self.post(val) self.turn_light_on(location) raise TriggerEnabled(level=1) elif val < 550: fiveminsago = datetime.utcnow()-timedelta(minutes=5) if fiveminsago > self.last_run: self.turn_light_off(location) raise TriggerDisabled() return False
def location_current(location_id): loc = Location(id=location_id) ret = {} for i in loc.interfaces: inter = i._get('interface')._value.get('cls').split(".")[-1] if inter == "NetAtmo": r = i.interface.get_current(g.INFLUX) for k, v in r.iteritems(): if k in [ 'netatmo.indoor.temperature', 'netatmo.indoor.humidity', 'netatmo.indoor.co2' ]: ret[k.split(".")[-1]] = v['current'][0]['value'] logging.info(ret) break return jsonify(ret)
def run(self, message): logging.info(message) location = Location.find_one({ 'interfaces.interface.id': ObjectId(message['tags']['interface']) }) val = message['fields']['value'] if val > 550: fiveminsago = datetime.utcnow() - timedelta(minutes=5) if fiveminsago > self.last_run: self.post(val) self.turn_light_on(location) raise TriggerEnabled(level=1) elif val < 550: fiveminsago = datetime.utcnow() - timedelta(minutes=5) if fiveminsago > self.last_run: self.turn_light_off(location) raise TriggerDisabled() return False
def get(self, location, interface): loc = Location(id=location) aq = {} power = {} cost = {} last = datetime.utcnow() - timedelta(hours=30) for l in loc.interfaces: n = l._get('interface')._value.get('cls').split(".")[-1] if n == interface: aq = l.interface.get_long_history(db=g.INFLUX, _from="12d") if n in ['EnergyGateway', 'HomeEnergyMonitor']: if l.interface._last_run and l.interface._last_run > last: last = l.interface._last_run power = l.interface.get_long_history(db=g.INFLUX, _from="12d") if n in ['RTTP']: cost = l.interface.get_long_history(db=g.INFLUX, _from="12d") return render_template("locations/widgets/{}.html".format(interface), data=aq, power=power, interface=interface, cost=cost)
def get(self): locations = [loc for loc in Location.find()] interfaces = [ EnergyGateway, NetAtmo, HomeEnergyMonitor, Presence, Node, UPS, Wunderground, RTTP, PhilipsHue ] exchanges = [ Exchanges.node, Exchanges.energy, Exchanges.weather, Exchanges.presence, Exchanges.everything ] final = ['Clients', 'Triggers', 'Federation'] fnodes = [] links = [] res = g.INFLUX.query("SHOW MEASUREMENTS") measurements = [i for i in res.items()[0][1]] for f in final: add_node(fnodes, { 'name': f, 'id': "final.{}".format(f), 'type': 'final', }) for m in measurements: add_node(fnodes, { 'name': m['name'].split(".")[-1], 'id': "data.{}".format(m['name'].split(".")[-1]), 'type': 'data', 'startswith': [m['name']], }, startswith=m['name']) for i in interfaces: add_node( fnodes, { 'name': i.__name__, 'id': "interface.{}.{}".format(i.exchange.name, i.__name__), 'type': 'interface', }) for e in exchanges: add_node( fnodes, { 'name': e.name, 'id': "exchange.{}".format(e.name), 'type': 'exchange', }) ev_id = get_node_index(fnodes, 'exchange.everything') for loc in locations: add_node(fnodes, { 'name': loc.name, 'id': str(loc._id), 'type': 'location' }) add_link( links, { 'source': len(fnodes) - 1, 'target': get_node_index(fnodes, 'interface.presence.Presence'), 'value': .01 }) for i in loc.interfaces: if not i.interface._last_run: continue e_name = i.interface.exchange.name i_index = get_node_index( fnodes, "interface.{}.{}".format(e_name, i.interface.__class__.__name__)) e_id = get_node_index(fnodes, "exchange.{}".format(e_name)) add_link(links, { 'source': len(fnodes) - 1, 'target': i_index, 'value': .01, }) data_points = get_indexes_startswith( fnodes, i.interface.measurement_key) for dp in data_points: add_link(links, { 'source': i_index, 'target': dp, 'value': .01 }) add_link(links, { 'source': dp, 'target': e_id, 'value': .01 }) add_link(links, { 'source': dp, 'target': ev_id, 'value': .01 }) add_link( links, { 'source': get_node_index(fnodes, 'exchange.energy'), 'target': get_node_index(fnodes, 'final.Clients'), 'value': .01 }) add_link( links, { 'source': get_node_index(fnodes, 'exchange.presence'), 'target': get_node_index(fnodes, 'final.Clients'), 'value': .01 }) add_link( links, { 'source': get_node_index(fnodes, 'exchange.node'), 'target': get_node_index(fnodes, 'final.Clients'), 'value': .01 }) add_link( links, { 'source': get_node_index(fnodes, 'exchange.weather'), 'target': get_node_index(fnodes, 'final.Clients'), 'value': .01 }) add_link( links, { 'source': get_node_index(fnodes, 'exchange.everything'), 'target': get_node_index(fnodes, 'final.Triggers'), 'value': .01 }) add_link( links, { 'source': get_node_index(fnodes, 'exchange.everything'), 'target': get_node_index(fnodes, 'final.Federation'), 'value': .01 }) io = get_node_index(fnodes, 'data.inoffice') if not io: add_node(fnodes, { 'name': 'inoffice', 'id': 'data.inoffice', 'type': 'data' }) io = len(fnodes) - 1 add_link( links, { 'source': get_node_index(fnodes, 'interface.presence.Presence'), 'target': io, 'value': .01 }) add_link( links, { 'source': io, 'target': get_node_index(fnodes, 'exchange.presence'), 'value': .01 }) add_link(links, {'source': io, 'target': ev_id, 'value': .01}) return jsonify({'nodes': fnodes, 'links': links})
def get(self, location): location = Location(id=location) return render_template("locations/floorplan.html", location=location)
def location_data(location_id): loc = Location(id=location_id) data = loc.get_interface_data(g.INFLUX) return jsonify({'location':loc.json(), 'data':data})
def location_data(location_id): loc = Location(id=location_id) data = loc.get_interface_data(g.INFLUX) return jsonify({'location': loc.json(), 'data': data})
def get(self): locations = [loc for loc in Location.find()] interfaces = [EnergyGateway, NetAtmo, HomeEnergyMonitor, Presence, Node, UPS, Wunderground, RTTP, PhilipsHue] exchanges = [Exchanges.node, Exchanges.energy, Exchanges.weather, Exchanges.presence, Exchanges.everything] final = ["Clients", "Triggers", "Federation"] fnodes = [] links = [] res = g.INFLUX.query("SHOW MEASUREMENTS") measurements = [i for i in res.items()[0][1]] for f in final: add_node(fnodes, {"name": f, "id": "final.{}".format(f), "type": "final"}) for m in measurements: add_node( fnodes, { "name": m["name"].split(".")[-1], "id": "data.{}".format(m["name"].split(".")[-1]), "type": "data", "startswith": [m["name"]], }, startswith=m["name"], ) for i in interfaces: add_node( fnodes, {"name": i.__name__, "id": "interface.{}.{}".format(i.exchange.name, i.__name__), "type": "interface"}, ) for e in exchanges: add_node(fnodes, {"name": e.name, "id": "exchange.{}".format(e.name), "type": "exchange"}) ev_id = get_node_index(fnodes, "exchange.everything") for loc in locations: add_node(fnodes, {"name": loc.name, "id": str(loc._id), "type": "location"}) add_link( links, { "source": len(fnodes) - 1, "target": get_node_index(fnodes, "interface.presence.Presence"), "value": 0.01, }, ) for i in loc.interfaces: if not i.interface._last_run: continue e_name = i.interface.exchange.name i_index = get_node_index(fnodes, "interface.{}.{}".format(e_name, i.interface.__class__.__name__)) e_id = get_node_index(fnodes, "exchange.{}".format(e_name)) add_link(links, {"source": len(fnodes) - 1, "target": i_index, "value": 0.01}) data_points = get_indexes_startswith(fnodes, i.interface.measurement_key) for dp in data_points: add_link(links, {"source": i_index, "target": dp, "value": 0.01}) add_link(links, {"source": dp, "target": e_id, "value": 0.01}) add_link(links, {"source": dp, "target": ev_id, "value": 0.01}) add_link( links, { "source": get_node_index(fnodes, "exchange.energy"), "target": get_node_index(fnodes, "final.Clients"), "value": 0.01, }, ) add_link( links, { "source": get_node_index(fnodes, "exchange.presence"), "target": get_node_index(fnodes, "final.Clients"), "value": 0.01, }, ) add_link( links, { "source": get_node_index(fnodes, "exchange.node"), "target": get_node_index(fnodes, "final.Clients"), "value": 0.01, }, ) add_link( links, { "source": get_node_index(fnodes, "exchange.weather"), "target": get_node_index(fnodes, "final.Clients"), "value": 0.01, }, ) add_link( links, { "source": get_node_index(fnodes, "exchange.everything"), "target": get_node_index(fnodes, "final.Triggers"), "value": 0.01, }, ) add_link( links, { "source": get_node_index(fnodes, "exchange.everything"), "target": get_node_index(fnodes, "final.Federation"), "value": 0.01, }, ) io = get_node_index(fnodes, "data.inoffice") if not io: add_node(fnodes, {"name": "inoffice", "id": "data.inoffice", "type": "data"}) io = len(fnodes) - 1 add_link(links, {"source": get_node_index(fnodes, "interface.presence.Presence"), "target": io, "value": 0.01}) add_link(links, {"source": io, "target": get_node_index(fnodes, "exchange.presence"), "value": 0.01}) add_link(links, {"source": io, "target": ev_id, "value": 0.01}) return jsonify({"nodes": fnodes, "links": links})
def get(self, location, level): loc = Location(id=location) beacons = Beacon.find({'location': loc._id, 'level': int(level)}) logging.info(beacons) return jsonify({'beacons': [b.json() for b in beacons]})
def get(self, location): loc = Location(id=location) return render_template("locations/property.html", loc=loc, Location=Location)