ramses-rf 0.51.7__py3-none-any.whl → 0.51.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ramses_tx/helpers.py CHANGED
@@ -787,9 +787,9 @@ def fan_info_to_byte(info: str) -> int:
787
787
 
788
788
  def fan_info_flags(flags_list: list[int]) -> int:
789
789
  flag_res: int = 0
790
- for index, shft in enumerate(range(7, 4, -1)): # index = 7, 6 and 5
790
+ for index, shift in enumerate(range(7, 4, -1)): # index = 7, 6 and 5
791
791
  if flags_list[index] == 1:
792
- flag_res |= 1 << shft # set bits
792
+ flag_res |= 1 << shift # set bits
793
793
  return flag_res
794
794
 
795
795
 
ramses_tx/parsers.py CHANGED
@@ -1391,15 +1391,18 @@ def parser_2210(payload: str, msg: Message) -> dict[str, Any]:
1391
1391
  "02", # requested by CO2 level/sensor
1392
1392
  "03", # requested by humidity level/sensor
1393
1393
  ), f"expected req_reason (00|02|03), not {payload[20:22]}"
1394
- assert payload[78:80] in ("00", "02"), (
1395
- f"expected byte 39 (00|02), not {payload[78:80]}"
1396
- )
1397
- assert payload[80:82] in ("01", "08"), (
1398
- f"expected byte 40 (01|08), not {payload[80:82]}"
1399
- )
1400
- assert payload[82:] in ("00", "40"), (
1401
- f"expected byte 41- (00|40), not {payload[82:]}"
1402
- )
1394
+ assert payload[78:80] in (
1395
+ "00",
1396
+ "02",
1397
+ ), f"expected byte 39 (00|02), not {payload[78:80]}"
1398
+ assert payload[80:82] in (
1399
+ "01",
1400
+ "08",
1401
+ ), f"expected byte 40 (01|08), not {payload[80:82]}"
1402
+ assert payload[82:] in (
1403
+ "00",
1404
+ "40",
1405
+ ), f"expected byte 41- (00|40), not {payload[82:]}"
1403
1406
 
1404
1407
  except AssertionError as err:
1405
1408
  _LOGGER.warning(f"{msg!r} < {_INFORM_DEV_MSG} ({err})")
ramses_tx/protocol.py CHANGED
@@ -332,7 +332,7 @@ class _DeviceIdFilterMixin(_BaseProtocol):
332
332
  /,
333
333
  *,
334
334
  disable_warnings: bool = False,
335
- strick_checking: bool = False,
335
+ strict_checking: bool = False,
336
336
  ) -> DeviceIdT | None:
337
337
  """Return the device_id of the gateway specified in the include_list, if any.
338
338
 
@@ -384,7 +384,7 @@ class _DeviceIdFilterMixin(_BaseProtocol):
384
384
  f"The {SZ_KNOWN_LIST} includes exactly one gateway (HGI): {known_hgi}"
385
385
  )
386
386
 
387
- if strick_checking:
387
+ if strict_checking:
388
388
  return known_hgi if [known_hgi] == explicit_hgis else None
389
389
  return known_hgi
390
390
 
ramses_tx/protocol_fsm.py CHANGED
@@ -291,7 +291,7 @@ class ProtocolContext:
291
291
  # may want to set some instance variables, according to type of transport
292
292
  self._state.connection_made()
293
293
 
294
- # TODO: Should we clear the buffer if connection is lost (and apoligise to senders?
294
+ # TODO: Should we clear the buffer if connection is lost (and apologise to senders?
295
295
  def connection_lost(self, err: ExceptionT | None) -> None:
296
296
  self._state.connection_lost()
297
297
 
ramses_tx/ramses.py CHANGED
@@ -223,7 +223,7 @@ CODES_SCHEMA: dict[Code, dict[str, Any]] = { # rf_unknown
223
223
  SZ_NAME: "device_info",
224
224
  I_: r"^(00|FF)([0-9A-F]{30,})?$", # r"^[0-9A-F]{32,}$" might be OK
225
225
  RQ: r"^00$", # NOTE: 63 seen (no RP), some devices will accept [0-9A-F]{2}
226
- # RP: r"^[0-9A-F]{2}([0-9A-F]){30,}$", # NOTE: indx same as RQ
226
+ # RP: r"^[0-9A-F]{2}([0-9A-F]){30,}$", # NOTE: index same as RQ
227
227
  SZ_LIFESPAN: False,
228
228
  },
229
229
  Code._10E1: { # device_id
@@ -480,6 +480,7 @@ CODES_SCHEMA: dict[Code, dict[str, Any]] = { # rf_unknown
480
480
  SZ_NAME: "fan_params",
481
481
  I_: r"^(00|01|15|16|17|21)00[0-9A-F]{6}([0-9A-F]{8}){4}[0-9A-F]{4}$",
482
482
  RQ: r"^(00|01|15|16|17|21)00[0-9A-F]{2}((00){19})?$",
483
+ RP: r"^(00|01|15|16|17|21)00[0-9A-F]{6}[0-9A-F]{8}(([0-9A-F]{8}){3}[0-9A-F]{4})?$",
483
484
  W_: r"^(00|01|15|16|17|21)00[0-9A-F]{6}[0-9A-F]{8}(([0-9A-F]{8}){3}[0-9A-F]{4})?$",
484
485
  },
485
486
  Code._2420: { # unknown_2420, from OTB
@@ -1220,6 +1221,7 @@ SZ_MIN_VALUE: Final = "min_value"
1220
1221
  SZ_MAX_VALUE: Final = "max_value"
1221
1222
  SZ_PRECISION: Final = "precision"
1222
1223
  SZ_DATA_TYPE: Final = "data_type"
1224
+ SZ_DATA_UNIT: Final = "data_unit"
1223
1225
 
1224
1226
  _22F1_MODE_ITHO: dict[str, str] = {
1225
1227
  "00": "off", # not seen
@@ -1265,12 +1267,13 @@ _22F1_SCHEMES: dict[str, dict[str, str]] = {
1265
1267
 
1266
1268
  # unclear if true for only Orcon/*all* models
1267
1269
  _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1268
- "31": { # slot 09
1270
+ "31": { # slot 09 (FANs produced after 2021)
1269
1271
  SZ_DESCRIPTION: "Time to change filter (days)",
1270
1272
  SZ_MIN_VALUE: 0,
1271
1273
  SZ_MAX_VALUE: 1800,
1272
1274
  SZ_PRECISION: 30,
1273
1275
  SZ_DATA_TYPE: "10",
1276
+ SZ_DATA_UNIT: "days",
1274
1277
  },
1275
1278
  "3D": { # slot 00
1276
1279
  SZ_DESCRIPTION: "Away mode Supply fan rate (%)",
@@ -1278,6 +1281,7 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1278
1281
  SZ_MAX_VALUE: 0.4,
1279
1282
  SZ_PRECISION: 0.005,
1280
1283
  SZ_DATA_TYPE: "0F",
1284
+ SZ_DATA_UNIT: "%",
1281
1285
  },
1282
1286
  "3E": { # slot 01
1283
1287
  SZ_DESCRIPTION: "Away mode Exhaust fan rate (%)",
@@ -1285,6 +1289,7 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1285
1289
  SZ_MAX_VALUE: 0.4,
1286
1290
  SZ_PRECISION: 0.005,
1287
1291
  SZ_DATA_TYPE: "0F",
1292
+ SZ_DATA_UNIT: "%",
1288
1293
  },
1289
1294
  "3F": { # slot 02
1290
1295
  SZ_DESCRIPTION: "Low mode Supply fan rate (%)",
@@ -1292,6 +1297,7 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1292
1297
  SZ_MAX_VALUE: 0.8,
1293
1298
  SZ_PRECISION: 0.005,
1294
1299
  SZ_DATA_TYPE: "0F",
1300
+ SZ_DATA_UNIT: "%",
1295
1301
  },
1296
1302
  "40": { # slot 03
1297
1303
  SZ_DESCRIPTION: "Low mode Exhaust fan rate (%)",
@@ -1299,13 +1305,15 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1299
1305
  SZ_MAX_VALUE: 0.8,
1300
1306
  SZ_PRECISION: 0.005,
1301
1307
  SZ_DATA_TYPE: "0F",
1308
+ SZ_DATA_UNIT: "%",
1302
1309
  },
1303
1310
  "41": { # slot 04
1304
1311
  SZ_DESCRIPTION: "Medium mode Supply fan rate (%)",
1305
- SZ_MIN_VALUE: 0.0,
1312
+ SZ_MIN_VALUE: 0.1, # Orcon FAN responds with 0.0, but I guess this should be the same as for "42"
1306
1313
  SZ_MAX_VALUE: 1.0,
1307
1314
  SZ_PRECISION: 0.005,
1308
1315
  SZ_DATA_TYPE: "0F",
1316
+ SZ_DATA_UNIT: "%",
1309
1317
  },
1310
1318
  "42": { # slot 05
1311
1319
  SZ_DESCRIPTION: "Medium mode Exhaust fan rate (%)",
@@ -1313,13 +1321,15 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1313
1321
  SZ_MAX_VALUE: 1.0,
1314
1322
  SZ_PRECISION: 0.005,
1315
1323
  SZ_DATA_TYPE: "0F",
1324
+ SZ_DATA_UNIT: "%",
1316
1325
  },
1317
1326
  "43": { # slot 06
1318
1327
  SZ_DESCRIPTION: "High mode Supply fan rate (%)",
1319
- SZ_MIN_VALUE: 0.0,
1328
+ SZ_MIN_VALUE: 0.1,
1320
1329
  SZ_MAX_VALUE: 1.0,
1321
1330
  SZ_PRECISION: 0.005,
1322
1331
  SZ_DATA_TYPE: "0F",
1332
+ SZ_DATA_UNIT: "%",
1323
1333
  },
1324
1334
  "44": { # slot 07
1325
1335
  SZ_DESCRIPTION: "High mode Exhaust fan rate (%)",
@@ -1327,6 +1337,15 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1327
1337
  SZ_MAX_VALUE: 1.0,
1328
1338
  SZ_PRECISION: 0.005,
1329
1339
  SZ_DATA_TYPE: "0F",
1340
+ SZ_DATA_UNIT: "%",
1341
+ },
1342
+ "4B": { # slot 09 (FANs produced before 2021) Also check code 22F7
1343
+ SZ_DESCRIPTION: "(Test) Bypass Valve (0=auto, 1=open, 2=closed)",
1344
+ SZ_MIN_VALUE: 0,
1345
+ SZ_MAX_VALUE: 2,
1346
+ SZ_PRECISION: 1,
1347
+ SZ_DATA_TYPE: "00",
1348
+ SZ_DATA_UNIT: "",
1330
1349
  },
1331
1350
  "4E": { # slot 0A
1332
1351
  SZ_DESCRIPTION: "Moisture scenario position (0=medium, 1=high)",
@@ -1334,13 +1353,15 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1334
1353
  SZ_MAX_VALUE: 1,
1335
1354
  SZ_PRECISION: 1,
1336
1355
  SZ_DATA_TYPE: "00",
1356
+ SZ_DATA_UNIT: "",
1337
1357
  },
1338
1358
  "52": { # slot 0B
1339
1359
  SZ_DESCRIPTION: "Sensor sensitivity (%)",
1340
1360
  SZ_MIN_VALUE: 0,
1341
1361
  SZ_MAX_VALUE: 25.0,
1342
1362
  SZ_PRECISION: 0.1,
1343
- SZ_DATA_TYPE: "0F",
1363
+ SZ_DATA_TYPE: "01",
1364
+ SZ_DATA_UNIT: "%",
1344
1365
  },
1345
1366
  "54": { # slot 0C
1346
1367
  SZ_DESCRIPTION: "Moisture sensor overrun time (mins)",
@@ -1348,13 +1369,15 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1348
1369
  SZ_MAX_VALUE: 60,
1349
1370
  SZ_PRECISION: 1,
1350
1371
  SZ_DATA_TYPE: "00",
1372
+ SZ_DATA_UNIT: "min",
1351
1373
  },
1352
1374
  "75": { # slot 0D
1353
1375
  SZ_DESCRIPTION: "Comfort temperature (°C)",
1354
1376
  SZ_MIN_VALUE: 0.0,
1355
1377
  SZ_MAX_VALUE: 30.0,
1356
1378
  SZ_PRECISION: 0.01,
1357
- SZ_DATA_TYPE: 92,
1379
+ SZ_DATA_TYPE: "92",
1380
+ SZ_DATA_UNIT: "°C",
1358
1381
  },
1359
1382
  "95": { # slot 08
1360
1383
  SZ_DESCRIPTION: "Boost mode Supply/exhaust fan rate (%)",
@@ -1362,6 +1385,7 @@ _2411_PARAMS_SCHEMA: dict[str, dict[str, Any]] = {
1362
1385
  SZ_MAX_VALUE: 1.0,
1363
1386
  SZ_PRECISION: 0.005,
1364
1387
  SZ_DATA_TYPE: "0F",
1388
+ SZ_DATA_UNIT: "%",
1365
1389
  },
1366
1390
  }
1367
1391
 
@@ -1456,3 +1480,19 @@ _31DA_FAN_INFO: dict[int, str] = {
1456
1480
  # RAMSES_ZONES_ALL = RAMSES_ZONES.pop("ALL")
1457
1481
  # RAMSES_ZONES_DHW = RAMSES_ZONES[ZON_ROLE.DHW]
1458
1482
  # [RAMSES_ZONES[k].update(RAMSES_ZONES_ALL) for k in RAMSES_ZONES if k != ZON_ROLE.DHW]
1483
+
1484
+ __all__ = [
1485
+ "CODES_BY_DEV_SLUG",
1486
+ "CODES_SCHEMA",
1487
+ "CODE_NAME_LOOKUP",
1488
+ "CODES_BY_DEV_SLUG",
1489
+ "CODES_SCHEMA",
1490
+ "HVAC_KLASS_BY_VC_PAIR",
1491
+ "_2411_PARAMS_SCHEMA",
1492
+ "SZ_DESCRIPTION",
1493
+ "SZ_MIN_VALUE",
1494
+ "SZ_MAX_VALUE",
1495
+ "SZ_PRECISION",
1496
+ "SZ_DATA_TYPE",
1497
+ "SZ_DATA_UNIT",
1498
+ ]
ramses_tx/schemas.py CHANGED
@@ -215,6 +215,7 @@ def ConvertNullToDict() -> Callable[[_T | None], _T | dict[Never, Never]]:
215
215
 
216
216
 
217
217
  SZ_ALIAS: Final = "alias"
218
+ SZ_BOUND_TO: Final = "bound"
218
219
  SZ_CLASS: Final = "class"
219
220
  SZ_FAKED: Final = "faked"
220
221
  SZ_SCHEME: Final = "scheme"
@@ -296,6 +297,8 @@ def sch_global_traits_dict_factory(
296
297
  vol.Optional(SZ_CLASS, default="HVC"): vol.Any(
297
298
  None, *hvac_slugs, *(str(DEV_TYPE_MAP[s]) for s in hvac_slugs)
298
299
  ), # TODO: consider removing None
300
+ # Add 'bound' trait for FAN devices
301
+ vol.Optional(SZ_BOUND_TO): vol.Any(None, vol.Match(DEVICE_ID_REGEX.ANY)),
299
302
  }
300
303
  )
301
304
  SCH_TRAITS_HVAC = SCH_TRAITS_HVAC.extend(
ramses_tx/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  """RAMSES RF - a RAMSES-II protocol decoder & analyser (transport layer)."""
2
2
 
3
- __version__ = "0.51.7"
3
+ __version__ = "0.51.8"
4
4
  VERSION = __version__