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