fix / AEB-21 create db schema
This commit is contained in:
@@ -34,6 +34,10 @@ class SensorType(models.Model):
|
|||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
description = models.TextField(blank=True, null=True)
|
description = models.TextField(blank=True, null=True)
|
||||||
|
|
||||||
|
# пороговые значения для всех сенсоров этого типа
|
||||||
|
min_value = models.DecimalField(max_digits=12, decimal_places=4, null=True, blank=True)
|
||||||
|
max_value = models.DecimalField(max_digits=12, decimal_places=4, null=True, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.code
|
return self.code
|
||||||
|
|
||||||
@@ -44,7 +48,6 @@ class SignalFormat(models.Model):
|
|||||||
code = models.CharField(max_length=50) # например "4-20мА", "VW f<1600Hz", "NTC R>250Ohm"
|
code = models.CharField(max_length=50) # например "4-20мА", "VW f<1600Hz", "NTC R>250Ohm"
|
||||||
unit = models.CharField(max_length=20, blank=True, null=True) # °C, мкм/м, мм и т.п.
|
unit = models.CharField(max_length=20, blank=True, null=True) # °C, мкм/м, мм и т.п.
|
||||||
conversion_rule = models.CharField(max_length=255, blank=True, null=True)
|
conversion_rule = models.CharField(max_length=255, blank=True, null=True)
|
||||||
# можно хранить Python-путь к функции конвертации, например "sensors.convert.ga_current_to_angle"
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ("sensor_type", "code")
|
unique_together = ("sensor_type", "code")
|
||||||
@@ -81,3 +84,31 @@ class Metric(models.Model):
|
|||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.timestamp} {self.sensor} = {self.value} {self.sensor.signal_format.unit if self.sensor.signal_format else ''}"
|
return f"{self.timestamp} {self.sensor} = {self.value} {self.sensor.signal_format.unit if self.sensor.signal_format else ''}"
|
||||||
|
|
||||||
|
|
||||||
|
class Alert(models.Model):
|
||||||
|
"""Тревоги по метрикам"""
|
||||||
|
sensor = models.ForeignKey(Sensor, on_delete=models.CASCADE, related_name="alerts")
|
||||||
|
metric = models.ForeignKey(Metric, on_delete=models.CASCADE, related_name="alerts")
|
||||||
|
sensor_type = models.ForeignKey(SensorType, on_delete=models.CASCADE, related_name="alerts")
|
||||||
|
message = models.CharField(max_length=255)
|
||||||
|
severity = models.CharField(
|
||||||
|
max_length=20,
|
||||||
|
choices=[
|
||||||
|
("warning", "Warning"),
|
||||||
|
("critical", "Critical"),
|
||||||
|
],
|
||||||
|
default="warning"
|
||||||
|
)
|
||||||
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
resolved = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
indexes = [
|
||||||
|
models.Index(fields=["created_at"]),
|
||||||
|
models.Index(fields=["sensor"]),
|
||||||
|
models.Index(fields=["sensor_type"]),
|
||||||
|
]
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"ALERT {self.sensor} @ {self.metric.timestamp}: {self.message}"
|
||||||
Reference in New Issue
Block a user