Beispiel #1
0
 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")
Beispiel #2
0
 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
     }