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.9KB

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