From 887fc9fc5305bad707a64aef20e95125e37a0261 Mon Sep 17 00:00:00 2001 From: Andrey Vertiprahov Date: Wed, 19 May 2021 22:40:30 +0500 Subject: [PATCH 1/2] Add Measurement Unit to SensorProfile. --- collections/pm.measurementunits/Ampere.json | 3 +- collections/pm.measurementunits/Celsius.json | 3 +- .../pm.measurementunits/Kilowatt-hour.json | 2 +- collections/pm.measurementunits/Percent.json | 9 ++++++ .../pm.measurementunits/StatusEnum.json | 19 +++++++++++++ collections/pm.measurementunits/Volt_AC.json | 3 +- collections/pm.measurementunits/Volt_DC.json | 3 +- collections/pm.measurementunits/Watt.json | 3 +- inv/models/sensor.py | 8 ++++++ inv/models/sensorprofile.py | 2 ++ pm/models/measurementunits.py | 6 +++- sa/profiles/Qtech/QFC/get_inventory.py | 28 +++++++++---------- sa/profiles/Rotek/BT/get_inventory.py | 6 ++-- sa/profiles/Ttronics/KUB/get_inventory.py | 20 ++++++------- ui/web/inv/sensorprofile/Application.js | 9 +++++- ui/web/inv/sensorprofile/Model.js | 4 +++ ui/web/pm/measurementunits/Application.js | 10 +++++-- ui/web/pm/measurementunits/Model.js | 4 +++ 18 files changed, 105 insertions(+), 37 deletions(-) create mode 100644 collections/pm.measurementunits/Percent.json create mode 100644 collections/pm.measurementunits/StatusEnum.json diff --git a/collections/pm.measurementunits/Ampere.json b/collections/pm.measurementunits/Ampere.json index 086e870aab..6c732edd62 100644 --- a/collections/pm.measurementunits/Ampere.json +++ b/collections/pm.measurementunits/Ampere.json @@ -4,6 +4,7 @@ "uuid": "9e59d6e9-debf-48d4-b122-8283e1206797", "description": "Electric current measurement", "label": "A", - "dashboard_label": "A", + "dashboard_label": "mamp", + "dashboard_sr_color": 16777215, "scale_type": "d" } diff --git a/collections/pm.measurementunits/Celsius.json b/collections/pm.measurementunits/Celsius.json index 7210b20e45..a48e5bf719 100644 --- a/collections/pm.measurementunits/Celsius.json +++ b/collections/pm.measurementunits/Celsius.json @@ -4,7 +4,8 @@ "uuid": "1485097a-e3c8-46f9-bf62-bf676df36150", "description": "Temperature measurement", "label": "C", - "dashboard_label": "C", + "dashboard_label": "celsius", + "dashboard_sr_color": 16440874, "scale_type": "d", "alt_units": [ { diff --git a/collections/pm.measurementunits/Kilowatt-hour.json b/collections/pm.measurementunits/Kilowatt-hour.json index 415802619c..b74030f299 100644 --- a/collections/pm.measurementunits/Kilowatt-hour.json +++ b/collections/pm.measurementunits/Kilowatt-hour.json @@ -4,6 +4,6 @@ "uuid": "732b43bf-fa42-4ba1-9169-f318470d1fc4", "description": "Electric utilities", "label": "kW⋅h", - "dashboard_label": "kW h", + "dashboard_label": "kwatth", "scale_type": "d" } diff --git a/collections/pm.measurementunits/Percent.json b/collections/pm.measurementunits/Percent.json new file mode 100644 index 0000000000..aa53e72401 --- /dev/null +++ b/collections/pm.measurementunits/Percent.json @@ -0,0 +1,9 @@ +{ + "name": "Percent", + "$collection": "pm.measurementunits", + "uuid": "0726cc8a-a08c-4b9f-834d-d3cd0fedd771", + "description": "Percent (0 - 100)", + "label": "%", + "dashboard_label": "percent", + "scale_type": "d" +} diff --git a/collections/pm.measurementunits/StatusEnum.json b/collections/pm.measurementunits/StatusEnum.json new file mode 100644 index 0000000000..709987309f --- /dev/null +++ b/collections/pm.measurementunits/StatusEnum.json @@ -0,0 +1,19 @@ +{ + "name": "StatusEnum", + "$collection": "pm.measurementunits", + "uuid": "5d4d1252-ac89-450c-bbe6-4e88e3518066", + "description": "Status for enum key", + "label": "Status", + "dashboard_label": " ", + "scale_type": "d", + "enum": [ + { + "key": "OK", + "value": 0 + }, + { + "key": "Alarm", + "value": 1 + } + ] +} diff --git a/collections/pm.measurementunits/Volt_AC.json b/collections/pm.measurementunits/Volt_AC.json index 4c05ded4c5..c2daabfd3f 100644 --- a/collections/pm.measurementunits/Volt_AC.json +++ b/collections/pm.measurementunits/Volt_AC.json @@ -4,6 +4,7 @@ "uuid": "f5353c4a-68af-47e7-8b1a-60e2ff1c2c0b", "description": "Electric Potential of Alternating Current measurement", "label": "VAC", - "dashboard_label": "V(AC)", + "dashboard_label": "volt", + "dashboard_sr_color": 14692164, "scale_type": "d" } diff --git a/collections/pm.measurementunits/Volt_DC.json b/collections/pm.measurementunits/Volt_DC.json index 236aeb6873..0b2a5ee8e0 100644 --- a/collections/pm.measurementunits/Volt_DC.json +++ b/collections/pm.measurementunits/Volt_DC.json @@ -4,6 +4,7 @@ "uuid": "28b4f8c1-beed-4393-b0ea-168fc3d37d9f", "description": "Direct Current electric potential measurement", "label": "VDC", - "dashboard_label": "V(DC)", + "dashboard_label": "volt", + "dashboard_sr_color": 14692164, "scale_type": "d" } diff --git a/collections/pm.measurementunits/Watt.json b/collections/pm.measurementunits/Watt.json index 72fa575c2e..692a55e7fb 100644 --- a/collections/pm.measurementunits/Watt.json +++ b/collections/pm.measurementunits/Watt.json @@ -4,6 +4,7 @@ "uuid": "6f814980-325b-4854-a25b-1b7f0aa9ca7b", "description": "Power measurement", "label": "W", - "dashboard_label": "W", + "dashboard_label": "watt", + "dashboard_sr_color": 14692164, "scale_type": "d" } diff --git a/inv/models/sensor.py b/inv/models/sensor.py index 0d478479fc..cc8e437a11 100644 --- a/inv/models/sensor.py +++ b/inv/models/sensor.py @@ -87,6 +87,14 @@ class Sensor(Document): def get_by_bi_id(cls, id): return Sensor.objects.filter(bi_id=id).first() + @property + def munits(self) -> MeasurementUnits: + """ + Get effective units + :return: + """ + return self.profile.units or self.units + def seen(self, source: Optional[str] = None): """ Seen sensor diff --git a/inv/models/sensorprofile.py b/inv/models/sensorprofile.py index cbeb066f8b..4d50a3d469 100644 --- a/inv/models/sensorprofile.py +++ b/inv/models/sensorprofile.py @@ -24,6 +24,7 @@ import cachetools # NOC modules from noc.main.models.style import Style from noc.main.models.label import Label +from noc.pm.models.measurementunits import MeasurementUnits from noc.wf.models.workflow import Workflow from noc.core.model.decorator import on_delete_check from noc.core.bi.decorator import bi_sync @@ -53,6 +54,7 @@ class SensorProfile(Document): workflow = PlainReferenceField(Workflow) style = ForeignKeyField(Style) enable_collect = BooleanField(default=False) + units = PlainReferenceField(MeasurementUnits) # Dynamic Profile Classification dynamic_order = IntField(default=0) match_rules = ListField(EmbeddedDocumentField(MatchRule)) diff --git a/pm/models/measurementunits.py b/pm/models/measurementunits.py index 778bbad94f..11372ebc9c 100644 --- a/pm/models/measurementunits.py +++ b/pm/models/measurementunits.py @@ -87,7 +87,8 @@ class MeasurementUnits(Document): # Short label label = StringField() # Label for dashboards - dashboard_label = StringField() + dashboard_label = StringField(required=False) + dashboard_sr_color = IntField(default=0x000000, required=False, null=True) # Type of scale (K/M/G prefixes) # * d - decimal scale, 1/1_000/1_000_000/... # * b - binary scale, 1/2^10/2^20/... @@ -123,6 +124,8 @@ class MeasurementUnits(Document): "dashboard_label": self.dashboard_label, "scale_type": self.scale_type, } + if self.dashboard_sr_color: + r["dashboard_sr_color"] = self.dashboard_sr_color if self.description: r["description"] = self.description if self.alt_units: @@ -141,6 +144,7 @@ class MeasurementUnits(Document): "description", "label", "dashboard_label", + "dashboard_sr_color", "scale_type", "alt_units", "enum", diff --git a/sa/profiles/Qtech/QFC/get_inventory.py b/sa/profiles/Qtech/QFC/get_inventory.py index 0d7ecf6c27..929a8b2c81 100644 --- a/sa/profiles/Qtech/QFC/get_inventory.py +++ b/sa/profiles/Qtech/QFC/get_inventory.py @@ -24,7 +24,7 @@ class Script(BaseScript): "name": f"in{i}", "status": 1, "description": f"Цифровой вход номер {i}", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": f"1.3.6.1.4.1.27514.102.0.{4 + i}.0", } ] @@ -35,7 +35,7 @@ class Script(BaseScript): "name": f"relay{i}", "status": 1, "description": f"Реле {i}", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": f"1.3.6.1.4.1.27514.102.0.{8 + i}.0", } ] @@ -53,7 +53,7 @@ class Script(BaseScript): "name": "v230_state", "status": 1, "description": "Флаг наличия сетевого напря-жения AC 230В", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.102.0.12.0", }, # tempIN @@ -148,7 +148,7 @@ class Script(BaseScript): "name": "in", "status": True, "description": "Цифровой вход", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.5.0", }, # Relay @@ -156,7 +156,7 @@ class Script(BaseScript): "name": "relay", "status": True, "description": "Реле", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.6.0", }, # v230 @@ -164,7 +164,7 @@ class Script(BaseScript): "name": "v230_state", "status": True, "description": "Флаг наличия сетевого напряжения AC 230В", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.7.0", }, # temp1 @@ -194,7 +194,7 @@ class Script(BaseScript): "name": "ups_rs232", "status": True, "description": "Флаг наличия связи с ИБП по порту RS-232", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.13.0", }, ] @@ -204,28 +204,28 @@ class Script(BaseScript): "name": "ups_state", "status": bool(v), "description": "ИБП. Текущее состояние ИБП", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.14.0", }, { "name": "ups_battery_state", "status": bool(v), "description": "ИБП. Текущее состояние батареи ИБП", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.15.0", }, { "name": "ups_bypass", "status": bool(v), "description": "ИБП. Текущий статус bypass", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.16.0", }, { "name": "ups_mode", "status": bool(v), "description": "ИБП. Текущий режим работы ИБП", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.27514.103.0.17.0", }, { @@ -253,7 +253,7 @@ class Script(BaseScript): "name": "ups_load_P", "status": bool(v), "description": "ИБП. Нагрузка ИБП в %.", - "measurement": "Rate", + "measurement": "Percent", "snmp_oid": "1.3.6.1.4.1.27514.103.0.22.0", }, { @@ -274,7 +274,7 @@ class Script(BaseScript): "name": "ups_battery_capasity", "status": bool(v), "description": "ИБП. Ёмкость батареи в %.", - "measurement": "Rate", + "measurement": "Percent", "snmp_oid": "1.3.6.1.4.1.27514.103.0.25.0", }, { @@ -319,7 +319,7 @@ class Script(BaseScript): "name": f"elmeter_Tariff{num}", "status": bool(v), "description": f"Электросчётчик. Суммарное значение потреблённой мощности по тарифу {num}", - "measurement": "Hertz", + "measurement": "Kilowatt-hour", "snmp_oid": f"1.3.6.1.4.1.27514.103.0.{23 + 1}.0", } ] diff --git a/sa/profiles/Rotek/BT/get_inventory.py b/sa/profiles/Rotek/BT/get_inventory.py index 470583c960..d8df28582c 100644 --- a/sa/profiles/Rotek/BT/get_inventory.py +++ b/sa/profiles/Rotek/BT/get_inventory.py @@ -21,7 +21,7 @@ class Script(BaseScript): "name": "in", "status": True, "description": "Дверь", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.41752.5.15.1.1.0", }, # v230 @@ -29,7 +29,7 @@ class Script(BaseScript): "name": "v230_state", "status": True, "description": "Флаг наличия сетевого напряжения AC 230В", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.41752.5.15.1.9.0", }, # temp1 @@ -52,7 +52,7 @@ class Script(BaseScript): { "name": "ups_battery_U", "status": True, - "description": "ИБП. Напряжение батареи ИБП.", + "description": "ИБП. Напряжение на АКБ", "measurement": "Volt AC", "snmp_oid": "1.3.6.1.4.1.41752.5.15.1.6.0", }, diff --git a/sa/profiles/Ttronics/KUB/get_inventory.py b/sa/profiles/Ttronics/KUB/get_inventory.py index 1631db31a8..38e8c98130 100644 --- a/sa/profiles/Ttronics/KUB/get_inventory.py +++ b/sa/profiles/Ttronics/KUB/get_inventory.py @@ -16,8 +16,8 @@ class Script(BaseScript): nano_input_config_map = { 0: {"type": "volt", "units": "Volt AC"}, - 1: {"type": "in", "units": "enum"}, - 2: {"type": "relay", "units": "enum"}, + 1: {"type": "in", "units": "StatusEnum"}, + 2: {"type": "relay", "units": "StatusEnum"}, 3: {"type": "counter", "units": "Unknown"}, 4: {"type": "vibration", "units": "Unknown"}, } @@ -131,7 +131,7 @@ class Script(BaseScript): "name": "ups_rs232", "status": v != 0, "description": "Флаг наличия связи с ИБП по порту RS-232", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.51315.1.29.0", }, ] @@ -141,28 +141,28 @@ class Script(BaseScript): "name": "ups_state", "status": bool(v), "description": "ИБП. Текущее состояние ИБП", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.51315.1.27.0", }, { "name": "ups_battery_state", "status": bool(v), "description": "ИБП. Текущее состояние батареи ИБП", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.51315.1.38.0", }, { "name": "ups_bypass", "status": bool(v), "description": "ИБП. Текущий статус bypass", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.51315.1.31.0", }, { "name": "ups_mode", "status": bool(v), "description": "ИБП. Текущий режим работы ИБП", - "measurement": "enum", + "measurement": "StatusEnum", "snmp_oid": "1.3.6.1.4.1.51315.1.32.0", }, { @@ -190,7 +190,7 @@ class Script(BaseScript): "name": "ups_load_P", "status": bool(v), "description": "ИБП. Нагрузка ИБП в %.", - "measurement": "Rate", + "measurement": "Percent", "snmp_oid": "1.3.6.1.4.1.51315.1.37.0", }, { @@ -211,7 +211,7 @@ class Script(BaseScript): "name": "ups_battery_capasity", "status": bool(v), "description": "ИБП. Ёмкость батареи в %.", - "measurement": "Rate", + "measurement": "Percent", "snmp_oid": "1.3.6.1.4.1.51315.1.41.0", }, { @@ -225,7 +225,7 @@ class Script(BaseScript): return r femto_input_config_map = { - 0: {"type": "in", "units": "enum"}, + 0: {"type": "in", "units": "StatusEnum"}, 1: {"type": "volt", "units": "Volt AC"}, 2: {"type": "counter", "units": "Unknown"}, 3: {"type": "vibration", "units": "Unknown"}, diff --git a/ui/web/inv/sensorprofile/Application.js b/ui/web/inv/sensorprofile/Application.js index 715077fe25..46a9fc6063 100644 --- a/ui/web/inv/sensorprofile/Application.js +++ b/ui/web/inv/sensorprofile/Application.js @@ -14,7 +14,8 @@ Ext.define("NOC.inv.sensorprofile.Application", { "NOC.main.handler.LookupField", "NOC.inv.sensorprofile.Model", "NOC.wf.workflow.LookupField", - "NOC.main.style.LookupField" + "NOC.main.style.LookupField", + "NOC.pm.measurementunits.LookupField" ], model: "NOC.inv.sensorprofile.Model", search: true, @@ -64,6 +65,12 @@ Ext.define("NOC.inv.sensorprofile.Application", { fieldLabel: __("Style"), allowBlank: true }, + { + name: "units", + xtype: "pm.measurementunits.LookupField", + fieldLabel: __("Sensor Measurement Units"), + allowBlank: true + }, { name: "enable_collect", xtype: "checkbox", diff --git a/ui/web/inv/sensorprofile/Model.js b/ui/web/inv/sensorprofile/Model.js index 2baf71e134..1fa9db143a 100644 --- a/ui/web/inv/sensorprofile/Model.js +++ b/ui/web/inv/sensorprofile/Model.js @@ -31,6 +31,10 @@ Ext.define("NOC.inv.sensorprofile.Model", { name: "style", type: "int" }, + { + name: "units", + type: "string" + }, { name: "enable_collect", type: "boolean" diff --git a/ui/web/pm/measurementunits/Application.js b/ui/web/pm/measurementunits/Application.js index ac1c89f161..2a20f9b21e 100644 --- a/ui/web/pm/measurementunits/Application.js +++ b/ui/web/pm/measurementunits/Application.js @@ -8,7 +8,7 @@ console.debug("Defining NOC.pm.measurementunits.Application"); Ext.define("NOC.pm.measurementunits.Application", { extend: "NOC.core.ModelApplication", - requires: ["NOC.pm.measurementunits.Model"], + requires: ["NOC.pm.measurementunits.Model", "Ext.ux.form.ColorField"], model: "NOC.pm.measurementunits.Model", search: true, @@ -63,7 +63,13 @@ Ext.define("NOC.pm.measurementunits.Application", { name: "dashboard_label", xtype: "textfield", fieldLabel: __("Dashboard Label"), - allowBlank: false, + uiStyle: "medium" + }, + { + name: "dashboard_sr_color", + xtype: "colorfield", + fieldLabel: __("Dashboard Series Color"), + allowBlank: true, uiStyle: "medium" }, { diff --git a/ui/web/pm/measurementunits/Model.js b/ui/web/pm/measurementunits/Model.js index 41d04cd853..e17e930c3c 100644 --- a/ui/web/pm/measurementunits/Model.js +++ b/ui/web/pm/measurementunits/Model.js @@ -35,6 +35,10 @@ Ext.define("NOC.pm.measurementunits.Model", { name: "dashboard_label", type: "string" }, + { + name: "dashboard_sr_color", + type: "int" + }, { name: "scale_type", type: "string", -- GitLab From 2ae9752f2f9cae48802fc83beed5aea67c55ebb3 Mon Sep 17 00:00:00 2001 From: Andrey Vertiprahov Date: Wed, 19 May 2021 23:09:21 +0500 Subject: [PATCH 2/2] Fix on_delete check. --- pm/models/measurementunits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pm/models/measurementunits.py b/pm/models/measurementunits.py index 11372ebc9c..f42f512dca 100644 --- a/pm/models/measurementunits.py +++ b/pm/models/measurementunits.py @@ -68,7 +68,7 @@ class EnumValue(EmbeddedDocument): return {"key": self.key, "value": self.value} -@on_delete_check(check=[("inv.Sensor", "units")]) +@on_delete_check(check=[("inv.Sensor", "units"), ("inv.SensorProfile", "units")]) class MeasurementUnits(Document): meta = { "collection": "measurementunits", -- GitLab