def booted_node(self, msg): """Receieve and process a boot message object from the base station """ if msg.get_special() != Packets.SPECIAL: raise Exception("Corrupted packet - special is %02x not %02x" % (msg.get_special(), Packets.SPECIAL)) try: session = Session() current_time = datetime.utcnow() node_id = msg.getAddr() clustered = msg.get_clustered() version = msg.get_version() version = "".join([chr(i) for i in version]) node = session.query(Node).get(node_id) if node is None: add_node(session, node_id) b = NodeBoot(time=current_time, nodeId=node_id, clustered=clustered, version=version) session.add(b) session.flush() self.log.debug("boot: %s %s, %s, %s" % (current_time, node_id, clustered, version)) session.commit() except Exception as exc: session.rollback() self.log.exception("error during storing (boot): " + str(exc)) finally: session.close() return True
def store_state(self, msg): """ receive and process a message object from the base station """ if msg.get_special() != Packets.SPECIAL: raise Exception("Corrupted packet - special is %02x not %02x" % (msg.get_special(), Packets.SPECIAL)) try: session = Session() current_time = datetime.utcnow() node_id = msg.getAddr() parent_id = msg.get_ctp_parent_id() seq = msg.get_seq() rssi_val = msg.get_rssi() node = session.query(Node).get(node_id) loc_id = None if node is None: add_node(session, node_id) else: loc_id = node.locationId pack_state = PackState.from_message(msg) if duplicate_packet(session=session, receipt_time=current_time, node_id=node_id, localtime=msg.get_timestamp()): LOGGER.info("duplicate packet %d->%d, %d %s" % (node_id, parent_id, msg.get_timestamp(), str(msg))) return False # write a node state row node_state = NodeState(time=current_time, nodeId=node_id, parent=parent_id, localtime=msg.get_timestamp(), seq_num=seq, rssi = rssi_val) session.add(node_state) for i, value in pack_state.d.iteritems(): type_id = i if math.isinf(value) or math.isnan(value): value = None r = Reading(time=current_time, nodeId=node_id, typeId=type_id, locationId=loc_id, value=value) try: session.add(r) session.flush() except sqlalchemy.exc.IntegrityError, e: self.log.error("Unable to store reading, checking if node type exists") self.log.error(e) session.rollback() s = session.query(SensorType).filter_by(id=i).first() if s is None: s = SensorType(id=type_id,name="UNKNOWN") session.add(s) self.log.info("Adding new sensortype") session.flush() session.add(r) session.flush() else: self.log.error("Sensor type exists") self.log.debug("reading: %s, %s" % (node_state, pack_state)) session.commit() #send acknowledgement to base station to fwd to node self.send_ack(seq=seq, dest=node_id)