def sync_object(cls, obj: Object) -> None: """ Synchronize sensors with object model :param obj: :return: """ # Get existing sensors obj_sensors: Dict[str, Sensor] = { s.local_id: s for s in Sensor.objects.filter(object=obj.id) } m_proto = [ d.value for d in obj.get_effective_data() if d.interface == "modbus" and d.attr == "type" ] or ["rtu"] # Create new sensors for sensor in obj.model.sensors: if sensor.name in obj_sensors: obj_sensors[sensor.name].seen("objectmodel") del obj_sensors[sensor.name] continue # logger.info("[%s|%s] Creating new sensor '%s'", obj.name if obj else "-", "-", sensor.name) s = Sensor( profile=SensorProfile.get_default_profile(), object=obj, local_id=sensor.name, units=sensor.units, label=sensor.description, ) # Get sensor protocol if sensor.modbus_register: if not m_proto: continue s.protocol = "modbus_%s" % m_proto[0].lower() s.modbus_register = sensor.modbus_register elif sensor.snmp_oid: s.protocol = "snmp" s.snmp_oid = sensor.snmp_oid else: logger.info( "[%s|%s] Unknown sensor protocol '%s'", obj.name if obj else "-", "-", sensor.name, ) s.save() s.seen("objectmodel") # Notify missed sensors for s in sorted(obj_sensors): sensor = obj_sensors[s] sensor.unseen(source="objectmodel")
def get_data(self, request, o: Object): data = [] common = [ ("Name", " | ".join(o.get_name_path()), "Inventory name", False), ("Vendor", o.model.vendor.name, "Hardware vendor", True), ("Model", o.model.name, "Inventory model", True), ("ID", str(o.id), "Internal ID", True), ] if o.remote_system: common += [ ("Remote System", o.remote_system.name, "Remote System Name", True), ("RemoteID", o.remote_id, "Remote System ID", True), ] for k, v, d, is_const in common: r = { "interface": "Common", "name": k, "value": v, "type": "str", "description": d, "required": True, "is_const": is_const, "choices": None, "scope": "", } if k == "Model": for rg in self.RGROUPS: if v in rg: # Model can be changed r["is_const"] = False g = [ObjectModel.objects.get(name=x) for x in rg] r["choices"] = [[str(x.id), x.name] for x in g] break data += [r] # Build result mi_values: Dict[str, Dict[str, List[Tuple[Optional[str], str]]]] = {} for item in o.get_effective_data(): if item.interface not in mi_values: mi_values[item.interface] = defaultdict(list) mi_values[item.interface][item.attr] += [(item.value, item.scope)] for i in mi_values: mi = ModelInterface.get_by_name(i) if not mi: continue for a in mi.attrs: for value, scope in mi_values[i].get(a.name, [(None, "")]): if value is None and a.is_const: continue data += [{ "interface": i, "name": a.name, "scope": scope, "value": value, "type": a.type, "description": a.description, "required": a.required, "is_const": a.is_const, }] return { "id": str(o.id), "name": o.name, "model": o.model.name, "data": data }