示例#1
0
文件: o2s.py 项目: padelt/pista
def on_obd2(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    if not storage:
        return

    basetopic, suffix = tsplit(msg.topic)

    args = suffix.split('/')    # ['obd2', '000007e8', '01', '49']

    canid = args[1]
    mode  = args[2]
    pid   = None
    if len(args) > 3:
        pid = args[3]

    log.debug("_obd2: {0} {1}".format(msg.topic, msg.payload))
    watcher(mosq, msg.topic, msg.payload)
    try:
        data = {
            'topic'  : msg.topic,
            'tst'    : time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(int(time.time()))),
            'payload' : msg.payload,
            'canid'   : canid,
            'mode'    : mode,
            'pid'     : pid,
        }
        ob = Obd2(**data)
        ob.save()
    except Exception, e:
        log.error("Cannot store OBD2 for topic {0}: {1}".format(msg.topic, str(e)))
示例#2
0
def on_fms(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    if not storage:
        return

    basetopic, suffix = tsplit(msg.topic)

    log.debug("_fms: {0} {1}".format(msg.topic, msg.payload))
    watcher(mosq, msg.topic, msg.payload)
    try:
        data = {
            'topic':
            msg.topic,
            'tst':
            time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(int(time.time()))),
            'payload':
            msg.payload,
        }
        fm = Fms(**data)
        fm.save()
    except Exception, e:
        log.error("Cannot store FMS for topic {0}: {1}".format(
            msg.topic, str(e)))
示例#3
0
文件: o2s.py 项目: padelt/pista
def on_tell(mosq, userdata, msg):
    if msg.retain == 1 or len(msg.payload) == 0:
        return

    dispatch_table = {
        #FIXME 'ghash'     : t_ghash,      # _owntracks/o2s/ghash    K2=5
        'loglevel'  : t_loglevel,   # _owntracks/o2s/loglevel INFO
        'dump'      : t_dump,       # _owntracks/o2s/dump     devices
        'info'      : t_info,       # _owntracks/o2s/info     tid
        'imei'      : t_imei,       # _owntracks/o2s/imei     tid
        }

    payload = msg.payload

    orig_topic = msg.topic
    topic, cmd = tsplit(msg.topic, 2)  # "_owntracks/o2s/+"

    if cmd in dispatch_table:
        result = None
        try:
            result = dispatch_table[cmd]("xxx", payload)
        except Exception, e:
            result = "Tell: cmd {0} with val {1} failed: {2}".format(cmd, payload, str(e))
            log.error(result)
        bb = bytearray(result.encode('utf-8'))
        mosq.publish(orig_topic + '/out', bb, qos=2, retain=False)
示例#4
0
def on_tell(mosq, userdata, msg):
    if msg.retain == 1 or len(msg.payload) == 0:
        return

    dispatch_table = {
        #FIXME 'ghash'     : t_ghash,      # _owntracks/o2s/ghash    K2=5
        'loglevel': t_loglevel,  # _owntracks/o2s/loglevel INFO
        'dump': t_dump,  # _owntracks/o2s/dump     devices
        'info': t_info,  # _owntracks/o2s/info     tid
        'imei': t_imei,  # _owntracks/o2s/imei     tid
    }

    payload = msg.payload

    orig_topic = msg.topic
    topic, cmd = tsplit(msg.topic, 2)  # "_owntracks/o2s/+"

    if cmd in dispatch_table:
        result = None
        try:
            result = dispatch_table[cmd]("xxx", payload)
        except Exception, e:
            result = "Tell: cmd {0} with val {1} failed: {2}".format(
                cmd, payload, str(e))
            log.error(result)
        bb = bytearray(result.encode('utf-8'))
        mosq.publish(orig_topic + '/out', bb, qos=2, retain=False)
示例#5
0
文件: o2s.py 项目: padelt/pista
def device_name(topic, subtopic=None):
    ''' find base topic name from topic and subtopic. E.g. if
        topic == 'owntracks/gw/JP/start' and subtopic == '/start'
        return 'owntracks/gw/JP'
        '''

    base_topic, suffix = tsplit(topic)
    return base_topic
示例#6
0
def device_name(topic, subtopic=None):
    ''' find base topic name from topic and subtopic. E.g. if
        topic == 'owntracks/gw/JP/start' and subtopic == '/start'
        return 'owntracks/gw/JP'
        '''

    base_topic, suffix = tsplit(topic)
    return base_topic
示例#7
0
def on_start(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    log.debug("_start: {0} {1}".format(msg.topic, msg.payload))

    save_rawdata(msg.topic, msg.payload)
    watcher(mosq, msg.topic, msg.payload)

    imei = version = ""
    try:
        imei, version, tstamp = msg.payload.split(' ')
    except:
        log.error("Cannot split() on ../start")
        return

    startup_dt = None
    try:
        startup_dt = dateutil.parser.parse(tstamp)
    except:
        startup_dt = datetime.datetime.now()

    # Inventory must have base topic in it so that we can later associate TID
    # with the IMEI

    basetopic, suffix = tsplit(msg.topic)

    odo = 0
    try:
        inv = Inventory.get(Inventory.imei == imei)
        odo = int(inv.odo)

        try:
            inv.topic = basetopic
            inv.version = version
            inv.startup = startup_dt
            try:
                if basetopic in devices:
                    inv.tid = devices[basetopic]['tid']
            except:
                pass
            inv.tstamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
            inv.save()
        except Exception, e:
            raise
            log.error("DB error on UPDATE Inventory: {0}".format(str(e)))
    except Inventory.DoesNotExist:
        try:
            inv = Inventory(topic=basetopic,
                            imei=imei,
                            version=version,
                            startup=startup_dt)
            if basetopic in devices:
                inv.tid = devices[basetopic]['tid']
            inv.save()
        except Exception, e:
            log.error("DB error on SAVE Inventory: {0}".format(str(e)))
示例#8
0
文件: o2s.py 项目: padelt/pista
def on_start(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    log.debug("_start: {0} {1}".format(msg.topic, msg.payload))

    save_rawdata(msg.topic, msg.payload)
    watcher(mosq, msg.topic, msg.payload)

    imei = version = ""
    try:
        imei, version, tstamp = msg.payload.split(' ')
    except:
        log.error("Cannot split() on ../start")
        return

    startup_dt = None
    try:
        startup_dt = dateutil.parser.parse(tstamp)
    except:
        startup_dt = datetime.datetime.now()

    # Inventory must have base topic in it so that we can later associate TID
    # with the IMEI

    basetopic, suffix = tsplit(msg.topic)

    odo = 0
    try:
        inv = Inventory.get(Inventory.imei == imei)
        odo = int(inv.odo)

        try:
            inv.topic = basetopic
            inv.version = version
            inv.startup = startup_dt
            try:
                if basetopic in devices:
                    inv.tid = devices[basetopic]['tid']
            except:
                pass
            inv.tstamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
            inv.save()
        except Exception, e:
            raise
            log.error("DB error on UPDATE Inventory: {0}".format(str(e)))
    except Inventory.DoesNotExist:
        try:
            inv = Inventory(topic=basetopic, imei=imei, version=version, startup=startup_dt)
            if basetopic in devices:
                inv.tid = devices[basetopic]['tid']
            inv.save()
        except Exception, e:
            log.error("DB error on SAVE Inventory: {0}".format(str(e)))
示例#9
0
文件: o2s.py 项目: padelt/pista
def watcher(mosq, topic, data):

    watcher_topic = cf.g('features', 'watcher', None)
    if watcher_topic is None:
        return

    try:
        prefix, suffix = tsplit(topic)
        wt = watcher_topic.format(prefix) + "/" + suffix
    except Exception, e:
        log.error("Cannot format watcher_topic: {0}".format(str(e)))
        return
示例#10
0
def watcher(mosq, topic, data):

    watcher_topic = cf.g('features', 'watcher', None)
    if watcher_topic is None:
        return

    try:
        prefix, suffix = tsplit(topic)
        wt = watcher_topic.format(prefix) + "/" + suffix
    except Exception, e:
        log.error("Cannot format watcher_topic: {0}".format(str(e)))
        return
示例#11
0
文件: o2s.py 项目: padelt/pista
def on_job(mosq, userdata, msg):
    # ignore if 'activo' hasn't been enabled
    if cf.g('features', 'activo', False) == False:
        return

    # topic owntracks/gw/B2/proxy/jobs/[active|<jobid>]
    base_topic, suffix = tsplit(msg.topic)

    parts = suffix.split('/')

    # topic owntracks/user/device/proxy/jobs/[currentjob|active|<jobid>
    if len(parts) == 3:
        last_part = parts[len(parts) - 1]

        # suffix proxy/jobs/[currentjob|job<jobid>]
        if last_part == 'active':
            # handle this active job change event
            on_activejob(mosq, msg, base_topic)
        elif last_part == 'currentjob':
	    # skip current jobs w/o timestamp
            pass
        else:
            # update the job name list
            jobnames[int(last_part)] = msg.payload

    # topic owntracks/user/device/proxy/jobs/[job|place|machine]/<jobid>
    # topic owntracks/user/device/proxy/jobs/currentjob/<timestamp>
    elif len(parts) == 4:
        id_part = parts[len(parts) - 2]
        if id_part == 'currentjob':
            timestamp = long(parts[len(parts) - 1])
            on_currentjob(mosq, msg, base_topic, timestamp)
        elif id_part == 'job':
            job = int(parts[len(parts) - 1])
            jobnames[job] = msg.payload
        elif id_part == 'place':
            place = int(parts[len(parts) - 1])
            placeparts = msg.payload.split(' ')
            placenames[place] = placeparts[0]
        elif id_part == 'machine':
            machine = int(parts[len(parts) - 1])
            machineparts = msg.payload.split(' ')
            machinenames[machine] = machineparts[0]


    # topic owntracks/user/device/proxy/jobs/job/<jobid>/<taskid>
    elif len(parts) == 5:
        id_part = parts[len(parts) - 3]
        if id_part == 'job':
            job = int(parts[len(parts) - 2])
            task = int(parts[len(parts) - 1])
            tasknames[job*10000 + task] = msg.payload
示例#12
0
def on_job(mosq, userdata, msg):
    # ignore if 'activo' hasn't been enabled
    if cf.g('features', 'activo', False) == False:
        return

    # topic owntracks/gw/B2/proxy/jobs/[active|<jobid>]
    base_topic, suffix = tsplit(msg.topic)

    parts = suffix.split('/')

    # topic owntracks/user/device/proxy/jobs/[currentjob|active|<jobid>
    if len(parts) == 3:
        last_part = parts[len(parts) - 1]

        # suffix proxy/jobs/[currentjob|job<jobid>]
        if last_part == 'active':
            # handle this active job change event
            on_activejob(mosq, msg, base_topic)
        elif last_part == 'currentjob':
            # skip current jobs w/o timestamp
            pass
        else:
            # update the job name list
            jobnames[int(last_part)] = msg.payload

    # topic owntracks/user/device/proxy/jobs/[job|place|machine]/<jobid>
    # topic owntracks/user/device/proxy/jobs/currentjob/<timestamp>
    elif len(parts) == 4:
        id_part = parts[len(parts) - 2]
        if id_part == 'currentjob':
            timestamp = long(parts[len(parts) - 1])
            on_currentjob(mosq, msg, base_topic, timestamp)
        elif id_part == 'job':
            job = int(parts[len(parts) - 1])
            jobnames[job] = msg.payload
        elif id_part == 'place':
            place = int(parts[len(parts) - 1])
            placeparts = msg.payload.split(' ')
            placenames[place] = placeparts[0]
        elif id_part == 'machine':
            machine = int(parts[len(parts) - 1])
            machineparts = msg.payload.split(' ')
            machinenames[machine] = machineparts[0]

    # topic owntracks/user/device/proxy/jobs/job/<jobid>/<taskid>
    elif len(parts) == 5:
        id_part = parts[len(parts) - 3]
        if id_part == 'job':
            job = int(parts[len(parts) - 2])
            task = int(parts[len(parts) - 1])
            tasknames[job * 10000 + task] = msg.payload
示例#13
0
文件: o2s.py 项目: padelt/pista
def on_voltage(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    if not storage:
        return

    save_rawdata(msg.topic, msg.payload)
    watcher(mosq, msg.topic, msg.payload)

    basetopic, suffix = tsplit(msg.topic)
    key = basetopic.split('/')[-1]      # IMEI or TID

    vext = vbatt = None
    if suffix.endswith('voltage/ext'):
        try:
            vext = float(msg.payload)
            if basetopic in devices:
                devices[basetopic].update(dict(vext=vext))
        except:
            return

    if suffix.endswith('voltage/batt'):
        try:
            vbatt = float(msg.payload)
            if basetopic in devices:
                devices[basetopic].update(dict(vbatt=vbatt))
        except:
            return

    try:
        inv = Inventory.select().where(
                (Inventory.imei == key) | (Inventory.tid == key)
           ).get()
        try:
            if vext is not None:
                inv.vext = vext
            if vbatt is not None:
                inv.vbatt = vbatt
            inv.tstamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
            inv.save()
        except Exception, e:
            raise
            log.error("DB error on UPDATE Inventory in voltage: {0}".format(str(e)))
    except Inventory.DoesNotExist:
            pass
    except Exception, e:
        raise
        log.error("DB error on GET Inventory: {0}".format(str(e)))
        return
示例#14
0
def on_voltage(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    if not storage:
        return

    save_rawdata(msg.topic, msg.payload)
    watcher(mosq, msg.topic, msg.payload)

    basetopic, suffix = tsplit(msg.topic)
    key = basetopic.split('/')[-1]  # IMEI or TID

    vext = vbatt = None
    if suffix.endswith('voltage/ext'):
        try:
            vext = float(msg.payload)
            if basetopic in devices:
                devices[basetopic].update(dict(vext=vext))
        except:
            return

    if suffix.endswith('voltage/batt'):
        try:
            vbatt = float(msg.payload)
            if basetopic in devices:
                devices[basetopic].update(dict(vbatt=vbatt))
        except:
            return

    try:
        inv = Inventory.select().where((Inventory.imei == key)
                                       | (Inventory.tid == key)).get()
        try:
            if vext is not None:
                inv.vext = vext
            if vbatt is not None:
                inv.vbatt = vbatt
            inv.tstamp = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
            inv.save()
        except Exception, e:
            raise
            log.error("DB error on UPDATE Inventory in voltage: {0}".format(
                str(e)))
    except Inventory.DoesNotExist:
        pass
    except Exception, e:
        raise
        log.error("DB error on GET Inventory: {0}".format(str(e)))
        return
示例#15
0
文件: o2s.py 项目: padelt/pista
def on_fms(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    if not storage:
        return

    basetopic, suffix = tsplit(msg.topic)

    log.debug("_fms: {0} {1}".format(msg.topic, msg.payload))
    watcher(mosq, msg.topic, msg.payload)
    try:
        data = {
            'topic'  : msg.topic,
            'tst'    : time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(int(time.time()))),
            'payload' : msg.payload,
        }
        fm = Fms(**data)
        fm.save()
    except Exception, e:
        log.error("Cannot store FMS for topic {0}: {1}".format(msg.topic, str(e)))
示例#16
0
def on_obd2(mosq, userdata, msg):
    if (skip_retained and msg.retain == 1) or len(msg.payload) == 0:
        return

    if not storage:
        return

    basetopic, suffix = tsplit(msg.topic)

    args = suffix.split('/')  # ['obd2', '000007e8', '01', '49']

    canid = args[1]
    mode = args[2]
    pid = None
    if len(args) > 3:
        pid = args[3]

    log.debug("_obd2: {0} {1}".format(msg.topic, msg.payload))
    watcher(mosq, msg.topic, msg.payload)
    try:
        data = {
            'topic':
            msg.topic,
            'tst':
            time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(int(time.time()))),
            'payload':
            msg.payload,
            'canid':
            canid,
            'mode':
            mode,
            'pid':
            pid,
        }
        ob = Obd2(**data)
        ob.save()
    except Exception, e:
        log.error("Cannot store OBD2 for topic {0}: {1}".format(
            msg.topic, str(e)))