Repository: thomasgermain/pymultiMATIC

Issue:
Integration of sensoApp with VR920
Hello,

@xaviergriffon  [propose me](https://github.com/thomasgermain/vaillant-component/pull/194#issuecomment-1450907506) to create a new issue in this project to help the team to integrate sensoApp.

There is the system.json (renamed system.json.txt to be accepted by github) generated by the dump script
[system.json.txt](https://github.com/thomasgermain/pymultiMATIC/files/10865764/system.json.txt)

Sylvain


Discussion:

Patch:
diff --git a/pymultimatic/api/schemas.py b/pymultimatic/api/schemas.py
index 46d6c79..ce9858e 100644
--- a/pymultimatic/api/schemas.py
+++ b/pymultimatic/api/schemas.py
@@ -224,6 +224,15 @@ _ZONE_PART = Schema(
                 Optional("cooling"): _OPTIONAL_CONFIG_FUNCTION_PART,
             }
         ),
+        Schema(  # rbr zone vr920, in that case, almost everything is optional
+            {
+                "_id": non_empty_str,
+                Optional("configuration"): _ZONE_CONFIGURATION,
+                Optional("currently_controlled_by"): non_empty_str,
+                Optional("heating"): _OPTIONAL_CONFIG_FUNCTION_PART,
+                Optional("cooling"): _OPTIONAL_CONFIG_FUNCTION_PART,
+            }
+        ),
         Schema(  # quick veto set on a zone, configuration of heating (or cooling) is optional
             {
                 "_id": non_empty_str,
diff --git a/pymultimatic/model/mapper.py b/pymultimatic/model/mapper.py
index fbd1f38..c8f1a7f 100644
--- a/pymultimatic/model/mapper.py
+++ b/pymultimatic/model/mapper.py
@@ -320,7 +320,15 @@ def map_zone(raw_zone) -> Optional[Zone]:
             configuration.get("active_function", ActiveFunction.STANDBY.name)
         ]
         quick_veto = _map_quick_veto_zone(configuration.get("quick_veto"))
-        rbr = raw_zone.get("currently_controlled_by", {}).get("name", "") == "RBR"
+
+        currently_controlled_by = raw_zone.get("currently_controlled_by")
+        rbr = currently_controlled_by and (
+            (isinstance(currently_controlled_by, str) and currently_controlled_by == "RBR")
+            or (
+                isinstance(currently_controlled_by, dict)
+                and currently_controlled_by.get("name", "") == "RBR"
+            )
+        )
 
         raw_heating = raw_zone.get("heating", {})
         raw_cooling = raw_zone.get("cooling", {})
diff --git a/setup.py b/setup.py
index 8642aaf..878d70f 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@ with open(path.join(this_directory, "README.md"), encoding="utf-8") as f:
 
 setup(
     name="pymultiMATIC",
-    version="0.7.0b2",
+    version="0.7.0b3",
     description="Python interface with Vaillant multiMATIC",
     long_description_content_type="text/markdown",
     long_description=long_description,


Test patch:
diff --git a/tests/conftest.py b/tests/conftest.py
index 13f6cc2..52c0344 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,7 +1,7 @@
 import os
 from datetime import datetime
 from http.cookies import SimpleCookie
-from typing import AsyncGenerator, Optional
+from typing import AsyncGenerator, Optional, Iterator
 
 import pytest
 from aiohttp import ClientSession
@@ -261,3 +261,20 @@ def _ventilation() -> Ventilation:
 
 def path(file: str) -> str:
     return os.path.join(os.path.dirname(__file__), file) + ".json"
+
+
+def sub_folders(path: str) -> Iterator[str]:
+    dirfiles = os.listdir(os.path.join(os.path.dirname(__file__), path))
+    fullpaths = (os.path.join(path, name) for name in dirfiles)
+    for file in fullpaths:
+        if os.path.isdir(file):
+            yield file
+
+
+def senso_responses_folders() -> Iterator[str]:
+    return sub_folders("files/responses/senso")
+
+
+def senso_responses_files_paths(file: str) -> Iterator[str]:
+    for folder in senso_responses_folders():
+        yield path(os.path.join(folder, file))
diff --git a/tests/files/responses/senso/vr920/dhw.json b/tests/files/responses/senso/vr920/dhw.json
new file mode 100644
index 0000000..884ed85
--- /dev/null
+++ b/tests/files/responses/senso/vr920/dhw.json
@@ -0,0 +1,49 @@
+{
+    "body": {
+        "hotwater": {
+            "configuration": {
+                "operation_mode": "TIME_CONTROLLED",
+                "hotwater_temperature_setpoint": 60.0
+            }
+        },
+        "circulation": {
+            "configuration": {
+                "operation_mode": "TIME_CONTROLLED"
+            }
+        },
+        "configuration": {
+            "away": {
+                "start_datetime": "2023-01-25T22:01:51.000Z",
+                "end_datetime": "2023-01-26T22:01:51.000Z"
+            }
+        }
+    },
+    "meta": {
+        "resourceState": [
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712948678,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/circulation/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708652841,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/hotwater/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708652841,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/configuration"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/dhws.json b/tests/files/responses/senso/vr920/dhws.json
new file mode 100644
index 0000000..615ecaf
--- /dev/null
+++ b/tests/files/responses/senso/vr920/dhws.json
@@ -0,0 +1,49 @@
+{
+    "body": {
+        "hotwater": {
+            "configuration": {
+                "operation_mode": "TIME_CONTROLLED",
+                "hotwater_temperature_setpoint": 60.0
+            }
+        },
+        "circulation": {
+            "configuration": {
+                "operation_mode": "TIME_CONTROLLED"
+            }
+        },
+        "configuration": {
+            "away": {
+                "start_datetime": "2023-01-25T22:01:51.000Z",
+                "end_datetime": "2023-01-26T22:01:51.000Z"
+            }
+        }
+    },
+    "meta": {
+        "resourceState": [
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712948633,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/circulation/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708652841,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/hotwater/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708652841,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/configuration"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/facilities_list.json b/tests/files/responses/senso/vr920/facilities_list.json
new file mode 100644
index 0000000..ae91c21
--- /dev/null
+++ b/tests/files/responses/senso/vr920/facilities_list.json
@@ -0,0 +1,24 @@
+{
+    "body": {
+        "facilitiesList": [
+            {
+                "serialNumber": "SERIAL_NUMBER",
+                "name": "Maison",
+                "responsibleCountryCode": "BE",
+                "supportedBrand": "GREEN_BRAND_COMPATIBLE",
+                "capabilities": [
+                    "SPINE",
+                    "SYSTEMCONTROL_SENSO",
+                    "ROOM_BY_ROOM"
+                ],
+                "networkInformation": {
+                    "macAddressEthernet": "01:23:45:67:89:AB",
+                    "macAddressWifiAccessPoint": "84:c3:e8:04:36:98",
+                    "macAddressWifiClient": "84:c3:e8:04:36:99"
+                },
+                "firmwareVersion": "0357.27.06"
+            }
+        ]
+    },
+    "meta": {}
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/gateway_type.json b/tests/files/responses/senso/vr920/gateway_type.json
new file mode 100644
index 0000000..745f8df
--- /dev/null
+++ b/tests/files/responses/senso/vr920/gateway_type.json
@@ -0,0 +1,6 @@
+{
+    "body": {
+        "gatewayType": "VR920"
+    },
+    "meta": {}
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/hvac.json b/tests/files/responses/senso/vr920/hvac.json
new file mode 100644
index 0000000..cdd5726
--- /dev/null
+++ b/tests/files/responses/senso/vr920/hvac.json
@@ -0,0 +1,21 @@
+{
+    "body": {},
+    "meta": {
+        "onlineStatus": {
+            "status": "ONLINE"
+        },
+        "firmwareUpdateStatus": {
+            "status": "UPDATE_NOT_PENDING"
+        },
+        "syncState": [
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712948358,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/hvacstate/v1/overview"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/live_report.json b/tests/files/responses/senso/vr920/live_report.json
new file mode 100644
index 0000000..3f05b09
--- /dev/null
+++ b/tests/files/responses/senso/vr920/live_report.json
@@ -0,0 +1,54 @@
+{
+    "body": {
+        "devices": [
+            {
+                "reports": [
+                    {
+                        "unit": "bar",
+                        "name": "WaterPressureSensor",
+                        "value": 2.3,
+                        "_id": "WaterPressureSensor",
+                        "measurement_category": "PRESSURE",
+                        "associated_device_function": "HEATING"
+                    }
+                ],
+                "_id": "Control_SYS_senso",
+                "name": "sensoCOMFORT"
+            },
+            {
+                "reports": [
+                    {
+                        "unit": "\u00b0C",
+                        "name": "FlowTemperatureSensor",
+                        "value": 37.0,
+                        "_id": "FlowTemperatureSensor",
+                        "measurement_category": "TEMPERATURE",
+                        "associated_device_function": "HEATING"
+                    }
+                ],
+                "_id": "Control_CC1",
+                "name": "Heating Circuit 1"
+            }
+        ]
+    },
+    "meta": {
+        "resourceState": [
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708645,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/livereport/v1/devices/Control_SYS_senso/reports/WaterPressureSensor"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708649,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/livereport/v1/devices/Control_CC1/reports/FlowTemperatureSensor"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/rooms.json b/tests/files/responses/senso/vr920/rooms.json
new file mode 100644
index 0000000..ba94352
--- /dev/null
+++ b/tests/files/responses/senso/vr920/rooms.json
@@ -0,0 +1,864 @@
+{
+    "body": {
+        "rooms": [
+            {
+                "roomIndex": 0,
+                "configuration": {
+                    "name": "Salle de s\u00e9jour",
+                    "temperatureSetpoint": 15.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 15.7,
+                    "childLock": true,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Radiateur living",
+                            "sgtin": "3014F59C28000A1CF00001DB",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        },
+                        {
+                            "name": "Radiateur salon",
+                            "sgtin": "3014F59C28000A1CF00001DD",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "LIVING_ROOM"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 17.0
+                        },
+                        {
+                            "startTime": "20:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ]
+                }
+            },
+            {
+                "roomIndex": 1,
+                "configuration": {
+                    "name": "Bureau",
+                    "temperatureSetpoint": 15.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 16.0,
+                    "childLock": false,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Bureau",
+                            "sgtin": "3014F59C28000A1CF0000300",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "OFFICE"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ]
+                }
+            },
+            {
+                "roomIndex": 2,
+                "configuration": {
+                    "name": "Couloir",
+                    "temperatureSetpoint": 15.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 15.3,
+                    "childLock": true,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Couloir",
+                            "sgtin": "3014F59C28000A1CF0000321",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "HOBBY_ROOM"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "22:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ]
+                }
+            },
+            {
+                "roomIndex": 3,
+                "configuration": {
+                    "name": "Salle de bain",
+                    "temperatureSetpoint": 15.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 17.8,
+                    "childLock": false,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Salle de bain",
+                            "sgtin": "3014F59C28000A1CF00001E2",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "BATHROOM"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "06:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ]
+                }
+            },
+            {
+                "roomIndex": 4,
+                "configuration": {
+                    "name": "Cuisine",
+                    "temperatureSetpoint": 15.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 17.4,
+                    "childLock": false,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Cuisine",
+                            "sgtin": "3014F59C28000A1CF000027F",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "KITCHEN"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 15.0
+                        }
+                    ]
+                }
+            },
+            {
+                "roomIndex": 5,
+                "configuration": {
+                    "name": "Chambre Luna",
+                    "temperatureSetpoint": 16.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 16.0,
+                    "childLock": false,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Chambre Luna",
+                            "sgtin": "3014F59C28000A1CF00002F6",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "BEDROOM"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 16.0
+                        },
+                        {
+                            "startTime": "07:00",
+                            "temperatureSetpoint": 13.0
+                        },
+                        {
+                            "startTime": "17:00",
+                            "temperatureSetpoint": 16.0
+                        }
+                    ]
+                }
+            },
+            {
+                "roomIndex": 6,
+                "configuration": {
+                    "name": "Chambre parents",
+                    "temperatureSetpoint": 19.0,
+                    "operationMode": "AUTO",
+                    "currentTemperature": 19.5,
+                    "childLock": false,
+                    "isWindowOpen": false,
+                    "devices": [
+                        {
+                            "name": "Chambre parents",
+                            "sgtin": "3014F59C28000A1CF00001E8",
+                            "deviceType": "VALVE",
+                            "isBatteryLow": false,
+                            "isRadioOutOfReach": false
+                        }
+                    ],
+                    "iconId": "BEDROOM"
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "startTime": "00:00",
+                            "temperatureSetpoint": 19.0
+                        },
+                        {
+                            "startTime": "06:30",
+                            "temperatureSetpoint": 15.0
+                        },
+                        {
+                            "startTime": "19:30",
+                            "temperatureSetpoint": 19.0
+                        }
+                    ]
+                }
+            }
+        ]
+    },
+    "meta": {
+        "resourceState": [
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712223000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/0/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658026000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/0/timeprogram"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712480000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/1/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658024000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/1/timeprogram"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712618000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/2/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658027000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/2/timeprogram"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677710260000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/3/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658024000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/3/timeprogram"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712812000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/4/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658028000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/4/timeprogram"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677704859000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/5/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658023000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/5/timeprogram"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712573000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/6/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677658025000,
+                "link": {
+                    "rel": "child",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/rbr/v1/rooms/6/timeprogram"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/system.json b/tests/files/responses/senso/vr920/system.json
new file mode 100644
index 0000000..579d9de
--- /dev/null
+++ b/tests/files/responses/senso/vr920/system.json
@@ -0,0 +1,178 @@
+{
+    "body": {
+        "zones": [
+            {
+                "heating": {
+                    "configuration": {
+                        "operation_mode": "MANUAL",
+                        "setback_temperature_setpoint": 15.0,
+                        "manual_mode_temperature_setpoint": 19.0
+                    },
+                    "timeprogram": {
+                        "sunday": [
+                            {
+                                "start_time": "07:30",
+                                "end_time": "22:00",
+                                "setpoint": 20.0
+                            }
+                        ],
+                        "friday": [
+                            {
+                                "start_time": "06:00",
+                                "end_time": "22:00",
+                                "setpoint": 20.0
+                            }
+                        ],
+                        "saturday": [
+                            {
+                                "start_time": "07:30",
+                                "end_time": "23:30",
+                                "setpoint": 20.0
+                            }
+                        ],
+                        "thursday": [
+                            {
+                                "start_time": "06:00",
+                                "end_time": "22:00",
+                                "setpoint": 20.0
+                            }
+                        ],
+                        "monday": [
+                            {
+                                "start_time": "06:00",
+                                "end_time": "22:00",
+                                "setpoint": 20.0
+                            }
+                        ],
+                        "tuesday": [
+                            {
+                                "start_time": "06:00",
+                                "end_time": "22:00",
+                                "setpoint": 20.0
+                            }
+                        ],
+                        "wednesday": [
+                            {
+                                "start_time": "06:00",
+                                "end_time": "22:00",
+                                "setpoint": 20.0
+                            }
+                        ]
+                    }
+                },
+                "configuration": {
+                    "name": "Maison",
+                    "enabled": true,
+                    "active_function": "HEATING",
+                    "eco_mode": false,
+                    "current_desired_setpoint": 19.0,
+                    "away": {
+                        "start_datetime": "2023-01-25T22:01:51.000Z",
+                        "end_datetime": "2023-01-26T22:01:51.000Z",
+                        "temperature_setpoint": 20.0
+                    },
+                    "manual_cooling_active": false
+                },
+                "currently_controlled_by": "RBR",
+                "_id": "Control_ZO1"
+            }
+        ],
+        "configuration": {
+            "manual_cooling": {
+                "start_date": "2019-01-01",
+                "end_date": "2019-01-01"
+            }
+        },
+        "status": {
+            "datetime": "2023-03-01T23:10:44.000Z",
+            "outside_temperature": 1.6
+        },
+        "dhw": {
+            "hotwater": {
+                "configuration": {
+                    "operation_mode": "TIME_CONTROLLED",
+                    "hotwater_temperature_setpoint": 60.0
+                }
+            },
+            "circulation": {
+                "configuration": {
+                    "operation_mode": "TIME_CONTROLLED"
+                }
+            },
+            "configuration": {
+                "away": {
+                    "start_datetime": "2023-01-25T22:01:51.000Z",
+                    "end_datetime": "2023-01-26T22:01:51.000Z"
+                }
+            }
+        }
+    },
+    "meta": {
+        "resourceState": [
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708645221,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/status"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708645221,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708663039,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/heating/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677711220000,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/heating/timeprogram"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708663039,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/configuration"
+                }
+            },
+            {
+                "state": "SYNCED",
+                "timestamp": 1677712949142,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/circulation/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708652841,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/hotwater/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708652841,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/dhw/configuration"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/zones.json b/tests/files/responses/senso/vr920/zones.json
new file mode 100644
index 0000000..cf3a49a
--- /dev/null
+++ b/tests/files/responses/senso/vr920/zones.json
@@ -0,0 +1,107 @@
+{
+    "body": [
+        {
+            "heating": {
+                "configuration": {
+                    "operation_mode": "MANUAL",
+                    "setback_temperature_setpoint": 15.0,
+                    "manual_mode_temperature_setpoint": 19.0
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "start_time": "07:30",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "start_time": "07:30",
+                            "end_time": "23:30",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ]
+                }
+            },
+            "configuration": {
+                "name": "Maison",
+                "enabled": true,
+                "active_function": "HEATING",
+                "eco_mode": false,
+                "current_desired_setpoint": 19.0,
+                "away": {
+                    "start_datetime": "2023-01-25T22:01:51.000Z",
+                    "end_datetime": "2023-01-26T22:01:51.000Z",
+                    "temperature_setpoint": 20.0
+                },
+                "manual_cooling_active": false
+            },
+            "currently_controlled_by": "RBR",
+            "_id": "Control_ZO1"
+        }
+    ],
+    "meta": {
+        "resourceState": [
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708663039,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/heating/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677711220000,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/heating/timeprogram"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708663039,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/configuration"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/senso/vr920/zones_manual.json b/tests/files/responses/senso/vr920/zones_manual.json
new file mode 100644
index 0000000..cf3a49a
--- /dev/null
+++ b/tests/files/responses/senso/vr920/zones_manual.json
@@ -0,0 +1,107 @@
+{
+    "body": [
+        {
+            "heating": {
+                "configuration": {
+                    "operation_mode": "MANUAL",
+                    "setback_temperature_setpoint": 15.0,
+                    "manual_mode_temperature_setpoint": 19.0
+                },
+                "timeprogram": {
+                    "sunday": [
+                        {
+                            "start_time": "07:30",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "friday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "saturday": [
+                        {
+                            "start_time": "07:30",
+                            "end_time": "23:30",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "thursday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "monday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "tuesday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ],
+                    "wednesday": [
+                        {
+                            "start_time": "06:00",
+                            "end_time": "22:00",
+                            "setpoint": 20.0
+                        }
+                    ]
+                }
+            },
+            "configuration": {
+                "name": "Maison",
+                "enabled": true,
+                "active_function": "HEATING",
+                "eco_mode": false,
+                "current_desired_setpoint": 19.0,
+                "away": {
+                    "start_datetime": "2023-01-25T22:01:51.000Z",
+                    "end_datetime": "2023-01-26T22:01:51.000Z",
+                    "temperature_setpoint": 20.0
+                },
+                "manual_cooling_active": false
+            },
+            "currently_controlled_by": "RBR",
+            "_id": "Control_ZO1"
+        }
+    ],
+    "meta": {
+        "resourceState": [
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708663039,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/heating/configuration"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677711220000,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/heating/timeprogram"
+                }
+            },
+            {
+                "state": "OUTDATED",
+                "timestamp": 1677708663039,
+                "link": {
+                    "rel": "self",
+                    "resourceLink": "/facilities/SERIAL_NUMBER/systemcontrol/tli/v1/zones/Control_ZO1/configuration"
+                }
+            }
+        ]
+    }
+}
\ No newline at end of file
diff --git a/tests/files/responses/dhws_minimal_senso.json b/tests/files/responses/senso/vr921/dhw.json
similarity index 100%
rename from tests/files/responses/dhws_minimal_senso.json
rename to tests/files/responses/senso/vr921/dhw.json
diff --git a/tests/files/responses/dhws_senso.json b/tests/files/responses/senso/vr921/dhws.json
similarity index 100%
rename from tests/files/responses/dhws_senso.json
rename to tests/files/responses/senso/vr921/dhws.json
diff --git a/tests/files/responses/facilities_senso.json b/tests/files/responses/senso/vr921/facilities_list.json
similarity index 100%
rename from tests/files/responses/facilities_senso.json
rename to tests/files/responses/senso/vr921/facilities_list.json
diff --git a/tests/files/responses/gateway_senso.json b/tests/files/responses/senso/vr921/gateway_type.json
similarity index 100%
rename from tests/files/responses/gateway_senso.json
rename to tests/files/responses/senso/vr921/gateway_type.json
diff --git a/tests/files/responses/hvacstate_senso.json b/tests/files/responses/senso/vr921/hvac.json
similarity index 100%
rename from tests/files/responses/hvacstate_senso.json
rename to tests/files/responses/senso/vr921/hvac.json
diff --git a/tests/files/responses/livereport_senso.json b/tests/files/responses/senso/vr921/live_report.json
similarity index 100%
rename from tests/files/responses/livereport_senso.json
rename to tests/files/responses/senso/vr921/live_report.json
diff --git a/tests/files/responses/rooms_senso.json b/tests/files/responses/senso/vr921/rooms.json
similarity index 100%
rename from tests/files/responses/rooms_senso.json
rename to tests/files/responses/senso/vr921/rooms.json
diff --git a/tests/files/responses/systemcontrol_senso.json b/tests/files/responses/senso/vr921/system.json
similarity index 100%
rename from tests/files/responses/systemcontrol_senso.json
rename to tests/files/responses/senso/vr921/system.json
diff --git a/tests/files/responses/systemcontrol_senso_quick_veto.json b/tests/files/responses/senso/vr921/systemcontrol_quick_veto.json
similarity index 100%
rename from tests/files/responses/systemcontrol_senso_quick_veto.json
rename to tests/files/responses/senso/vr921/systemcontrol_quick_veto.json
diff --git a/tests/files/responses/systemcontrol_senso_quick_veto_after_put.json b/tests/files/responses/senso/vr921/systemcontrol_quick_veto_after_put.json
similarity index 100%
rename from tests/files/responses/systemcontrol_senso_quick_veto_after_put.json
rename to tests/files/responses/senso/vr921/systemcontrol_quick_veto_after_put.json
diff --git a/tests/files/responses/zones_senso.json b/tests/files/responses/senso/vr921/zones.json
similarity index 100%
rename from tests/files/responses/zones_senso.json
rename to tests/files/responses/senso/vr921/zones.json
diff --git a/tests/files/responses/zones_senso_manual.json b/tests/files/responses/senso/vr921/zones_manual.json
similarity index 100%
rename from tests/files/responses/zones_senso_manual.json
rename to tests/files/responses/senso/vr921/zones_manual.json
diff --git a/tests/test_mapper.py b/tests/test_mapper.py
index 3a8da00..1d95dfd 100644
--- a/tests/test_mapper.py
+++ b/tests/test_mapper.py
@@ -4,7 +4,7 @@ import unittest
 from datetime import date, datetime, timedelta
 
 from pymultimatic.model import ActiveFunction, OperatingModes, QuickModes, mapper
-from tests.conftest import path
+from tests.conftest import path, senso_responses_files_paths
 
 
 class MapperTest(unittest.TestCase):
@@ -36,8 +36,14 @@ class MapperTest(unittest.TestCase):
             zones = mapper.map_zones(json_raw)
             self.assertEqual(2, len(zones))
 
-    def test_map_zones_senso(self) -> None:
-        with open(path("files/responses/zones_senso"), "r") as file:
+    def test_map_zones_senso_vr920(self) -> None:
+        with open(path("files/responses/senso/vr920/zones"), "r") as file:
+            json_raw = json.loads(file.read())
+            zones = mapper.map_zones(json_raw)
+            self.assertEqual(1, len(zones))
+
+    def test_map_zones_senso_vr921(self) -> None:
+        with open(path("files/responses/senso/vr921/zones"), "r") as file:
             json_raw = json.loads(file.read())
             zones = mapper.map_zones(json_raw)
             self.assertEqual(3, len(zones))
@@ -63,12 +69,13 @@ class MapperTest(unittest.TestCase):
             self.assertIsNotNone(dhw.circulation)
 
     def test_map_dhw_senso(self) -> None:
-        with open(path("files/responses/dhws_senso"), "r") as file:
-            raw_dhw = json.loads(file.read())
-            dhw = mapper.map_dhw(raw_dhw)
-            self.assertIsNotNone(dhw.hotwater)
-            self.assertIsNone(dhw.hotwater.temperature)
-            self.assertIsNotNone(dhw.circulation)
+        for file_path in senso_responses_files_paths("dhws"):
+            with open(file_path, "r") as file:
+                raw_dhw = json.loads(file.read())
+                dhw = mapper.map_dhw(raw_dhw)
+                self.assertIsNotNone(dhw.hotwater)
+                self.assertIsNone(dhw.hotwater.temperature)
+                self.assertIsNotNone(dhw.circulation)
 
     def test_map_dhw_no_timeprogram(self) -> None:
         with open(path("files/responses/dhws_minimal"), "r") as file:
@@ -80,13 +87,14 @@ class MapperTest(unittest.TestCase):
             self.assertIsNotNone(dhw.hotwater.time_program)
 
     def test_map_dhw_no_timeprogram_senso(self) -> None:
-        with open(path("files/responses/dhws_minimal_senso"), "r") as file:
-            raw_dhw = json.loads(file.read())
-            dhw = mapper.map_dhw(raw_dhw)
-            self.assertIsNotNone(dhw.hotwater)
-            self.assertIsNotNone(dhw.circulation)
-            self.assertIsNotNone(dhw.circulation.time_program)
-            self.assertIsNotNone(dhw.hotwater.time_program)
+        for file_path in senso_responses_files_paths("dhw"):
+            with open(file_path, "r") as file:
+                raw_dhw = json.loads(file.read())
+                dhw = mapper.map_dhw(raw_dhw)
+                self.assertIsNotNone(dhw.hotwater)
+                self.assertIsNotNone(dhw.circulation)
+                self.assertIsNotNone(dhw.circulation.time_program)
+                self.assertIsNotNone(dhw.hotwater.time_program)
 
     def test_map_dhw_empty_timeprogram(self) -> None:
         with open(path("files/responses/dhws_empty_timprogram"), "r") as file:
@@ -150,7 +158,7 @@ class MapperTest(unittest.TestCase):
 
     def test_map_quick_veto_senso_zone(self) -> None:
         """Test map quick veto zone for Senso."""
-        with open(path("files/responses/systemcontrol_senso_quick_veto"), "r") as file:
+        with open(path("files/responses/senso/vr921/systemcontrol_quick_veto"), "r") as file:
             system = json.loads(file.read())
         # update of the expiry date for the tests
         system.get("body", {}).get("zones", [])[0]["configuration"]["quick_veto"]["expires_at"] = (
@@ -169,7 +177,9 @@ class MapperTest(unittest.TestCase):
     def test_map_quick_veto_senso_zone_after_put(self) -> None:
         """Test map quick veto zone for Senso after put quick veto.
         The expiry date is not immediately filled in."""
-        with open(path("files/responses/systemcontrol_senso_quick_veto_after_put"), "r") as file:
+        with open(
+            path("files/responses/senso/vr921/systemcontrol_quick_veto_after_put"), "r"
+        ) as file:
             system = json.loads(file.read())
         zones = mapper.map_zones_from_system(system)
 
@@ -505,14 +515,15 @@ class MapperTest(unittest.TestCase):
         self.assertEqual("1.2.3", sys_info.firmware_version)
 
     def test_map_facility_detail_senso(self) -> None:
-        with open(path("files/responses/facilities_senso"), "r") as file:
-            facilities = json.loads(file.read())
-
-        sys_info = mapper.map_facility_detail(facilities)
-        self.assertEqual("SERIAL_NUMBER", sys_info.serial_number)
-        self.assertEqual("Maison", sys_info.name)
-        self.assertEqual("01:23:45:67:89:AB", sys_info.ethernet_mac)
-        self.assertEqual("0357.27.06", sys_info.firmware_version)
+        for file_path in senso_responses_files_paths("facilities_list"):
+            with open(file_path, "r") as file:
+                facilities = json.loads(file.read())
+
+            sys_info = mapper.map_facility_detail(facilities)
+            self.assertEqual("SERIAL_NUMBER", sys_info.serial_number)
+            self.assertEqual("Maison", sys_info.name)
+            self.assertEqual("01:23:45:67:89:AB", sys_info.ethernet_mac)
+            self.assertEqual("0357.27.06", sys_info.firmware_version)
 
     def test_map_system_info_specific_serial(self) -> None:
         with open(path("files/responses/facilities_multiple"), "r") as file:
diff --git a/tests/test_schema.py b/tests/test_schema.py
index fb1bf3c..3843a87 100644
--- a/tests/test_schema.py
+++ b/tests/test_schema.py
@@ -5,7 +5,7 @@ import unittest
 from schema import SchemaError
 
 from pymultimatic.api import schemas
-from tests.conftest import path
+from tests.conftest import path, senso_responses_folders
 
 
 class SchemaTest(unittest.TestCase):
@@ -24,11 +24,15 @@ class SchemaTest(unittest.TestCase):
             "systemcontrol_quick_veto",
             "systemcontrol_ventilation",
             "systemcontrol_zone_no_config_rbr",
-            "systemcontrol_senso",
         ]
+        for i in range(len(files)):
+            files[i] = my_path + files[i]
+
+        for folder in senso_responses_folders():
+            files.append(folder + "/system")
 
         for file in files:
-            with open(path(my_path + file), "r") as open_f:
+            with open(path(file), "r") as open_f:
                 json_val = json.loads(open_f.read())
                 result = schemas.SYSTEM.validate(json_val)
                 json_val.pop("meta")
@@ -51,10 +55,18 @@ class SchemaTest(unittest.TestCase):
     def test_schema_livereport_validation(self) -> None:
         """Ensure schema validation doesn't alter the response"""
         my_path = "files/responses/"
-        files = ["livereport", "livereport_FlowTemperatureVF1", "livereport_senso"]
+        files = [
+            "livereport",
+            "livereport_FlowTemperatureVF1",
+        ]
+        for i in range(len(files)):
+            files[i] = my_path + files[i]
+
+        for folder in senso_responses_folders():
+            files.append(folder + "/live_report")
 
         for file in files:
-            with open(path(my_path + file), "r") as open_f:
+            with open(path(file), "r") as open_f:
                 json_val = json.loads(open_f.read())
                 result = schemas.LIVE_REPORTS.validate(json_val)
                 json_val.pop("meta")
@@ -81,11 +93,15 @@ class SchemaTest(unittest.TestCase):
             "hvacstate_empty",
             "hvacstate_errors",
             "hvacstate_pending",
-            "hvacstate_senso",
         ]
+        for i in range(len(files)):
+            files[i] = my_path + files[i]
+
+        for folder in senso_responses_folders():
+            files.append(folder + "/hvac")
 
         for file in files:
-            with open(path(my_path + file), "r") as open_f:
+            with open(path(file), "r") as open_f:
                 json_val = json.loads(open_f.read())
                 result = schemas.HVAC.validate(json_val)
                 json_val.get("meta").pop("syncState")
@@ -95,10 +111,18 @@ class SchemaTest(unittest.TestCase):
         """Ensure schema validation doesn't alter the response"""
         my_path = "files/responses/"
 
-        files = ["facilities", "facilities_multiple", "facilities_senso"]
+        files = [
+            "facilities",
+            "facilities_multiple",
+        ]
+        for i in range(len(files)):
+            files[i] = my_path + files[i]
+
+        for folder in senso_responses_folders():
+            files.append(folder + "/facilities_list")
 
         for file in files:
-            with open(path(my_path + file), "r") as open_f:
+            with open(path(file), "r") as open_f:
                 json_val = json.loads(open_f.read())
                 result = schemas.FACILITIES.validate(json_val)
                 json_val.pop("meta")
@@ -131,12 +155,16 @@ class SchemaTest(unittest.TestCase):
             "zones",
             "zones_3_zones",
             "zones_missing_heating_config_quick_veto",
-            "zones_senso",
-            "zones_senso_manual",
         ]
+        for i in range(len(files)):
+            files[i] = my_path + files[i]
+
+        for folder in senso_responses_folders():
+            files.append(folder + "/zones")
+            files.append(folder + "/zones_manual")
 
         for file in files:
-            with open(path(my_path + file), "r") as open_f:
+            with open(path(file), "r") as open_f:
                 json_val = json.loads(open_f.read())
                 result = schemas.ZONE_LIST.validate(json_val)
                 json_val.pop("meta")
@@ -172,10 +200,19 @@ class SchemaTest(unittest.TestCase):
         """Ensure schema validation doesn't alter the response"""
         my_path = "files/responses/"
 
-        files = ["dhws", "dhws_minimal", "dhws_senso", "dhws_minimal_senso"]
+        files = [
+            "dhws",
+            "dhws_minimal",
+        ]
+        for i in range(len(files)):
+            files[i] = my_path + files[i]
+
+        for folder in senso_responses_folders():
+            files.append(folder + "/dhw")
+            files.append(folder + "/dhws")
 
         for file in files:
-            with open(path(my_path + file), "r") as open_f:
+            with open(path(file), "r") as open_f:
                 json_val = json.loads(open_f.read())
                 result = schemas.DHWS.validate(json_val)
                 json_val.pop("meta")
diff --git a/tests/test_systemmanager.py b/tests/test_systemmanager.py
index cc551ba..a179e18 100644
--- a/tests/test_systemmanager.py
+++ b/tests/test_systemmanager.py
@@ -104,23 +104,23 @@ async def test_system(manager: SystemManager, resp: aioresponses) -> None:
 
 
 @pytest.mark.asyncio
-async def test_system_senso(senso_manager: SystemManager, resp: aioresponses) -> None:
-    with open(path("files/responses/livereport_senso"), "r") as file:
+async def test_system_senso_vr921(senso_manager: SystemManager, resp: aioresponses) -> None:
+    with open(path("files/responses/senso/vr921/live_report"), "r") as file:
         livereport_data = json.loads(file.read())
 
-    with open(path("files/responses/rooms_senso"), "r") as file:
+    with open(path("files/responses/senso/vr921/rooms"), "r") as file:
         rooms_data = json.loads(file.read())
 
-    with open(path("files/responses/systemcontrol_senso"), "r") as file:
+    with open(path("files/responses/senso/vr921/system"), "r") as file:
         system_data = json.loads(file.read())
 
-    with open(path("files/responses/hvacstate_senso"), "r") as file:
+    with open(path("files/responses/senso/vr921/hvac"), "r") as file:
         hvacstate_data = json.loads(file.read())
 
-    with open(path("files/responses/facilities_senso"), "r") as file:
+    with open(path("files/responses/senso/vr921/facilities_list"), "r") as file:
         facilities = json.loads(file.read())
 
-    with open(path("files/responses/gateway_senso"), "r") as file:
+    with open(path("files/responses/senso/vr921/gateway_type"), "r") as file:
         gateway = json.loads(file.read())
 
     _mock(
@@ -145,6 +145,47 @@ async def test_system_senso(senso_manager: SystemManager, resp: aioresponses) ->
     assert senso_manager._fixed_serial
 
 
+@pytest.mark.asyncio
+async def test_system_senso_vr920(senso_manager: SystemManager, resp: aioresponses) -> None:
+    with open(path("files/responses/senso/vr920/live_report"), "r") as file:
+        livereport_data = json.loads(file.read())
+
+    with open(path("files/responses/senso/vr920/rooms"), "r") as file:
+        rooms_data = json.loads(file.read())
+
+    with open(path("files/responses/senso/vr920/system"), "r") as file:
+        system_data = json.loads(file.read())
+
+    with open(path("files/responses/senso/vr920/hvac"), "r") as file:
+        hvacstate_data = json.loads(file.read())
+
+    with open(path("files/responses/senso/vr920/facilities_list"), "r") as file:
+        facilities = json.loads(file.read())
+
+    with open(path("files/responses/senso/vr920/gateway_type"), "r") as file:
+        gateway = json.loads(file.read())
+
+    _mock(
+        urls_senso,
+        resp,
+        hvacstate_data,
+        livereport_data,
+        rooms_data,
+        system_data,
+        facilities,
+        gateway,
+    )
+
+    system = await senso_manager.get_system()
+
+    assert system is not None
+
+    assert len(system.zones) == 1
+    assert len(system.rooms) == 7
+    _assert_calls(6, senso_manager)
+    assert senso_manager._fixed_serial
+
+
 @pytest.mark.asyncio
 async def test_get_hot_water(managers: List[SystemManager], resp: aioresponses) -> None:
     for manager in managers:
@@ -939,12 +980,28 @@ async def test_get_zones(manager: SystemManager, resp: aioresponses) -> None:
 
 
 @pytest.mark.asyncio
-async def test_get_zones_senso(senso_manager: SystemManager, resp: aioresponses) -> None:
+async def test_get_zones_senso_vr920(senso_manager: SystemManager, resp: aioresponses) -> None:
+    url = urls_senso.zones(
+        serial=SERIAL,
+    )
+
+    with open(path("files/responses/senso/vr920/zones"), "r") as file:
+        json_raw = json.loads(file.read())
+
+    resp.get(url, status=200, payload=json_raw)
+
+    zones = await senso_manager.get_zones()
+    assert zones is not None and len(zones) > 0
+    _assert_calls(1, senso_manager, [url])
+
+
+@pytest.mark.asyncio
+async def test_get_zones_senso_vr921(senso_manager: SystemManager, resp: aioresponses) -> None:
     url = urls_senso.zones(
         serial=SERIAL,
     )
 
-    with open(path("files/responses/zones_senso"), "r") as file:
+    with open(path("files/responses/senso/vr921/zones"), "r") as file:
         json_raw = json.loads(file.read())
 
     resp.get(url, status=200, payload=json_raw)