test_smartmcb_smt006_energymeter.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. """Tests for the SmartMCB SMT006 Energy Meter"""
  2. from homeassistant.components.binary_sensor import (
  3. DEVICE_CLASS_BATTERY,
  4. DEVICE_CLASS_HEAT,
  5. DEVICE_CLASS_PLUG,
  6. DEVICE_CLASS_POWER,
  7. DEVICE_CLASS_PROBLEM,
  8. DEVICE_CLASS_SAFETY,
  9. DEVICE_CLASS_SMOKE,
  10. )
  11. from homeassistant.components.sensor import (
  12. STATE_CLASS_TOTAL,
  13. STATE_CLASS_TOTAL_INCREASING,
  14. )
  15. from homeassistant.const import (
  16. DEVICE_CLASS_ENERGY,
  17. ENERGY_KILO_WATT_HOUR,
  18. )
  19. from ..const import SMARTMCB_SMT006_METER_PAYLOAD
  20. from ..mixins.binary_sensor import MultiBinarySensorTests
  21. from ..mixins.sensor import MultiSensorTests
  22. from ..mixins.switch import MultiSwitchTests
  23. from .base_device_tests import TuyaDeviceTestCase
  24. TOTALENERGY_DPS = "1"
  25. ERROR_DPS = "9"
  26. PREPAY_DPS = "11"
  27. RESET_DPS = "12"
  28. BALANCE_DPS = "13"
  29. SWITCH_DPS = "16"
  30. SERIAL_DPS = "19"
  31. UNKNOWN101_DPS = "101"
  32. UNKNOWN102_DPS = "102"
  33. UNKNOWN103_DPS = "103"
  34. UNKNOWN104_DPS = "104"
  35. UNKNOWN105_DPS = "105"
  36. UNKNOWN106_DPS = "106"
  37. class TestSmartMcbSMT006EnergyMeter(
  38. MultiBinarySensorTests,
  39. MultiSensorTests,
  40. MultiSwitchTests,
  41. TuyaDeviceTestCase,
  42. ):
  43. __test__ = True
  44. def setUp(self):
  45. self.setUpForConfig(
  46. "smartmcb_smt006_energymeter.yaml",
  47. SMARTMCB_SMT006_METER_PAYLOAD,
  48. )
  49. self.setUpMultiSwitch(
  50. [
  51. {
  52. "name": "switch",
  53. "dps": SWITCH_DPS,
  54. },
  55. {
  56. "name": "switch_prepay",
  57. "dps": PREPAY_DPS,
  58. },
  59. {
  60. "name": "switch_energy_reset",
  61. "dps": RESET_DPS,
  62. },
  63. ],
  64. )
  65. self.setUpMultiSensors(
  66. [
  67. {
  68. "name": "sensor_energy",
  69. "dps": TOTALENERGY_DPS,
  70. "device_class": DEVICE_CLASS_ENERGY,
  71. "unit": ENERGY_KILO_WATT_HOUR,
  72. "state_class": STATE_CLASS_TOTAL_INCREASING,
  73. "testdata": (123456, 1234.56),
  74. },
  75. {
  76. "name": "sensor_balance_energy",
  77. "dps": BALANCE_DPS,
  78. "device_class": DEVICE_CLASS_ENERGY,
  79. "unit": ENERGY_KILO_WATT_HOUR,
  80. "state_class": STATE_CLASS_TOTAL,
  81. "testdata": (123456, 1234.56),
  82. },
  83. ],
  84. )
  85. self.setUpMultiBinarySensors(
  86. [
  87. {
  88. "name": "binary_sensor_short_circuit",
  89. "dps": ERROR_DPS,
  90. "device_class": DEVICE_CLASS_PROBLEM,
  91. "testdata": (1, 0),
  92. },
  93. {
  94. "name": "binary_sensor_surge",
  95. "dps": ERROR_DPS,
  96. "device_class": DEVICE_CLASS_PROBLEM,
  97. "testdata": (2, 0),
  98. },
  99. {
  100. "name": "binary_sensor_overload",
  101. "dps": ERROR_DPS,
  102. "device_class": DEVICE_CLASS_PROBLEM,
  103. "testdata": (4, 0),
  104. },
  105. {
  106. "name": "binary_sensor_leakage_current",
  107. "dps": ERROR_DPS,
  108. "device_class": DEVICE_CLASS_SAFETY,
  109. "testdata": (8, 0),
  110. },
  111. {
  112. "name": "binary_sensor_high_temperature",
  113. "dps": ERROR_DPS,
  114. "device_class": DEVICE_CLASS_HEAT,
  115. "testdata": (16, 0),
  116. },
  117. {
  118. "name": "binary_sensor_fire",
  119. "dps": ERROR_DPS,
  120. "device_class": DEVICE_CLASS_SMOKE,
  121. "testdata": (32, 0),
  122. },
  123. {
  124. "name": "binary_sensor_high_power",
  125. "dps": ERROR_DPS,
  126. "device_class": DEVICE_CLASS_POWER,
  127. "testdata": (64, 0),
  128. },
  129. {
  130. "name": "binary_sensor_self_test",
  131. "dps": ERROR_DPS,
  132. "device_class": DEVICE_CLASS_PROBLEM,
  133. "testdata": (128, 0),
  134. },
  135. {
  136. "name": "binary_sensor_overcurrent",
  137. "dps": ERROR_DPS,
  138. "device_class": DEVICE_CLASS_PROBLEM,
  139. "testdata": (256, 0),
  140. },
  141. {
  142. "name": "binary_sensor_unbalanced",
  143. "dps": ERROR_DPS,
  144. "device_class": DEVICE_CLASS_PROBLEM,
  145. "testdata": (512, 0),
  146. },
  147. {
  148. "name": "binary_sensor_overvoltage",
  149. "dps": ERROR_DPS,
  150. "device_class": DEVICE_CLASS_PROBLEM,
  151. "testdata": (1024, 0),
  152. },
  153. {
  154. "name": "binary_sensor_undervoltage",
  155. "dps": ERROR_DPS,
  156. "device_class": DEVICE_CLASS_PROBLEM,
  157. "testdata": (2048, 0),
  158. },
  159. {
  160. "name": "binary_sensor_phase_fault",
  161. "dps": ERROR_DPS,
  162. "device_class": DEVICE_CLASS_PROBLEM,
  163. "testdata": (4096, 0),
  164. },
  165. {
  166. "name": "binary_sensor_outage",
  167. "dps": ERROR_DPS,
  168. "device_class": DEVICE_CLASS_POWER,
  169. "testdata": (0, 8192),
  170. },
  171. {
  172. "name": "binary_sensor_magnetism",
  173. "dps": ERROR_DPS,
  174. "device_class": DEVICE_CLASS_PROBLEM,
  175. "testdata": (16384, 0),
  176. },
  177. {
  178. "name": "binary_sensor_low_credit",
  179. "dps": ERROR_DPS,
  180. "device_class": DEVICE_CLASS_BATTERY,
  181. "testdata": (32768, 0),
  182. },
  183. {
  184. "name": "binary_sensor_credit",
  185. "dps": ERROR_DPS,
  186. "device_class": DEVICE_CLASS_PLUG,
  187. "testdata": (0, 65536),
  188. "unit": ENERGY_KILO_WATT_HOUR,
  189. },
  190. ],
  191. )
  192. self.mark_secondary(
  193. [
  194. "binary_sensor_credit",
  195. "binary_sensor_fire",
  196. "binary_sensor_high_power",
  197. "binary_sensor_high_temperature",
  198. "binary_sensor_leakage_current",
  199. "binary_sensor_low_credit",
  200. "binary_sensor_magnetism",
  201. "binary_sensor_outage",
  202. "binary_sensor_overcurrent",
  203. "binary_sensor_overload",
  204. "binary_sensor_overvoltage",
  205. "binary_sensor_phase_fault",
  206. "binary_sensor_self_test",
  207. "binary_sensor_short_circuit",
  208. "binary_sensor_surge",
  209. "binary_sensor_unbalanced",
  210. "binary_sensor_undervoltage",
  211. "sensor_balance_energy",
  212. "switch_energy_reset",
  213. "switch_prepay",
  214. ]
  215. )
  216. def test_multi_switch_state_attributes(self):
  217. self.dps[SERIAL_DPS] = "Breaker Number"
  218. self.dps[UNKNOWN101_DPS] = 101
  219. self.dps[UNKNOWN102_DPS] = 102
  220. self.dps[UNKNOWN103_DPS] = 103
  221. self.dps[UNKNOWN104_DPS] = 104
  222. self.dps[UNKNOWN105_DPS] = True
  223. self.dps[UNKNOWN106_DPS] = False
  224. self.assertDictEqual(
  225. self.multiSwitch["switch"].extra_state_attributes,
  226. {
  227. "breaker_number": "Breaker Number",
  228. "unknown_101": 101,
  229. "unknown_102": 102,
  230. "unknown_103": 103,
  231. "unknown_104": 104,
  232. "unknown_105": True,
  233. "unknown_106": False,
  234. },
  235. )
  236. def test_multiple_concurrent_errors(self):
  237. self.dps[ERROR_DPS] = 15
  238. self.assertTrue(self.multiBSensor["binary_sensor_short_circuit"].is_on)
  239. self.assertTrue(self.multiBSensor["binary_sensor_surge"].is_on)
  240. self.assertTrue(self.multiBSensor["binary_sensor_overload"].is_on)
  241. self.assertTrue(self.multiBSensor["binary_sensor_leakage_current"].is_on)
  242. self.assertFalse(self.multiBSensor["binary_sensor_high_temperature"].is_on)
  243. self.assertFalse(self.multiBSensor["binary_sensor_fire"].is_on)