Coverage for src/ramses_tx/fingerprints.py: 75%

8 statements  

« prev     ^ index     » next       coverage.py v7.11.3, created at 2026-01-05 21:46 +0100

1#!/usr/bin/env python3 

2"""RAMSES RF - RAMSES-II compatible Packet processor.""" 

3 

4from __future__ import annotations 

5 

6__all__ = ["check_signature"] 

7 

8# incl. date_1. NB: date_2 can vary (firmware date), and _unknown_1 can vary for R8810A 

9# fmt: off 

10__DEVICE_INFO_RAW: dict[str, tuple[str, str, str, str]] = { 

11 # Heating (device type implies a slug only for these)... 

12 "0002FF0119FFFFFFFF": ("CTL", "01", "2014-01-16", "EvoTouch Colour"), # . ATC928-G3-0xx Evo Mk3 - EvoTouch Colour (WiFi, 12 zones) 

13 "0002FF0163FFFFFFFF": ("CTL", "01", "2013-08-01", "Evo Color"), # . ATP928-G2-080 Evo Mk2 - Color (no WiFi) 

14 "0002FFFF17FFFFFFFF": ("CTL", "01", "2012-05-11", "IONA RAI Prototype"), # . ATC928-G1-000 Evo Mk1 - Monochrone (?prototype, 8 zones) 

15 "0003FF0203FFFF0001": ("UFC", "02", "2017-11-06", "HCE80 V3.10 061117"), 

16 "0001C89D6E0600FEFF": ("UFC", "02", "2022-12-01", "HCE100-RADIO"), 

17 "0002FF0412FFFFFFFF": ("TRV", "04", "2014-03-13", "HR92 Radiator Ctrl."), 

18 "0002FF050BFFFFFFFF": ("TRV", "04", "2017-03-07", "HR91 Radiator Ctrl."), 

19 "0001C8810B0700FEFF": ("OTB", "10", "2019-08-20", "R8820"), 

20 "0002FF0A0CFFFFFFFF": ("OTB", "10", "2014-07-31", "R8810A Bridge"), 

21 "0002FF1F00FFFFFFFF": ("DTS", "22", "0000-00-00", "DT4 22"), 

22 "0002FF1E01FFFFFFFF": ("RFG", "30", "2013-12-04", "Internet Gateway"), 

23 "0002FF1E02FFFFFFFF": ("RFG", "30", "2014-10-17", "Internet Gateway"), 

24 "0002FF1E03FFFFFFFF": ("RFG", "30", "2017-04-21", "Internet Gateway"), 

25 "0001C8380A0100F1FF": ("RND", "34", "2014-11-03", "T87RF2025"), # . Round 

26 "0001C8380F0100F1FF": ("RND", "34", "2017-05-03", "T87RF2025"), # . Round 

27 # Odd - Vasco CTL/RFG 

28 "0001C848260066FEFE": ("CTL", "30", "2019-11-28", "BRDG-02EM23"), # . Vasco Gateway (CTL/RFG/RFS?) 

29 # Odd - Jasper kit (device type implies a slug here too) 

30 "0002FF0801FFFFFFFE": ("JIM", "08", "2016-11-28", "Jasper EIM"), 

31 "0002FF0802FFFFFFFE": ("JIM", "08", "2017-11-10", "Jasper EIM"), 

32 "0002FF1F02FFFFFFFF": ("JST", "31", "2016-08-04", "Jasper Stat TXXX"), 

33 # FAN - some are HRUs, others extraction only 

34 "000100140C06010000": ("FAN", "20", "0000-00-00", ""), # . 31D9 

35 "000100140D06130000": ("FAN", "20", "0000-00-00", ""), # . 31D9 

36 "0001001B190B010000": ("FAN", "20", "0000-00-00", ""), # . 31D9 

37 "0001001B221201FEFF": ("FAN", "20", "2015-05-12", "CVE-RF"), # . 31D9, 31DA 

38 "0001001B271501FEFF": ("FAN", "20", "2016-11-03", "CVE-RF"), # . 31D9, 31DA (RP|12A0, RP|3120, both N/A) 

39 "0001001B281501FEFF": ("FAN", "20", "2016-11-11", "CVE-RF"), # . 31D9, 31DA 

40 "0001001B2E1901FEFF": ("FAN", "37", "2017-11-29", "CVE-RF"), # . 31D9, 31DA 

41 "0001001B311901FEFF": ("FAN", "37", "2018-05-14", "CVE-RF"), # . 31D9, 31DA 

42 "0001001B361B01FEFF": ("FAN", "37", "2019-04-11", "CVE-RF"), # . 31D9, 31DA, and 12C8 

43 "0001001B371B01FEFF": ("FAN", "37", "2019-08-29", "CVE-RF"), # . 31D9, 31DA 

44 "0001001B381B01FEFF": ("FAN", "37", "2020-02-14", "CVE-RF"), # . 31D9, 31DA (and I|042F, I|3120) 

45 "0001001B391B01FEFF": ("FAN", "37", "2021-11-04", "CVE-RF"), 

46 "0001C8830C0A65FEFF": ("FAN", "37", "2020-12-17", "VMD-07RPS13"), # . ClimaRad VenturaV1x 

47 "0001C81C090466FEFF": ("FAN", "29", "0000-00-00", "VMC-17RP01"), # . appears to be an EXT 

48 "0001C8260A0367FFFF": ("FAN", "29", "0000-00-00", "VMC-15RP01"), 

49 "0001C8260D0467FFFF": ("FAN", "29", "0000-00-00", "VMC-15RP01"), # . 31D9 

50 "0001C83A0F0866FFFF": ("FAN", "32", "0000-00-00", "VMD-17RPS01"), # . 31D9, 31DA 

51 "0001C85F0E0267FFFF": ("FAN", "32", "0000-00-00", "VMC-15RPS34"), # . Orcon MVS-15 

52 "0001C87D130D67FEFF": ("FAN", "32", "2019-02-28", "VMD-15RMS64"), # . Orcon HRC-300-EcoMax 

53 "0001C87D140D67FEFF": ("FAN", "32", "2019-12-23", "VMD-15RMS64"), # . 31D9, 31DA (and I|042F) 

54 "0001C895050567FEFF": ("FAN", "32", "2020-07-01", "VMD-15RMS86"), # . 31DA, 12A0, 22F7, 2411 (and I|042F, I|313F, I|3120) 

55 "0001C8950B0A67FEFF": ("FAN", "32", "2021-01-21", "VMD-15RMS86"), # . 31D9, 31DA, 12A0, 313F (and I|042F, I|3120) 

56 "0001C81D150765FFFF": ("FAN", "29", "0000-00-00", "VMC-07RP01"), # . ClimaRad MiniBox 

57 "0001C83A190F66FFFF": ("FAN", "32", "0000-00-00", "VMD-17RPS01"), # . Vasco D60Vasco D60 

58 

59 # PIV - usu. Nuaire 

60 "0001C90011006CFEFF": ("FAN", "30", "2016-09-09", "BRDG-02JAS01"), # . NOTE: 30: 31D9, 31DA, 1F09 (a PIV) 

61 "0001C9001D006CFEFE": ("FAN", "30", "2019-07-18", "BRDG-02JAS01"), # . 31D9 

62 # CO2 - some have PIR 

63 "00010028080101FEFF": ("CO2", "37", "2019-04-29", "VMS-12C39"), # . 1298, 31E0, 2E10, 3120, and I|22F1! 

64 "00010028090101FEFF": ("CO2", "37", "2021-01-20", "VMS-12C39"), # . 1298, 31E0, 2E10, 3120 (and I|042F) 

65 "0001C822030166FEFF": ("CO2", "29", "2015-05-07", "VMS-17C01"), # . 1298, 31E0 

66 "0001C822060166FEFF": ("CO2", "37", "2016-12-22", "VMS-17C01"), # . 1298, 31E0 (Vasco RF includes REM buttons TODO) 

67 "0001C8500B0167FEFF": ("CO2", "29", "2017-03-09", "VMS-15C16"), # . CO2 sensor (no remote) 

68 "0001C85701016CFFFF": ("CO2", "32", "2016-06-17", "VMS-23C33"), # . 1298, 31E0 (and I|042F) 

69 # HUM 

70 "0001C825050266FFFF": ("HUM", "29", "2017-04-19", "VMS-17HB01"), # . 12A0, 31E0, 1060 

71 "0001C85802016CFFFF": ("HUM", "32", "2016-07-12", "VMS-23HB33"), # . 12A0, 31E0, 1060 (and I|042F) 

72 "0001C85803016CFFFF": ("HUM", "32", "2016-09-12", "VMS-23HB33"), # . 12A0, 31E0, 1060 (and I|042F) 

73 # REM 

74 "0001C827050167FFFF": ("REM", "29", "0000-00-00", "VMN-15LF01"), # . 22F1, 22F3 

75 "0001C827070167FFFF": ("REM", "29", "0000-00-00", "VMN-15LF01"), # . 22F1, 22F3 

76 "0001C827090167FFFF": ("REM", "29", "2019-02-13", "VMN-15LF01"), # . 22F1, 22F3 (and I|042F) 

77 "0001C8400F0166FFFF": ("REM", "29", "2021-11-01", "VMN-17LMP01"), # . Vasco remote 4-way 

78 "0001C85901016CFFFF": ("REM", "32", "2016-05-31", "VMN-23LMH23"), # . zxdavb 22F1, 1060, 4-way? 

79 "0001C85A01016CFFFF": ("REM", "32", "2016-06-01", "VMN-23LMH23"), # . zxdavb 22F1, 1060, 4-way? 

80 # REM (display, or with CO2 sensor) 

81 "0001C88D020167FEFF": ("CO2", "37", "2020-04-21", "VMI-15MC01"), # . 1298, 31E0 

82 "0001C88D030167FEFF": ("REM", "37", "2021-07-28", "VMI-15MC01"), # . 1298/31E0, 22F1, 22F3 (with integrated CO2 sensor) 

83 "0001C894030167FFFF": ("REM", "37", "2020-08-27", "VMI-15WSJ53"), # . 22F1, 22F3? (HRC Display recessed 15RF) 

84 # RFS... 

85 "000100220B0001FEFF": ("RFS", "21", "2015-01-20", "CCU-12T20"), # . Itho spIDer 1060, 12C0, 22C9, 30C9, 3110, 3120, 3EF0, 01FF 

86 "000100222B0001FEFF": ("RFS", "21", "2019-07-10", "CCU-12T20"), # . Itho spIDer 1060, 12C0, 22C9, 2E10, 30C9, 3110, 3120, 3EF0 

87 "00010022340001FEFF": ("RFS", "21", "2020-08-05", "CCU-12T20"), # . spIDer 1060, 12C0, 22C9, 22F1, 22F3, 2E10, 30C9, 3110, 3120, 3EF0 

88 "00010022370101F1FB": ("RFS", "21", "2021-05-21", "CCU-12T20"), # . spIDer 1060, 12C0, 22C9, 30C9, 3110, 3120, 3EF0 

89 "00010022370101FEFF": ("RFS", "21", "2021-05-21", "CCU-12T20"), # . spIDer 1060, 1290, 12C0, 22C9, 30C9, 3110, 3120 (maybe incomplete) 

90 

91 # TBA - broken as 18:... 

92 "0001FA100A0001FEFE": ("FAN", "18", "2019-04-11", "BRDG-02A55"), # . NOTE: 18: 31D9, 31DA, 1F09 

93 "0001FA100B0001FEFE": ("FAN", "18", "2019-07-22", "BRDG-02A55"), # . NOTE: 18: 31D9, 31DA, 1F09 

94 "0001C8820C006AFEFF": ("FAN", "18", "2019-08-20", "HRA82"), # . NOTE: 18: (only I|042F, I|10E0) 

95 # 

96 "00010021030200FFFF": ("CO2", "37", "0000-00-00", "VMS-02J52"), # . 1298, 22F3, 31E0 

97 "0001C8930A0967FEFF": ("FAN", "32", "2020-10-06", "VMZ-15V13"), # . *Zone Valve* 1298, 22F3, 31E0 

98 "0001C893090867FEFF": ("FAN", "32", "2020-06-19", "VMZ-15V13"), # . *Zone Valve* 1298, 22F3, 31E0 

99} 

100# fmt: on 

101 

102__DEVICE_INFO: dict[str, list[str]] = { 

103 t: [k for k, v in __DEVICE_INFO_RAW.items() if v[1] == t] 

104 for t in sorted(dict.fromkeys(v[1] for v in __DEVICE_INFO_RAW.values())) 

105} # convert to {dev_type: [signature, ...]} 

106 

107 

108def check_signature(dev_type: str, signature: str) -> None: 

109 """Raise ValueError if the device type is not known to have the signature. 

110 

111 e.g. '01' can imply '0002FF0119FFFFFFFF', but not '0001C8820C006AFEFF' 

112 """ 

113 if not (sigs := __DEVICE_INFO.get(dev_type)) or signature not in sigs: 

114 raise ValueError( 

115 f"device type {dev_type} not known to have signature: {signature}" 

116 ) 

117 

118 

119######################################################################################## 

120# from: https://www.airios.eu/products 

121 

122# BRDG - RF interface to RS485/Ethernet: for heating and ventilation. 

123# VMD - Heat recovery unit 

124# VMC - Mechanical extraction: To integrate in a single fan system 

125# VMI - User interface with display 

126# VMN - Remote 

127# VMS - Sensors platform: CO2, humidity and temperature (and PIR?) 

128 

129# BRDG-02A55 - Fan of some description 

130# BRDG-02EM23 - Vasco 

131# BRDG-02JAS01 - PIV - Nuaire DriMaster PIV 

132# BRDG-02M11 - Itho Honeywell RF-repeater 

133 

134# CCU-12T20 - RFS - RF gateway (spIDer, Fifthplay Home Area Manager) 

135# CVE-RF - FAN - 

136# HRA82 - 

137# VMC-15RPS34 - 

138# VMC-15RP01 - Orcon unit (senseair.com) 

139# VMC-17RP01 - Vasco C400RF (fan) 

140 

141# VMD-07RPS13 - FAN - ClimaRad VenturaV1x 

142# VMD-15RMS64 - FAN - Orcon HRC-350 (Ventiline) / Orcon MVS 15RHB 

143# VMD-15RMS86 - 

144# VMD-17RPS01 - 

145 

146# VMI-15WSJ53 - REM - Orcon HRC Interactive/Display 15RF 

147# VMI-15MC01 - REM - Orcon 15RF with integrated CO2 

148 

149# VMN-15LF01 - REM - Orcon 15RF 6 button remote 

150# VMN-17LMP01 - REM - Vasco 4 button remote (NL 2021) 

151# VMN-23LM33 - REM? 

152# VMN-23LMH23 - REM - 4 button RF Switch 

153 

154# VMS-02J52 - ??? 

155# VMS-02MC05 - CO2 - 

156# VMS-15C16 - CO2 - CO2 Sensor (no remote) 

157# VMS-12C39 - CO2 - CO2 Sensor, incl. integrated control, PIR? 

158# VMS-15CM17 - CO2 - CO2 Sensor 

159# VMS-17C01 - CO2 - CO2 Sensor, incl. integrated control Vasco 

160# VMS-17HB01 - 

161# VMS-23C33 - CO2 - CO2 Sensor (no PIR) (e.g. Nuaire DRI-ECO-CO2) 

162# VMS-23HB33 - HUM - RH/Temp Sensor (e.g. Nuaire DRI-ECO-RH) 

163 

164# VMZ-15V13 - Itho Zone Valve (like a FAN?) 

165 

166# MVS-15RHB - FAN - Orcon Smartline FAN (incl. Moisture sensor and transmitter) 

167 

168 

169# CVD coupled ventilation system (device) 

170# CVE coupled ventilation system (equipment) 

171# DCV demand controlled ventilation 

172# IAQ indoor air quality 

173# HRA 

174# RFT - RF 

175# HRU heat recovery unit (MVHR), aka WTW (in. dutch) 

176 

177 

178# manufacturer group: 0001 

179# manufacturer sub_id: C8 

180# product id: 95/7D/50/51/8D/etc. 

181__ORCON_WIP = { 

182 "0001C84F": ("VMD-02RPS54", ""), 

183 "0001C850": ("VMS-15C16 ", "CO2 Room sensor"), 

184 "0001C851": ("VMS-15CM17 ", "CO2 Control sensor"), 

185 "0001C87D": ("VMD-15RMS64", "HRC-EcoMax/Comfort (2018-2019)"), 

186 "0001C88C": ("VMD-02RPS14", ""), 

187 "0001C88D": (" ", "CO2 Built-in control sensor"), 

188 "0001C88E": ("VMD-02RPS66", ""), 

189 "0001C88F": ("VMD-02RPS07", ""), 

190 "0001C892": ("VMD-02RPS78", ""), 

191 "0001C895": ("VMD-15RMS86", "HRC-EcoSmart/Comfort, HRC-EcoMax/Comfort (from 2021)"), 

192 "0001C897": ("VMD-02RMS37", ""), 

193}