Exemple #1
0
    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))
Exemple #2
0
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})
Exemple #3
0
    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)
Exemple #4
0
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)
Exemple #5
0
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))
Exemple #7
0
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)
Exemple #8
0
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()
Exemple #9
0
 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)})
Exemple #10
0
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()
Exemple #11
0
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
Exemple #13
0
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)
Exemple #14
0
    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
Exemple #15
0
    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)
Exemple #16
0
    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})
Exemple #17
0
 def get(self, location):
     location = Location(id=location)
     return render_template("locations/floorplan.html", location=location)
Exemple #18
0
def location_data(location_id):
    loc = Location(id=location_id)
    data = loc.get_interface_data(g.INFLUX)
    return jsonify({'location':loc.json(), 'data':data})
Exemple #19
0
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})
Exemple #21
0
 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]})
Exemple #22
0
 def get(self, location):
     loc = Location(id=location)
     return render_template("locations/property.html",
                            loc=loc,
                            Location=Location)