{"id":37864980,"url":"https://github.com/studiobts/home-assistant-device-pulse","last_synced_at":"2026-01-17T23:31:25.565Z","repository":{"id":321208641,"uuid":"1084863654","full_name":"studiobts/home-assistant-device-pulse","owner":"studiobts","description":"Device Pulse provides a centralized, extensible monitoring layer for any IP-based devices in Home Assistant. It simplifies the setup of device connectivity checks, automations, and dashboards for network health visibility.","archived":false,"fork":false,"pushed_at":"2026-01-16T08:18:18.000Z","size":714,"stargazers_count":100,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-17T04:48:14.168Z","etag":null,"topics":["custom-component","custom-integration","hacs","homeassistant","icmp-ping","network-monitoring","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/studiobts.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"studiobts"}},"created_at":"2025-10-28T09:13:40.000Z","updated_at":"2026-01-16T14:06:20.000Z","dependencies_parsed_at":"2025-10-28T13:16:27.713Z","dependency_job_id":"ea74efff-2281-4896-a547-839dcd98dd19","html_url":"https://github.com/studiobts/home-assistant-device-pulse","commit_stats":null,"previous_names":["studiobts/home-assistant-device-pulse"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/studiobts/home-assistant-device-pulse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studiobts%2Fhome-assistant-device-pulse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studiobts%2Fhome-assistant-device-pulse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studiobts%2Fhome-assistant-device-pulse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studiobts%2Fhome-assistant-device-pulse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/studiobts","download_url":"https://codeload.github.com/studiobts/home-assistant-device-pulse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/studiobts%2Fhome-assistant-device-pulse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28522306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T22:11:28.393Z","status":"ssl_error","status_checked_at":"2026-01-17T22:11:27.841Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["custom-component","custom-integration","hacs","homeassistant","icmp-ping","network-monitoring","python"],"created_at":"2026-01-16T16:36:27.861Z","updated_at":"2026-01-17T23:31:25.559Z","avatar_url":"https://github.com/studiobts.png","language":"Python","funding_links":["https://github.com/sponsors/studiobts","https://buymeacoffee.com/studiobts"],"categories":[],"sub_categories":[],"readme":"# Device Pulse\n\n[![hacs_badge](https://img.shields.io/badge/HACS-Custom-orange.svg)](https://github.com/hacs/integration)\n\nIf you want to make donation as appreciation of my work, you can do so via buy me a coffee. Thank you!\n\n\u003ca href=\"https://buymeacoffee.com/studiobts\" target=\"_blank\"\u003e\u003cimg src=\"https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\"\u003e\u003c/a\u003e\n\n## Introduction\n\nDevice Pulse is a custom Home Assistant integration that provides flexible monitoring of IP-based devices. It offers two configuration modes to track network device availability through ping checks and automatically generates summary sensors for quick visibility of connection states.\n\n---\n\n## 💡 Integration Not Listed?\n\n**Is your integration missing from the available list during configuration?**\n\nDevice Pulse can monitor most IP-based integrations, but some require custom configuration parsing.\n\n👉 **[Read how to request a custom host resolver](HOST_RESOLVER_REQUEST.md)**\n\n*Please note: Not all integrations can be supported, and implementation depends on the information provided and device availability for testing.*\n\n---\n\n\n## Installation\n\n#### Method 1: HACS (Recommended)\n\n1. Install via HACS (Home Assistant Community Store)\n2. Restart Home Assistant\n3. Add the integration through the UI\n\n[![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=studiobts\u0026repository=home-assistant-device-pulse)\n\n#### Method 2: Manual Installation\n\n1. Download this repository\n2. Copy the `device_pulse` folder to your Home Assistant's `custom_components` directory:\n   ```\n   /config/custom_components/device_pulse/\n   ```\n3. Restart Home Assistant\n4. Add the integration through the UI\n\n---\n\n## Basic Functionality\n\n### Configuration Modes\n\n1. **Integration-based Monitoring**\\\n   Device Pulse can automatically detect existing Home Assistant integrations that expose device connection parameters such as `ip_address`, `ipaddress`, `host`, `hostname`, or `address`.\\\n   You can then select one of these integrations to monitor its devices.\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/config_flow_mode.png?raw=true\" height=\"350\" /\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/config_flow_integration.png?raw=true\" height=\"350\" /\u003e\n\u003c/p\u003e\n\n   During setup, you can specify which devices to monitor:   \n\n   - **All valid devices** – all devices with a valid host parameter.\n   - **All except listed devices** – exclude specific devices listed during configuration.\n   - **Only listed devices** – include only the specified devices.\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/config_flow_device_selection.png?raw=true\" height=\"350\" /\u003e\n\u003c/p\u003e\n\n2. **Custom Group Monitoring**\\\n   You can manually create a custom group and add devices by specifying their **name** and **host (hostname or IP)**. Each group can be configured independently.\n\n\n### Monitoring Parameters\n\nFor both configuration modes, you can define:\n\n- The **number of failed ping attempts** required before a device is considered disconnected.\n- The **interval time** between each ping request.\n- The **ping method** to use (ICMP or ARP).\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/config_flow_ping_parameters.png?raw=true\" height=\"350\" /\u003e\n\u003c/p\u003e\n\n### Ping Method Selection\n\nDevice Pulse supports two ping methods for monitoring devices:\n\n- **ICMP Ping (Standard)**: Uses the traditional ICMP protocol to check device availability. Works for any device on any network (local or remote).\n\n- **ARP Ping (Local Subnet Only)**: Uses ARP (Address Resolution Protocol) requests to check device availability. Only works for devices in the same local subnet as Home Assistant, but it's more reliable for devices that don't respond to ICMP ping (some devices have ICMP disabled for security reasons).\n\n**Note**: The ARP Ping option is only shown if at least one device is detected to be in the same subnet as Home Assistant. ARP ping requires the `arping` command to be installed on your system:\n\n```bash\n# For Debian/Ubuntu-based systems (including Home Assistant OS)\napt-get install iputils-arping\n```\n\nIf you're using hostnames instead of IP addresses, Device Pulse will automatically resolve them to determine subnet compatibility and will resolve them at runtime when using ARP ping.\n\n\n---\n\n## Advanced Features\n\n### Optional Supplementary Sensors\n\nYou can choose to create additional sensors for each monitored device to track:\n\n- The number of failed pings.\n- The timestamp of the last offline event.\n- The round-trip time of the most recent ping.\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/config_flow_optional_sensors.png?raw=true\" height=\"450\" /\u003e\n\u003c/p\u003e\n\n### Summary Sensors per Integration or Group\n\nEach integration or custom group can have two summary sensors:\n\n- The **total number of monitored devices**.\n- The **number of offline devices**.\n\n### Global Summary Sensors\n\nDevice Pulse automatically creates three global summary sensors:\n\n1. A sensor for the **total number of devices** under monitoring.\n2. A **binary sensor** indicating whether all devices are online.\n3. A sensor showing the **total number of offline devices**.\n\n### Attributes for Offline Summary Sensors\n\nSensors that track the number of offline devices (both per group and globally) expose three attributes:\n\n- `offline_device_ids`: list of device IDs currently offline.\n- `went_offline_device_ids`: list of device IDs that went offline in the most recent update.\n- `came_online_device_ids`: list of device IDs that came back online in the most recent update.\n\nThese attributes allow for easy automation and dynamic UI cards showing current offline devices.\n\n### Custom Events\n\nDevice Pulse emits three custom events that can be used for advanced automations and tracking device state changes:\n\n- `device_pulse_ping_status_updated`: Triggered whenever the ping status of any monitored device sensor changes (from online to offline or vice versa).\n- `device_pulse_device_went_offline`: Triggered when a device transitions from online to offline. The event data includes the device ID.\n- `device_pulse_device_came_online`: Triggered when a device transitions from offline back to online. The event data includes the device ID.\n\nThese events can be used in automations to trigger notifications, log changes, or synchronize external systems with real-time network status.\n\n---\n\n## Configuration Parsing\n\nNot all integrations have a straightforward configuration structure where the host can be easily identified. \n\nFor integrations with complex or \"non-standard\" configuration formats, you can create a dedicated resolver class to handle proper configuration parsing.\n\n### Creating a Custom Resolver\n\nTo implement a custom resolver:\n- Create a new file in the `host_resolvers` directory named with the integration's domain\n- **Extend BaseHostResolver**: Your class must inherit from the base resolver class\n- **Implement the `resolve` method**: Return the host for the specific device\n\n### Current Custom Resolvers\n\nAt the moment, the following custom resolvers are implemented:\n\n- Midea Dehumidifier LAN\n- Tasmota\n- LocalTuya\n\n## Requesting a New Host Resolver\n\nIf you need support for an integration that is not currently listed, please refer to the instructions in the file [HOST_RESOLVER_REQUEST](HOST_RESOLVER_REQUEST.md).  \nIt explains the required information and how to submit a request for a new custom host resolver.\n\n## Device Pulse Timeline Card\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/timeline_card_horizontal.png?raw=true\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\nA companion custom Lovelace card named `device-pulse-timeline-card` is available in the repository [https://github.com/studiobts/device-pulse-timeline-card](https://github.com/studiobts/device-pulse-timeline-card).\nThis card displays a visual timeline of connection and disconnection events for each monitored device, providing an intuitive historical view of network stability and device uptime.\n\nThe card can be added to your dashboard as a standard custom card once installed and configured through HACS or manual setup.\n\n---\n\n## Device Pulse Table Card\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/table_card.png?raw=true\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\nA companion custom Lovelace card named `device-pulse-table-card` is available in the repository [https://github.com/studiobts/device-pulse-table-card](https://github.com/studiobts/device-pulse-table-card).\n\nThis card displays a table view of devices monitored through the integration, designed to visualize network health data collected. It transforms raw connectivity metrics into an interactive, real-time table, allowing users to monitor device status, latency, and stability at a glance.\nKey capabilities include:\n- **Real-Time Updates**: Leverages Home Assistant WebSockets to display live changes in connectivity and response times without page reloads.\n- **Advanced Organization**: offers flexible grouping by integration and status-based filtering (Online/Offline) to easily manage large numbers of devices.\n- **Customizable Layout**: Fully configurable via the visual editor, allowing you to toggle specific columns—such as Host, Last Response Time, or Pings Failed—to suit your monitoring needs.\n- **Interactive Interface**: Supports dynamic sorting and text filtering, with direct access to standard \"more-info\" dialogs for detailed device history.\n\nThe card can be added to your dashboard as a standard custom card once installed and configured through HACS or manual setup.\n\n---\n\n## Example Automation\n\nSends a notification to the mobile app when one or more devices go offline, keeps that notification updated with the current list of offline devices or clears it when all devices are back online, and sends an additional notification each time a device reconnects.\n\n```yaml\nalias: Devices Disconnection/Re-Connection Notification\ntriggers:\n  - trigger: event\n    event_type: device_pulse_device_came_online\n    event_data: {}\n    id: came-online\n  - trigger: state\n    entity_id:\n      - sensor.devices_offline\n    id: went-offline\n    attribute: went_offline_device_ids\nconditions: []\nactions:\n  - choose:\n      - conditions:\n          - condition: trigger\n            id:\n              - went-offline\n        sequence:\n          - if:\n              - condition: template\n                value_template: \u003e-\n                  {{ state_attr('sensor.devices_offline', 'offline_device_ids')\n                  | length \u003e 0 }}\n                alias: There are devices offline\n            then:\n              - action: notify.\u003cMY_MOBILE_APP\u003e\n                metadata: {}\n                data:\n                  message: \u003e-\n                    {%- set offline_ids = state_attr('sensor.devices_offline', 'offline_device_ids') -%} \n                    {%- set device_names = offline_ids | map('device_attr', 'name') | list -%}\n                    Following devices are OFFLINE:  \n\n                    {{ device_names | join(', ') }}\n                  data:\n                    tag: device-pulse-offline\n                alias: Send or Update Notification\n            else:\n              - alias: Clear Notification\n                action: notify.\u003cMY_MOBILE_APP\u003e\n                metadata: {}\n                data:\n                  message: clear_notification\n                  data:\n                    tag: device-pulse-offline\n                    clear_notification: true\n      - conditions:\n          - condition: trigger\n            id:\n              - came-online\n        sequence:\n          - action: notify.\u003cMY_MOBILE_APP\u003e\n            data:\n              message: \u003e-\n                {%- set came_online_id = trigger.event.data.device_id -%} \n                {%- set device_name = device_attr(came_online_id, 'name_by_user') or device_attr(came_online_id, 'name') -%}\n                This device came back ONLINE: {{ device_name }} \nmode: parallel\nmax: 5\n```\n\n---\n\n## Example With Button Card\n\n\u003cp float=\"left\"\u003e\n  \u003cimg src=\"https://github.com/studiobts/home-assistant-device-pulse/blob/main/images/custom_button_card_example.png?raw=true\" /\u003e\n\u003c/p\u003e\n\n```yaml\ntype: custom:button-card\nentity: sensor.devices_offline\nshow_state: false\nshow_icon: false\nshow_name: false\nstyles:\n  card:\n    - padding: 8px\n    - border-radius: 10px\n    - background-color: \"#fde9ee\"\n    - border-color: \"#fbd3dc\"\n    - color: \"#c0123c\"\n  grid:\n    - display: grid\n    - grid-template-columns: auto auto auto 1fr\n    - grid-template-rows: auto auto\n    - grid-template-areas: |\n        \"icon entity\"\n        \"icon list\"\n  custom_fields:\n    icon:\n      - grid-area: icon\n      - justify-self: start\n      - width: 60px\n      - align-self: center\n      - margin-right: 10px\n    entity:\n      - grid-area: entity\n      - justify-self: start\n      - align-self: end\n      - text-align: left\n      - font-size: 20px\n      - font-weight: bold\n      - line-height: 35px\n      - text-transform: uppercase\n    list:\n      - grid-area: liste\n      - justify-self: start\n      - align-self: start\n      - text-align: left\n      - font-size: 16px\n      - font-weight: bold\n      - color: var(--secondary-text-color)\ncustom_fields:\n  icon: |\n    [[[\n      return '\u003cha-icon icon=\"mdi:alert-circle-outline\"\u003e';\n    ]]]\n  entity: |\n    [[[ return `DEVICES OFFLINE` ]]]\n  list: |\n    [[[\n      var ids = entity.attributes.offline_device_ids || [];\n      var names = ids.map(id =\u003e {\n        var device = Object.values(hass.devices).find(d =\u003e d.id === id);\n        return device ? device.name : id;\n      });\n      return names.join('\u003cbr\u003e');\n    ]]]\n```\nTo show the card only if there are devices disconnected, add a visibility condition\n\n```yaml\ncondition: numeric_state\nentity: sensor.devices_offline\nabove: 0\n```\n\n## Support\n\nFor issues and feature requests, please visit the [GitHub repository](https://github.com/studiobts/home-assistant-device-pulse).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstudiobts%2Fhome-assistant-device-pulse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstudiobts%2Fhome-assistant-device-pulse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstudiobts%2Fhome-assistant-device-pulse/lists"}