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)))
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)))
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)
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)
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
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)))
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
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
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
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
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
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)))
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)))