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 4.0KB

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