zha-device-handlers icon indicating copy to clipboard operation
zha-device-handlers copied to clipboard

[Device Support Request] Danfoss Ally eTRV0100 - other features than just temperature and setpoint

Open OZ1SEJ opened this issue 3 years ago • 3 comments

Is your feature request related to a problem? Please describe. Currently, the Danfoss Ally integration supports a temperature sensor (what's the current temperature at the valve?) and a temperature control (setpoint).

Describe the solution you'd like According to https://zigbee.blakadder.com/Danfoss_014G2461.html the device supports

  • % opening
  • child lock
  • external temperature sensor
  • local temperature battery
  • open window detection
  • ota
  • thermostat

...of which only "local temperature battery" (I suppose) and "thermostat" are currently supported in ZHA. The other parameters seem to be available by creating template sensors, but I believe these ought to be directly available.

EDIT: Also, the current implementation allows to change HVAC mode between "Heat" and "Off", which actually isn't supported by the device. So I believe this should be removed.

Device signature
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=4678, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0301",
      "in_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x000a",
        "0x0020",
        "0x0201",
        "0x0204",
        "0x0b05"
      ],
      "out_clusters": [
        "0x0000",
        "0x0019"
      ]
    }
  },
  "manufacturer": "Danfoss",
  "model": "eTRV0100",
  "class": "zhaquirks.danfoss.thermostat.DanfossThermostat"
}
Diagnostic information
{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2022.8.7",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.10.5",
    "docker": true,
    "arch": "aarch64",
    "timezone": "Europe/Copenhagen",
    "os_name": "Linux",
    "os_version": "5.15.32-v8",
    "supervisor": "2022.08.5",
    "host_os": "Home Assistant OS 8.5",
    "docker_version": "20.10.14",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {
    "hacs": {
      "version": "1.26.2",
      "requirements": [
        "aiogithubapi>=22.2.4"
      ]
    },
    "danfoss_ally": {
      "version": "v1.0.7",
      "requirements": [
        "pydanfossally==0.0.26"
      ]
    }
  },
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "config_flow": true,
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "requirements": [
      "bellows==0.33.1",
      "pyserial==3.5",
      "pyserial-asyncio==0.6",
      "zha-quirks==0.0.78",
      "zigpy-deconz==0.18.0",
      "zigpy==0.50.2",
      "zigpy-xbee==0.15.0",
      "zigpy-zigate==0.9.2",
      "zigpy-znp==0.8.2"
    ],
    "usb": [
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*zigstar*",
        "known_devices": [
          "ZigStar Coordinators"
        ]
      },
      {
        "vid": "1CF1",
        "pid": "0030",
        "description": "*conbee*",
        "known_devices": [
          "Conbee II"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8A2A",
        "description": "*zigbee*",
        "known_devices": [
          "Nortek HUSBZB-1"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate+"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8B34",
        "description": "*bv 2010/10*",
        "known_devices": [
          "Bitron Video AV2010/10"
        ]
      }
    ],
    "codeowners": [
      "@dmulcahey",
      "@adminiuga",
      "@puddly"
    ],
    "zeroconf": [
      {
        "type": "_esphomelib._tcp.local.",
        "name": "tube*"
      },
      {
        "type": "_zigate-zigbee-gateway._tcp.local.",
        "name": "*zigate*"
      }
    ],
    "after_dependencies": [
      "onboarding",
      "usb",
      "zeroconf"
    ],
    "iot_class": "local_polling",
    "loggers": [
      "aiosqlite",
      "bellows",
      "crccheck",
      "pure_pcapy3",
      "zhaquirks",
      "zigpy",
      "zigpy_deconz",
      "zigpy_xbee",
      "zigpy_zigate",
      "zigpy_znp"
    ],
    "is_built_in": true
  },
  "data": {
    "ieee": "**REDACTED**",
    "nwk": 49386,
    "manufacturer": "Danfoss",
    "model": "eTRV0100",
    "name": "Danfoss eTRV0100",
    "quirk_applied": true,
    "quirk_class": "zhaquirks.danfoss.thermostat.DanfossThermostat",
    "manufacturer_code": 4678,
    "power_source": "Battery or Unknown",
    "lqi": 33,
    "rssi": null,
    "last_seen": "2022-08-30T23:01:51",
    "available": true,
    "device_type": "EndDevice",
    "signature": {
      "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=4678, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
      "endpoints": {
        "1": {
          "profile_id": 260,
          "device_type": "0x0301",
          "in_clusters": [
            "0x0000",
            "0x0001",
            "0x0003",
            "0x000a",
            "0x0020",
            "0x0201",
            "0x0204",
            "0x0b05"
          ],
          "out_clusters": [
            "0x0000",
            "0x0019"
          ]
        }
      }
    },
    "active_coordinator": false,
    "entities": [
      {
        "entity_id": "button.danfoss_etrv0100_identifybutton",
        "name": "Danfoss eTRV0100"
      },
      {
        "entity_id": "climate.danfoss_etrv0100_thermostat",
        "name": "Danfoss eTRV0100"
      },
      {
        "entity_id": "sensor.danfoss_etrv0100_battery",
        "name": "Danfoss eTRV0100"
      },
      {
        "entity_id": "sensor.danfoss_etrv0100_thermostathvacaction",
        "name": "Danfoss eTRV0100"
      }
    ],
    "neighbors": [],
    "endpoint_names": [
      {
        "name": "THERMOSTAT"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "c74d0b34d3812a6db3b087d4600c2337",
    "area_id": "badevaerelse_1_sal",
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "THERMOSTAT",
          "id": 769
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {
              "0x0004": {
                "attribute_name": "manufacturer",
                "value": "Danfoss"
              },
              "0x0005": {
                "attribute_name": "model",
                "value": "eTRV0100"
              }
            },
            "unsupported_attributes": {}
          },
          "0x0001": {
            "endpoint_attribute": "power",
            "attributes": {
              "0x0020": {
                "attribute_name": "battery_voltage",
                "value": 32
              },
              "0x0021": {
                "attribute_name": "battery_percentage_remaining",
                "value": 192
              }
            },
            "unsupported_attributes": {
              "0x0031": {
                "attribute_name": "battery_size"
              },
              "0x0033": {
                "attribute_name": "battery_quantity"
              }
            }
          },
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x000a": {
            "endpoint_attribute": "time",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0020": {
            "endpoint_attribute": "poll_control",
            "attributes": {
              "0x0000": {
                "attribute_name": "checkin_interval",
                "value": 13200
              }
            },
            "unsupported_attributes": {}
          },
          "0x0201": {
            "endpoint_attribute": "thermostat",
            "attributes": {
              "0x0000": {
                "attribute_name": "local_temperature",
                "value": 2342
              },
              "0x0003": {
                "attribute_name": "abs_min_heat_setpoint_limit",
                "value": 500
              },
              "0x0004": {
                "attribute_name": "abs_max_heat_setpoint_limit",
                "value": 3500
              },
              "0x0008": {
                "attribute_name": "pi_heating_demand",
                "value": 0
              },
              "0x0012": {
                "attribute_name": "occupied_heating_setpoint",
                "value": 500
              },
              "0x0015": {
                "attribute_name": "min_heat_setpoint_limit",
                "value": 500
              },
              "0x0016": {
                "attribute_name": "max_heat_setpoint_limit",
                "value": 3500
              },
              "0x001b": {
                "attribute_name": "ctrl_sequence_of_oper",
                "value": 2
              },
              "0x001c": {
                "attribute_name": "system_mode",
                "value": 4
              },
              "0x0030": {
                "attribute_name": "setpoint_change_source",
                "value": 2
              },
              "0x4000": {
                "attribute_name": "etrv_open_windows_detection",
                "value": 0
              },
              "0x4031": {
                "attribute_name": "heat_supply_request",
                "value": 0
              },
              "0x404a": {
                "attribute_name": "load_estimate_radiator",
                "value": -1
              },
              "0x404d": {
                "attribute_name": "adaptation_run_status",
                "value": 0
              }
            },
            "unsupported_attributes": {
              "0x0002": {
                "attribute_name": "occupancy"
              },
              "0x0005": {
                "attribute_name": "abs_min_cool_setpoint_limit"
              },
              "0x0029": {
                "attribute_name": "running_state"
              },
              "0x0007": {
                "attribute_name": "pi_cooling_demand"
              },
              "0x0006": {
                "attribute_name": "abs_max_cool_setpoint_limit"
              },
              "0x001e": {
                "attribute_name": "running_mode"
              },
              "0x0011": {
                "attribute_name": "occupied_cooling_setpoint"
              },
              "0x0013": {
                "attribute_name": "unoccupied_cooling_setpoint"
              },
              "0x0014": {
                "attribute_name": "unoccupied_heating_setpoint"
              },
              "0x0017": {
                "attribute_name": "min_cool_setpoint_limit"
              },
              "0x0018": {
                "attribute_name": "max_cool_setpoint_limit"
              }
            }
          },
          "0x0204": {
            "endpoint_attribute": "thermostat_ui",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0b05": {
            "endpoint_attribute": "diagnostic",
            "attributes": {},
            "unsupported_attributes": {}
          }
        },
        "out_clusters": {
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}
Additional logs
Paste any additional debug logs here.
Don't remove the extra line breaks outside the ``` marks.

N/A

Additional context This is the device view. As can be seen, many of the supported parameters are not shown. billede

OZ1SEJ avatar Aug 30 '22 21:08 OZ1SEJ

Would it be possible to map the non-functional "off" state to the lowest possible temperature instead?

mhaas avatar Sep 01 '22 19:09 mhaas

That certainly sounds like a good idea.

OZ1SEJ avatar Sep 03 '22 08:09 OZ1SEJ

If anyone would be interested in implementing these changes, here is the documentation. https://assets.danfoss.com/documents/202524/AU417130778872en-000101.pdf

stachjankowski avatar Oct 08 '22 20:10 stachjankowski

I have implemented all attributes mentioned in the documentation and have opened pull requests in the relevant repositories: https://github.com/home-assistant/core/pull/86907 https://github.com/zigpy/zha-device-handlers/pull/2150 Note that just installing the quirk is not enough to get entities in home assistant.

Caius-Bonus avatar Jan 29 '23 18:01 Caius-Bonus

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

github-actions[bot] avatar Jul 28 '23 19:07 github-actions[bot]

#2150 is still not merged. I was testing #2150 over the winter by patching it into my HA instance together with https://github.com/home-assistant/core/pull/86907, and it seemed to work well.

jmymay avatar Aug 02 '23 19:08 jmymay

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

github-actions[bot] avatar Jan 29 '24 20:01 github-actions[bot]

Due to this issue, I switched from ZHA to Zigbee2MQTT a long time ago. If this has since been remedied in ZHA, please feel free to close this issue...

OZ1SEJ avatar Jan 30 '24 07:01 OZ1SEJ

Still valid.

bieniu avatar Jan 30 '24 14:01 bieniu