Projet de remplacement du "RPiPasserelle" d'Otec.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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