Disclaimer: This is an independent, community-developed custom integration and is not an official product of, endorsed by, or affiliated with The Crow Group. All product names and trademarks are the property of their respective owners.
A Home Assistant custom integration for Crow alarm panels that connects to Crow Cloud using the crow_security_ng Python library.
- Alarm Control Panel — arm/disarm in Away and Home modes; real-time state via WebSocket; one entity per area/partition
- Zone Binary Sensors — open/close state for every zone with motion, tamper, bypass, battery, RSSI and battery voltage as attributes
- Output Switches — turn outputs on/off with tamper, battery, RSSI and battery voltage as attributes
- DECT Measurement Sensors — temperature, humidity, air pressure and gas level sensors for smart devices
- PIR Camera Image Entities — one
image.*entity per configured camera zone; automatically pre-populated with the most recent stored snapshot on startup; refresh on demand via thefetch_camera_snapshotaction
- Home Assistant 2024.11 or newer
crow_security_ng >= 0.2.1(installed automatically)
- Open HACS in Home Assistant
- Click Integrations → three-dot menu → Custom repositories
- Add
https://github.com/tubalainen/crow_securitywith category Integration - Install and restart Home Assistant
- Copy the
custom_components/crow_shepherdfolder to yourcustom_componentsdirectory - Restart Home Assistant
- Go to Settings → Devices & Services → Add Integration
- Search for Crow Shepherd
- Enter your credentials:
- Email — your Crow Cloud account email
- Password — your Crow Cloud account password
- Panel MAC Address — the MAC address of your panel (found in the Crow Cloud app)
- Panel User Code (optional) — required only if your panel needs a code to arm/disarm
All of the following are accepted — the integration normalises them automatically:
AABBCCDDEEFF
AA:BB:CC:DD:EE:FF
AA-BB-CC-DD-EE-FF
After setup, you can adjust:
- Update interval — how often to poll Crow Cloud (10–300 s, default 30 s)
- Panel User Code — update the arm/disarm code without reconfiguring
One entity per area/partition:
| Entity | Description |
|---|---|
alarm_control_panel.<area_name> |
Arm Away / Arm Home / Disarm |
Attributes: area_id, raw_state, ready_to_arm, ready_to_stay, zone_alarm
One entity per zone:
| Entity | Description |
|---|---|
binary_sensor.<zone_name> |
on = open / triggered |
Attributes: zone_id, zone_type, bypassed, tamper, battery_low, battery_voltage, active, rssi
One entity per output:
| Entity | Description |
|---|---|
switch.<output_name> |
Turn output on/off |
Attributes: output_id, output_type, tamper, battery_low, battery_voltage, rssi
One entity per measurement type per smart device:
| Entity | Description |
|---|---|
sensor.<device_name>_temperature |
Temperature (°C) |
sensor.<device_name>_humidity |
Relative humidity (%) |
sensor.<device_name>_air_pressure |
Atmospheric pressure (hPa) |
sensor.<device_name>_gas_level |
Gas level (0–4 scale) |
One entity per configured camera zone:
| Entity | Description |
|---|---|
image.<zone_name>_snapshot |
Latest JPEG snapshot |
Select which zones are PIR cameras via Settings → Devices & Services → Crow Shepherd → Configure (gear icon) under PIR Camera Zones. On every integration startup, each image entity is automatically pre-populated with the most recent stored picture from the panel. Zones that have no pictures yet remain empty without generating log warnings.
To fetch a fresh picture after a PIR trigger, call crow_shepherd.fetch_camera_snapshot.
Attributes: picture_id, picture_type (alarm / manual), panel_time
Fetches the latest snapshot from a PIR camera zone and updates the image entity.
Target: one or more image.* entities from this integration.
action: crow_shepherd.fetch_camera_snapshot
target:
entity_id: image.hall_cam_snapshotBypass or unbypass a zone on the alarm panel.
| Parameter | Type | Required | Description |
|---|---|---|---|
zone_id |
number | Yes | Numeric zone ID |
bypass |
boolean | Yes | true to bypass, false to unbypass |
action: crow_shepherd.bypass_zone
data:
zone_id: 3
bypass: true| Panel state | Home Assistant state |
|---|---|
disarmed |
disarmed |
armed |
armed_away |
stay_armed |
armed_home |
arm in progress |
arming |
stay arm in progress |
arming |
triggered |
triggered |
pending |
pending |
automation:
- alias: "Alarm Triggered Notification"
trigger:
- platform: state
entity_id: alarm_control_panel.home_alarm
to: triggered
action:
- action: notify.mobile_app
data:
title: "Alarm Triggered"
message: "Your alarm has been triggered"automation:
- alias: "Arm Away When Leaving"
trigger:
- platform: state
entity_id: person.your_name
to: not_home
action:
- action: alarm_control_panel.alarm_arm_away
target:
entity_id: alarm_control_panel.home_alarmautomation:
- alias: "Disarm When Arriving"
trigger:
- platform: state
entity_id: person.your_name
to: home
action:
- action: alarm_control_panel.alarm_disarm
target:
entity_id: alarm_control_panel.home_alarmautomation:
- alias: "Fetch snapshot on motion"
trigger:
- platform: state
entity_id: binary_sensor.hall_cam
to: "on"
action:
- action: crow_shepherd.fetch_camera_snapshot
target:
entity_id: image.hall_cam_snapshot- Verify your Crow Cloud email and password
- Try logging in via the Crow Cloud app to confirm your account is active
- Double-check the MAC address in the Crow Cloud app settings
- Ensure the panel is online and connected to the internet
- Check Home Assistant logs for errors
- Try reloading the integration from Settings → Devices & Services
- DECT sensors only appear if your panel has wireless smart devices
- The image entity is on-demand only — it does not update automatically
- Call
crow_shepherd.fetch_camera_snapshotto retrieve the latest picture
- The integration uses WebSocket for live updates; it reconnects automatically after disruptions
- If updates are delayed, check your Home Assistant's internet connection
For issues and feature requests, open an issue on GitHub.
- Uses the crow_security_ng Python library by @tubalainen
- Based on research from ha_crow_cloud_security_component by @tubalainen
MIT License — see the LICENSE file for details.