Projet de remplacement du "RPiPasserelle" d'Otec.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

variable_type.py 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from pyheatpump.db import RowClass
  2. from pyheatpump.db import sql
  3. class VariableType(RowClass):
  4. slabel: str = None
  5. label: str = None
  6. type: str = None
  7. start_address: int = None
  8. end_address: int = None
  9. def __init__(self, **kwargs):
  10. super().__init__(**kwargs)
  11. if self.slabel is None and self.label is not None:
  12. self.slabel = self.label[0]
  13. def __str__(self):
  14. return self.slabel or self.label[0]
  15. def cast(self):
  16. if self.type == 'float':
  17. return float
  18. if self.type == 'int':
  19. return int
  20. if self.type == 'bool':
  21. return bool
  22. def select():
  23. try:
  24. elt = next(super().select('slabel', 'var_type'))
  25. except StopIteration:
  26. print('No element exists')
  27. def save(self):
  28. q = ['UPDATE var_type SET']
  29. updates = []
  30. if self.start_address is not None:
  31. updates.append(f'start_address = {self.start_address}')
  32. if self.end_address is not None:
  33. updates.append(f'end_address = {self.end_address}')
  34. if len(updates) == 0:
  35. return
  36. q.append(','.join(updates))
  37. q.append(f"WHERE slabel = '{self.slabel}'")
  38. return sql(' '.join(q))
  39. def get_variables(self):
  40. from .variable import Variable
  41. return Variable.getall_of_type(self)
  42. def get_variables_values(self):
  43. from .variable import Variable
  44. return Variable.getall_values_of_type(self)
  45. def get_variables_values_since(self, since: int):
  46. from .variable import Variable
  47. return Variable.getall_values_of_type_since(self, since)
  48. def control(self, data):
  49. from .variable import Variable
  50. from .variable_value import VariableValue
  51. for s_address, s_value in data.items():
  52. address = int(s_address)
  53. if self.slabel == 'I':
  54. # For integers, we have to respect the offset to get the address
  55. address = address + self.start_address - 1
  56. # All values are stored in strings that represent floats
  57. # We have to convert them
  58. f_value = float(s_value)
  59. if self.slabel == 'A':
  60. f_value = f_value * 10
  61. # Value is stored as integers in database
  62. value = int(f_value)
  63. if address not in range(self.start_address, self.end_address + 1):
  64. continue
  65. if not Variable(**{
  66. 'type': self,
  67. 'address': address}).exists():
  68. continue
  69. new_var_value = VariableValue(**{
  70. 'type': self,
  71. 'address': address,
  72. 'value': value})
  73. old_var_value = VariableValue.get(
  74. self, address)
  75. if old_var_value.equals(new_var_value):
  76. continue
  77. new_var_value.set()
  78. @staticmethod
  79. def getall():
  80. return dict([
  81. (row['label'], VariableType(**dict(row)))
  82. for row in sql('SELECT * FROM var_type') ])
  83. @staticmethod
  84. def get(slabel: str):
  85. if len(slabel) > 1:
  86. slabel = slabel[0]
  87. try:
  88. return VariableType(**dict(
  89. next(sql(
  90. """
  91. SELECT * FROM var_type
  92. WHERE slabel = '{}'
  93. """.format(slabel)))))
  94. except StopIteration:
  95. raise NameError