PyScada-DatasourceExample/pyscada/datasourceexample/models.py
2026-01-27 17:22:01 +01:00

83 lines
3.0 KiB
Python
Executable File

from django.db import models
from django.forms.models import BaseInlineFormSet
from django.core.exceptions import ValidationError
from pyscada.models import DataSource, DataSourceModel, Variable
from time import time
import random
import logging
logger = logging.getLogger(__name__)
class LoggingRandomDataSourceExample(models.Model):
datasource = models.OneToOneField(DataSource, on_delete=models.CASCADE)
random_min = models.PositiveSmallIntegerField(default=0)
random_max = models.PositiveSmallIntegerField(default=10)
interval_ms = 10000
def __str__(self):
return f"LoggingRandomDataSourceExample-{self.random_min}-{self.random_max}"
def last_value(self, **kwargs):
value = None
if "variable" in kwargs:
value = random.uniform(self.random_min, self.random_max)
variable = kwargs["variable"]
logger.info(
f"LoggingRandomDataSourceExample - read value from datasource - {variable} : {value}"
)
else:
logger.info(
f"LoggingRandomDataSourceExample - read value from datasource - missing variable in kwargs"
)
return [time()*1000, value]
def read_multiple(self, **kwargs):
variable_ids = kwargs.pop("variable_ids") if "variable_ids" in kwargs else []
time_min = kwargs.pop("time_min") if "time_min" in kwargs else 0
time_max = kwargs.pop("time_max") if "time_max" in kwargs else time.time()
time_in_ms = kwargs.pop("time_in_ms") if "time_in_ms" in kwargs else True
query_first_value = (
kwargs.pop("query_first_value") if "query_first_value" in kwargs else False
)
variable_ids = self.datasource.datasource_check(
variable_ids, items_as_id=True, ids_model=Variable
)
values = {"timestamp": time() * 1000, "date_saved_max": time() * 1000}
for variable_id in variable_ids:
values[variable_id] = []
kwargs["variable"] = Variable.objects.get(id=variable_id)
for t in range(int(time_min*1000), int(time_max*1000), self.interval_ms):
value = random.uniform(self.random_min, self.random_max)
values[variable_id].append([t, value])
return values
def write_multiple(self, **kwargs):
items = kwargs.pop("items") if "items" in kwargs else []
items = self.datasource.datasource_check(items)
for item in items:
self.datasource._send_cov_notification(item)
logger.info(
f"LoggingRandomDataSourceExample - write readed value to datasource - {item} : {item.cached_values_to_write}"
)
def get_first_element_timestamp(self, **kwargs):
t = time()
logger.info(
f"LoggingRandomDataSourceExample - get_first_element_timestamp - {t}"
)
return time()
def get_last_element_timestamp(self, **kwargs):
t = time()
logger.info(
f"LoggingRandomDataSourceExample - get_last_element_timestamp - {t}"
)
return t