diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..89c7bcd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,147 @@ +# CLAUDE.md - AI Assistant Context + +This file provides context for AI assistants working with this codebase. + +## Project Overview + +This is a **Home Assistant custom integration** for RDZ PDC heat pumps. It communicates with the heat pump's embedded web server via HTTP to monitor status and control temperatures. + +**Domain**: `ha_rdz_pdc_config` + +## Architecture + +``` +custom_components/ha_rdz_pdc_config/ +├── __init__.py # Core: HeatPumpDataCoordinator, HeatPumpEntity base class, service registration +├── config_flow.py # UI configuration wizard (URL + scan interval) +├── climate.py # Climate entity for heating water temperature control +├── water_heater.py # Water heater entity for DHW (domestic hot water) control +├── sensor.py # Temperature sensors, runtime sensors, version sensor +├── binary_sensor.py # Status binary sensors (heating, cooling, pump, alarm, etc.) +├── manifest.json # Integration metadata +└── translations/en.json +``` + +## Key Components + +### HeatPumpDataCoordinator (`__init__.py:88`) +Central data manager using Home Assistant's `DataUpdateCoordinator` pattern. +- Fetches JSON data from heat pump at configurable intervals (default 3s) +- Parses status response into normalized dict +- Provides `set_water_setpoint()` and `set_dhw_setpoint()` methods + +### HeatPumpEntity (`__init__.py:224`) +Base class for all entities. Provides common device_info linking all entities to "Heat Pump" device. + +### API Endpoints +- **GET Status**: Configurable URL (typically `index.php?Action=GetStatus`) +- **POST SetParameter**: `/index.php?Action=SetParameter` with form data: + - `Key`: "watersetpoint" or "dhwsetpoint" + - `Value`: temperature string + - `manual`: duration ("forever" or time-based) + +## Data Flow + +1. User configures URL via config_flow +2. Coordinator fetches JSON every N seconds +3. JSON parsed into normalized dict with keys like `water_temp_t1`, `is_heating`, etc. +4. Platform entities read from `coordinator.data` +5. Climate/water_heater call coordinator methods to set temperatures + +## JSON Response Structure + +Heat pump returns nested JSON. Key path: `RESULT.status.*` + +```python +# Main data extraction in __init__.py:122-158 +status = data.get("RESULT", {}).get("status", {}) +``` + +**Critical fields:** +| Internal Key | JSON Path | Notes | +|--------------|-----------|-------| +| water_temp_t1 | status.watert1 | Inflow temperature | +| water_temp_t2 | status.watert2 | Outflow temperature | +| dhw_temp_t3 | status.dhwt3 | Domestic hot water temp | +| outdoor_temp_t4 | status.t4 | Outdoor temperature | +| water_setpoint | status.watersetpoint | Heating target | +| dhw_setpoint | status.dhwsetpoint | DHW target | +| inlet_setpoint_temp | status.ISP | Smart setpoint (parse: "34.3 °C" -> 34.3) | +| is_heating | status.heating | Boolean | +| is_cooling | status.cooling | Boolean | +| is_working | status.pwr | Compressor running | +| is_dhw | status.san | DHW mode active | +| is_pump_active | status.pump | Circulation pump | +| is_aux_heater | status.res | Backup heater | +| is_standby | status.standby | Standby mode | +| has_alarm | status.alarm.status | Alarm active | + +## Firmware Variations + +Different firmware versions have different JSON structures. Sample responses in `jsons/`: + +| File | Version | Key Differences | +|------|---------|-----------------| +| og.json | v3.0.49 | Has ISP, SSP, res, sce fields; ISP is string with unit | +| bogdan.json | v2.3.2 | Missing ISP/SSP; simpler alarm structure; different temp ranges | + +**Common issues requiring code modification:** +- `ISP` field may not exist or have different format +- `alarm.status` vs just `alarm.type` +- Field names may vary + +## Entities Created + +**Climate** (1): +- `climate.heat_pump_water_temperature` - Heating water thermostat + +**Water Heater** (1): +- `water_heater.heat_pump_dhw` - DHW temperature control + +**Sensors** (12): +- Temperature sensors: inlet_setpoint, system_setpoint, t1, t2, t3, t4, water_setpoint, dhw_setpoint, aux_heater +- Runtime sensors: worktime_pdc, worktime_res +- Info: software_version + +**Binary Sensors** (10): +- heating, cooling, working, dhw_mode, water_pump, auxiliary_heater, standby, disabled_prod, sce, alarm + +## Services + +```yaml +# Set heating water temperature +service: ha_rdz_pdc_config.set_water_setpoint +data: + temperature: 45.0 # 35-60°C + duration: "forever" +``` + +## Development Notes + +### Adding New Sensors +1. Add field extraction in `HeatPumpDataCoordinator._async_update_data()` +2. Add sensor definition in `sensor.py` or `binary_sensor.py` +3. Reference via `self.coordinator.data.get("field_name")` + +### Debugging +- Check HA logs for `ha_rdz_pdc_config` domain +- Test URL manually in browser to verify JSON response +- Compare response against `jsons/*.json` samples + +### Temperature Ranges +- Water setpoint: 35-60°C (hardcoded in service schema and climate entity) +- DHW setpoint: 35-60°C +- Step: 0.5°C + +## File Purposes Quick Reference + +| File | Purpose | +|------|---------| +| `__init__.py` | Coordinator, base entity, service registration, data parsing | +| `config_flow.py` | UI setup wizard | +| `climate.py` | Heating water thermostat | +| `water_heater.py` | DHW thermostat | +| `sensor.py` | Temperature and runtime sensors | +| `binary_sensor.py` | Status on/off sensors | +| `dashboards/dash.yaml` | Example Lovelace dashboard | +| `jsons/*.json` | Sample API responses for testing/reference | \ No newline at end of file diff --git a/README.md b/README.md index 39af52c..9126d2e 100755 --- a/README.md +++ b/README.md @@ -1,29 +1,214 @@ -# README # +# RDZ PDC Heat Pump Monitor - Home Assistant Integration -This README would normally document whatever steps are necessary to get your application up and running. +A custom Home Assistant integration for monitoring and controlling RDZ PDC heat pumps via their embedded web interface. -### What is this repository for? ### +## Features -* Quick summary -* Version -* [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) +- **Climate Control**: Thermostat entity for controlling heating/cooling water temperature +- **Water Heater Control**: Dedicated entity for domestic hot water (DHW) temperature control +- **Comprehensive Monitoring**: 12+ sensors for temperatures, setpoints, and runtime statistics +- **Status Indicators**: 10 binary sensors for operational states (heating, cooling, pump, alarms, etc.) +- **Local Polling**: Direct communication with heat pump - no cloud dependency +- **Dashboard Included**: Pre-configured Lovelace dashboard YAML -### How do I get set up? ### +## Supported Data Points -* Summary of set up -* Configuration -* Dependencies -* Database configuration -* How to run tests -* Deployment instructions +### Temperature Sensors +| Sensor | Description | +|--------|-------------| +| Inlet Setpoint (ISP) | Smart heating setpoint temperature | +| System Setpoint (SSP) | System setpoint temperature | +| Water T1 | Inflow/supply water temperature | +| Water T2 | Outflow/return water temperature | +| DHW T3 | Domestic hot water temperature | +| Outdoor T4 | External/outdoor temperature | +| Water Setpoint | Target heating water temperature | +| DHW Setpoint | Target domestic hot water temperature | -### Contribution guidelines ### +### Binary Status Sensors +| Sensor | Description | +|--------|-------------| +| Heating | Heat pump is in heating mode | +| Cooling | Heat pump is in cooling mode | +| Working | Compressor is running | +| DHW Mode | Domestic hot water heating active | +| Water Pump | Circulation pump is active | +| Auxiliary Heater | Backup electric heater running | +| Standby | System in standby mode | +| Alarm | System alarm active | -* Writing tests -* Code review -* Other guidelines +### Runtime Statistics +| Sensor | Description | +|--------|-------------| +| Runtime (PDC) | Total compressor operating hours | +| Auxiliary Heater Runtime | Total backup heater operating hours | -### Who do I talk to? ### +## Installation -* Repo owner or admin -* Other community or team contact \ No newline at end of file +### Step 1: Copy Integration Files + +Copy the `custom_components/ha_rdz_pdc_config` folder to your Home Assistant `custom_components` directory: + +``` +/ +└── custom_components/ + └── ha_rdz_pdc_config/ + ├── __init__.py + ├── climate.py + ├── sensor.py + ├── binary_sensor.py + ├── water_heater.py + ├── config_flow.py + ├── manifest.json + └── translations/ + └── en.json +``` + +### Step 2: Restart Home Assistant + +After copying the files, restart Home Assistant completely. + +### Step 3: Add Integration + +1. Go to **Settings** → **Devices & Services** +2. Click **+ Add Integration** +3. Search for "RDZ" or "Heat Pump Monitor" +4. Follow the configuration wizard + +### Step 4: Configure URL + +When prompted, enter your heat pump's status URL. The format is typically: + +``` +http:///installedplugin/com.innova.pdc//server/index.php?Action=GetStatus +``` + +**Example:** +``` +http://192.168.11.101/installedplugin/com.innova.pdc/2.0.10/server/index.php?Action=GetStatus +``` + +**To find your URL:** +1. Access your heat pump's web interface in a browser +2. Open browser developer tools (F12) +3. Navigate to the Network tab +4. Look for requests to `index.php?Action=GetStatus` +5. Copy the full URL + +**Verify your URL works** by opening it in a browser - you should see a JSON response like: +```json +{ + "success": true, + "sw": { "V": "3.0.49" }, + "RESULT": { + "status": { ... } + } +} +``` + +## Troubleshooting + +### JSON Field Mapping Issues + +Different firmware versions may have different JSON structures. If you encounter issues, you may need to modify the field mappings in `__init__.py`. + +**Known differences between firmware versions:** + +| Field | v3.0.49+ | v2.3.x | +|-------|----------|--------| +| ISP (Inlet Setpoint) | `"34.3 °C"` (string with unit) | May not exist | +| SSP (System Setpoint) | Present | May not exist | +| alarm.status | `true/false` | May only have `type` field | +| res (aux heater) | Present | May not exist | +| sce | Present | May not exist | + +**Key mappings to verify in `__init__.py`:** + +```python +"inlet_setpoint_temp": float(status.get("ISP", "0").split()[0]), +"system_setpoint_temp": status.get("SSP"), +"water_temp_t1": status.get("watert1"), +"water_temp_t2": status.get("watert2"), +"dhw_temp_t3": status.get("dhwt3"), +"outdoor_temp_t4": status.get("t4"), +"water_setpoint": status.get("watersetpoint"), +"dhw_setpoint": status.get("dhwsetpoint"), +"is_heating": status.get("heating", False), +"is_working": status.get("pwr", False), +"is_cooling": status.get("cooling", False), +"is_dhw": status.get("san", False), +"is_pump_active": status.get("pump", False), +"is_aux_heater": status.get("res", False), +"is_standby": status.get("standby", False), +``` + +### Common Issues + +1. **Integration not appearing**: Ensure files are in the correct directory and restart HA completely +2. **Connection failed**: Verify the URL is accessible from your HA server +3. **Missing sensors**: Check if your firmware version supports all fields +4. **Temperature readings incorrect**: Verify JSON field names match your heat pump's response + +## Dashboard + +A pre-configured dashboard is included in `dashboards/dash.yaml`. To use it: + +1. Copy the YAML content +2. Go to **Settings** → **Dashboards** +3. Create a new dashboard or edit existing +4. Use the raw configuration editor to paste the YAML + +The dashboard includes: +- Status buttons (Alarm, Heating, Cooling, SCE, Standby) +- Thermostat cards for water and DHW control +- 24-hour history graph +- Scheduler integration (requires [scheduler-card](https://github.com/nielsfaber/scheduler-card)) + +## Services + +### `ha_rdz_pdc_config.set_water_setpoint` + +Manually set the heating water setpoint temperature. + +| Parameter | Type | Required | Description | +|-----------|------|----------|-------------| +| temperature | float | Yes | Target temperature (35-60°C) | +| duration | string | No | Duration: "forever" or time-based | + +**Example:** +```yaml +service: ha_rdz_pdc_config.set_water_setpoint +data: + temperature: 45 + duration: forever +``` + +## API Reference + +### Data Fetching +- **Endpoint**: Configurable URL (typically `index.php?Action=GetStatus`) +- **Method**: GET +- **Update Interval**: Configurable (default: 3 seconds) + +### Parameter Setting +- **Endpoint**: `/index.php?Action=SetParameter` +- **Method**: POST (form-urlencoded) +- **Parameters**: + - `Key`: "watersetpoint" or "dhwsetpoint" + - `Value`: Temperature as string + - `manual`: Duration ("forever" or time limit) + +## Technical Details + +- **Domain**: `ha_rdz_pdc_config` +- **IoT Class**: Local Polling +- **Platforms**: sensor, binary_sensor, climate, water_heater +- **Configuration**: UI-based (config_flow) + +## Contributing + +Contributions are welcome! If you have a different firmware version or heat pump model, please share your JSON response structure to help improve compatibility. + +## License + +This project is provided as-is for personal use with RDZ PDC heat pumps. \ No newline at end of file diff --git a/dashboards/dash.yaml b/dashboards/dash.yaml new file mode 100644 index 0000000..3010e6e --- /dev/null +++ b/dashboards/dash.yaml @@ -0,0 +1,124 @@ +views: + - title: Home + sections: + - type: grid + cards: + - show_name: true + show_icon: true + type: button + tap_action: + action: none + entity: binary_sensor.heat_pump_alarm + icon: mdi:alarm-light + show_state: true + - show_name: true + show_icon: true + type: button + tap_action: + action: none + entity: binary_sensor.heat_pump_heating + - show_name: true + show_icon: true + type: button + tap_action: + action: toggle + entity: binary_sensor.heat_pump_cooling + icon: mdi:snowflake + - show_name: true + show_icon: true + type: button + tap_action: + action: toggle + entity: binary_sensor.heat_pump_sce + icon: mdi:water-pump + - show_name: true + show_icon: true + type: button + entity: binary_sensor.heat_pump_standby + column_span: 2 + - type: grid + cards: + - type: thermostat + entity: climate.boiler_temperature + show_current_as_primary: true + features: + - style: icons + type: climate-preset-modes + preset_modes: + - comfort + - eco + - sleep + - activity + grid_options: + columns: 6 + rows: 4 + - type: thermostat + entity: climate.heat_pump_water_temperature + features: + - type: climate-hvac-modes + hvac_modes: + - heat + - cool + - 'off' + grid_options: + columns: 6 + rows: 4 + - type: grid + cards: + - title: History + type: history-graph + hours_to_show: 24 + entities: + - entity: sensor.heat_pump_auxiliary_heater_2 + - entity: binary_sensor.heat_pump_auxiliary_heater + - entity: binary_sensor.heat_pump_dhw_mode + - entity: sensor.heat_pump_dhw_setpoint + - entity: sensor.heat_pump_dhw_temperature_t3 + - entity: sensor.heat_pump_water_temperature_t1 + - entity: sensor.heat_pump_outdoor_temperature_t4 + - entity: sensor.heat_pump_system_setpoint_temperature + - entity: binary_sensor.heat_pump_pump + - entity: sensor.heat_pump_water_setpoint + - entity: binary_sensor.heat_pump_working + - entity: sensor.heat_pump_inflow_temperature_t1 + - entity: sensor.heat_pump_outflow_temperature_t2 + - entity: binary_sensor.heat_pump_water_pump + - entity: sensor.heat_pump_system_setpoint_temperature + - entity: sensor.heat_pump_inlet_setpoint_temperature + - entity: sensor.t_puffer_temperature + - entity: switch.puffer_heater_relay_switch_0 + - entity: sensor.deye_12_external_power + - entity: switch.boiler_heater_relay_switch_0 + grid_options: + columns: 48 + rows: auto + column_span: 4 + - type: grid + cards: + - type: heading + heading: New section + - type: custom:scheduler-card + include: + - climate + exclude: [] + grid_options: + columns: 12 + rows: 4 + cards: [] + - type: sections + max_columns: 4 + title: Schedules + path: schedules + sections: + - type: grid + cards: + - type: heading + heading: New section + - type: tile + entity: schedule.bath_water_schedule + features_position: bottom + vertical: true + show_entity_picture: false + state_content: + - state + - next_event diff --git a/.devcontainer.json b/devcontainer.json similarity index 96% rename from .devcontainer.json rename to devcontainer.json index 562abd0..1da28c0 100755 --- a/.devcontainer.json +++ b/devcontainer.json @@ -1,6 +1,6 @@ { "name": "ludeeus/integration_blueprint", - "image": "mcr.microsoft.com/devcontainers/python:3.12", + "image": "mcr.microsoft.com/devcontainers/python:3.13", "postCreateCommand": "scripts/setup", "forwardPorts": [ 8123 diff --git a/jsons/bogdan.json b/jsons/bogdan.json new file mode 100644 index 0000000..fe7aab2 --- /dev/null +++ b/jsons/bogdan.json @@ -0,0 +1,173 @@ +{ + "sw": { + "V": "2.3.2" + }, + "success": true, + "menu": [ + { + "handler": "fn-homepage", + "cls": "", + "iconCls": "ion-ios-home", + "title": "HOME" + }, + { + "handler": "fn-device", + "cls": "", + "iconCls": "ion-gear-a", + "root": true, + "title": "HP" + }, + { + "handler": "fn-chart", + "cls": " hidden", + "iconCls": "ion-stats-bars", + "authLevel": "setup", + "title": "Charts" + }, + { + "handler": "fn-events", + "cls": " hidden", + "iconCls": "ion-ios-book", + "authLevel": "setup", + "title": "Events log" + } + ], + "model": "PDC RDZ", + "title": "\u003Cspan\u003EHeat pump\u003C/span\u003E", + "RESULT": { + "TSLastUpdate": 1759127624, + "status": { + "standby": false, + "dhw": true, + "pwr": false, + "san": false, + "cal": false, + "pump": false, + "auxheater": 0, + "auxheaterLabel": "Backup heater", + "auxheaterUrl": "/v/1.0.61/plugins/com.innova.pdc/gui/imgfiles/res0.png", + "ALo": 5, + "Ahi": 80, + "heating": false, + "cooling": true, + "watert1": 16.5, + "watert2": 17.6, + "dhwt3": 40.5, + "t4": 0, + "watersetpoint": 18, + "dhwValues": [14.6, 15.1, 15.6, 16.1, 16.6, 17.1, 17.6, 18.1, 18.6, 19.1, 19.6, 20.1, 20.6, 21.1, 21.6, 22.1, 22.6, 23.1, 23.6, 24.1, 24.6, 25.1, 25.6, 26.1, 26.6, 27.1, 27.6, 28.1, 28.6, 29.1, 29.6, 30.1, 30.6, 31.1, 31.6, 32.1, 32.6, 33.1, 33.6, 34.1, 34.6, 35.1, 35.6, 36.1, 36.6, 37.1, 37.6, 38.1, 38.6, 39.1, 39.6, 40.1, 40.6, 41.1, 41.6, 42.1, 42.6, 43.1, 43.6, 44.1, 44.6, 45.1, 45.6, 46.1, 46.6, 47.1, 47.6, 48.1, 48.6, 49.1, 49.6, 50.1, 50.6, 51.1, 51.6, 52.1, 52.6, 53.1, 53.6, 54.1, 54.6], + "waterValues": [ + "off", + 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24, 24.5, 25], + "timeValues": { + "hours": [ + "00", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23" + ], + "minutes": [ + "00", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "43", + "44", + "45", + "46", + "47", + "48", + "49", + "50", + "51", + "52", + "53", + "54", + "55", + "56", + "57", + "58", + "59" + ] + }, + "legactive": false, + "dhwsetpoint": 40, + "alarm": { + "type": "" + }, + "worktime_res": 1283, + "worktime_pdc": 13390, + "manualCooling": true, + "manualCoolingHfm": "forever", + "manualHeating": true, + "manualHeatingHfm": "forever", + "manualDhw": true, + "manualDhwHfm": "forever", + "hfm": 2, + "forced_ftv": 0, + "conditioning_calendar_disabled": 0 + }, + "info": { + "datetime": "29/09/2025 09:33" + } + } +} \ No newline at end of file diff --git a/jsons/og.json b/jsons/og.json new file mode 100644 index 0000000..355cd6e --- /dev/null +++ b/jsons/og.json @@ -0,0 +1,289 @@ +{ + "sw": { + "V": "3.0.49" + }, + "success": true, + "errors": {}, + "lb": {}, + "RESULT": { + "TSLastUpdate": 1759138628, + "info": { + "datetime": "29/09/2025 12:37" + }, + "status": { + "ALo": 5.0, + "Ahi": 80.0, + "ISP": "34.3 °C", + "SSP": 47.0, + "alarm": { + "status": false, + "type": "", + "label": "" + }, + "auxheater": 0, + "auxheaterLabel": "Backup heater", + "auxheaterUrl": "/v/2.0.10/plugins/com.innova.pdc/gui/imgfiles/res0.png", + "cal": false, + "conditioning_calendar_disabled": 0, + "cooling": false, + "dhw": true, + "dhwValues": [ + "30.0", + "30.5", + "31.0", + "31.5", + "32.0", + "32.5", + "33.0", + "33.5", + "34.0", + "34.5", + "35.0", + "35.5", + "36.0", + "36.5", + "37.0", + "37.5", + "38.0", + "38.5", + "39.0", + "39.5", + "40.0", + "40.5", + "41.0", + "41.5", + "42.0", + "42.5", + "43.0", + "43.5", + "44.0", + "44.5", + "45.0", + "45.5", + "46.0", + "46.5", + "47.0", + "47.5", + "48.0", + "48.5", + "49.0", + "49.5", + "50.0", + "50.5", + "51.0", + "51.5", + "52.0", + "52.5", + "53.0" + ], + "dhwsetpoint": 47.0, + "dhwt3": 46.8, + "forced_ftv": 0, + "heating": true, + "hfm": 2, + "hor": -15.0, + "hoS": -15.0, + "legactive": false, + "manualCooling": true, + "manualCoolingHfm": "forever", + "manualDhw": true, + "manualDhwHfm": "forever", + "manualHeating": true, + "manualHeatingHfm": "forever", + "pump": true, + "pwr": false, + "res": false, + "san": false, + "sce": true, + "standby": false, + "t4": 9.6, + "timeValues": { + "hours": [ + "00", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23" + ], + "minutes": [ + "00", + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "43", + "44", + "45", + "46", + "47", + "48", + "49", + "50", + "51", + "52", + "53", + "54", + "55", + "56", + "57", + "58", + "59" + ] + }, + "waterValues": [ + "off", + "20.0", + "20.5", + "21.0", + "21.5", + "22.0", + "22.5", + "23.0", + "23.5", + "24.0", + "24.5", + "25.0", + "25.5", + "26.0", + "26.5", + "27.0", + "27.5", + "28.0", + "28.5", + "29.0", + "29.5", + "30.0", + "30.5", + "31.0", + "31.5", + "32.0", + "32.5", + "33.0", + "33.5", + "34.0", + "34.5", + "35.0", + "35.5", + "36.0", + "36.5", + "37.0", + "37.5", + "38.0", + "38.5", + "39.0", + "39.5", + "40.0", + "40.5", + "41.0", + "41.5", + "42.0", + "42.5", + "43.0", + "43.5", + "44.0", + "44.5", + "45.0" + ], + "watersetpoint": 43.0, + "watert1": 32.1, + "watert2": 32.0, + "worktime_pdc": 11614, + "worktime_res": 593, + "disableProd": false + }, + "title": "\u003cspan\u003eHeat pump\u003c/span\u003e", + "updateReceived": false + }, + "model": "RDZ", + "menu": [ + { + "cls": "", + "handler": "fn-homepage", + "iconCls": "ion-ios-home", + "title": "HOME", + "label": "HOME", + "root": false + }, + { + "cls": "", + "handler": "fn-device", + "iconCls": "ion-gear-a", + "title": "HP", + "label": "HP", + "root": true + }, + { + "cls": " leaf", + "handler": "fn-chart", + "iconCls": "ion-stats-bars", + "title": "Charts", + "label": "Charts", + "root": false + }, + { + "cls": " leaf", + "handler": "fn-events", + "iconCls": "ion-ios-book", + "title": "Events log", + "label": "Events log", + "root": false + } + ] +} \ No newline at end of file