home-assistant / core

:house_with_garden: Open source home automation that puts local control and privacy first.
https://www.home-assistant.io
Apache License 2.0
73.8k stars 30.89k forks source link

Create Modbus Devices for each listed connection point in Modbus configuration #128554

Open rschoell opened 1 month ago

rschoell commented 1 month ago

The problem

I've recently switched my Keba integration from the internal integration (based on unreliable UDP protocol) to Modbus TCP. So far this is far more stable and controllable, as TCP is stateful protocol. One thing that bothers me (and others: https://community.home-assistant.io/t/modbus-sensors-unique-id-and-device-support/373428) is, that we create a "device" in yaml, under which we place binary_sensors, sensors, switches, ... If you then look in Settings - Devices, it only lists the sensors as entities, but does not list the "main" device. It would be cumbersome to have some correction of this. My config looks like this:

  - name: KEBAP30
    delay: 5
    timeout: 5
    type: tcp
    host: 192.168.1.102 # your callbox IP address goes here
    port: 502
    sensors:
      # Lesbare Sensoren
      - name: KebaP30_charging_state
        address: 1000
        scan_interval: 30
        data_type: uint32
        unique_id: KebaP30_charging_state
      - name: KebaP30_cable_state
        address: 1004
        scan_interval: 30
        data_type: uint32
        unique_id: KebaP30_cable_state

I would expect to see

I cannot fix this myself, but hope that you'll help the community and me. Many thanks.

What version of Home Assistant Core has the issue?

core-2024.10.1

What was the last working version of Home Assistant Core?

No response

What type of installation are you running?

Home Assistant OS

Integration causing the issue

Modbus

Link to integration documentation on our website

https://www.home-assistant.io/integrations/modbus

Diagnostics information

No response

Example YAML snippet

- name: KEBAP30
    delay: 5
    timeout: 5
    type: tcp
    host: 192.168.1.102 # your callbox IP address goes here
    port: 502
    sensors:
      # Lesbare Sensoren
      - name: KebaP30_charging_state
        address: 1000
        scan_interval: 30
        data_type: uint32
        unique_id: KebaP30_charging_state
      - name: KebaP30_cable_state
        address: 1004
        scan_interval: 30
        data_type: uint32
        unique_id: KebaP30_cable_state

Anything in the logs that might be useful for us?

No response

Additional information

No response

home-assistant[bot] commented 1 month ago

modbus documentation modbus source

dkrebs commented 1 month ago

I'm missing that too. Implementation shouldn't be to hard though, here's some example code:

def setup_platform(hass, config, add_entities, discovery_info=None):
    """Set up the sensor platform."""
    # Register both sensor entities under the same device
    add_entities([MyTemperatureSensor(hass)])

class MyTemperatureSensor(SensorEntity):
    """Representation of a Temperature Sensor."""

    @property
    def device_info(self):
        return DeviceInfo(
            identifiers={(self.__class__.__name__, "my_sensor_device")},
            name="My Custom Sensor Device",
            manufacturer="Custom Manufacturer",
            model="Custom Sensor Model 1.0",
        )
Gibol commented 4 weeks ago

This is a huge problem! Dealing with each sensor as entity rather than device is cumbersome and requires a lot of work. Each modbus slave should be represented as a device in homeassistant.

crug80 commented 4 weeks ago

A connection point is not a device. You could have multiple devices into the same connection point when you use a serial link instead of TCP. So the connection point is not the matter, but instead it could be grouping into a device the entities belonging to same slave.

rschoell commented 3 weeks ago

Either way, if that wouldn't be possible, it would be ideal to follow the method of being able to join entities to a self defined device, like it's done in MQTT integration.

joostlek commented 3 weeks ago

Afaik devices only work for config flow based integrations

rschoell commented 3 weeks ago

In MQTT you have the device: entry for "collecting" entities into a device. a similar config in mqtt would look like this:

  • name: "APS ECU Energy lifetime" unique_id: aps.ecuenergylifetime state_topic: "APsystems/aps/216300065811/energy/lifetime" # total amount of energy (in kWh) generated from the lifetime of the array device_class: energy unit_of_measurement: "kWh" device: manufacturer: "AP Systems" model: "DS3-S" identifiers:
  • aps_ds3_s
joostlek commented 3 weeks ago

Yes, but you still have a config entry set up for the connection config

Laxilef commented 3 weeks ago

It really is necessary. I have over 200 entities and it is very inconvenient without grouping them into devices.