# Zigbee & Z-Wave Local Device Database (`homelabmobile/smart-home-device-db`) Actor

Zigbee and Z-Wave devices that work locally with Zigbee2MQTT or Z-Wave JS: vendor, model, Zigbee model IDs, Z-Wave product IDs, capabilities. From the MIT-licensed device databases.

- **URL**: https://apify.com/homelabmobile/smart-home-device-db.md
- **Developed by:** [Home Lab Mobile](https://apify.com/homelabmobile) (community)
- **Categories:** Developer tools, Open source, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Smart Home Local Compatibility Device Database (Zigbee, Z-Wave)

Find out whether a Zigbee or Z-Wave device works locally (no vendor cloud) with Zigbee2MQTT or
Z-Wave JS, and get its identifiers as clean JSON: vendor, model, Zigbee model IDs and fingerprints,
Z-Wave manufacturer/product IDs, device type, capabilities and firmware notes. The data comes from
the open, MIT-licensed device databases those two projects publish on npm; no website is scraped.

### What it does

- Searches about 8,200 devices: 5,800 Zigbee rows (including rebranded "white-label" variants) from
  `zigbee-herdsman-converters`, the device library behind Zigbee2MQTT, and 2,400 Z-Wave device
  config files from `@zwave-js/config`, the device database behind Z-Wave JS.
- Filters by protocol, vendor and keyword. The keyword search also matches identifiers, so you can
  look up a device by the Zigbee model ID it reports (e.g. `TS0601`, `_TZE200_...`) or by its Z-Wave
  `manufacturerId:productType:productId` (e.g. `0x0086:0x0002:0x0064`).
- Returns one row per device with a `worksLocallyWith` flag, the source package version and a link
  to the exact definition file on GitHub, so every row can be checked.
- Useful as a join key: match a shop or deal listing to a device that runs without the vendor cloud.
- Returns one result per device. You pay only for valid results; malformed rows are dropped and not charged.
- Fails loudly: if a source cannot be downloaded or its layout changes (suspiciously few devices),
  the run fails instead of returning an empty or partial dataset.

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `protocols` | array of `"zigbee"`, `"zwave"` | no | Databases to search. Empty = both. |
| `vendors` | array of strings | no | Keep devices whose vendor contains one of these (case-insensitive). Empty = all. |
| `keyword` | string | no | Space-separated words that must all appear in vendor, model, description, IDs, device types or capabilities. |
| `includeWhiteLabels` | boolean | no | Include rebranded Zigbee variants (default `true`). |
| `maxResults` | integer | no | Stop after this many devices (default 100, max 10,000). Caps the cost of a run. |

Results are sorted by vendor, then model. Examples:

```json
{ "keyword": "motion sensor", "maxResults": 20 }
```

```json
{ "protocols": ["zwave"], "vendors": ["Zooz"], "maxResults": 200 }
```

```json
{ "protocols": ["zigbee"], "keyword": "_TZE200_ztc6ggyl" }
```

#### Calling from an AI agent (MCP)

This Actor works as a tool through the [Apify MCP server](https://mcp.apify.com). Example tool call:

```json
{ "actor": "homelabmobile/smart-home-device-db", "input": { "vendors": ["IKEA"], "keyword": "remote", "maxResults": 10 } }
```

### Output

One JSON object per device. Real rows from a local run (Zigbee, then Z-Wave; the Z-Wave product
list is shortened here):

```json
{
    "protocol": "zigbee",
    "vendor": "IKEA",
    "model": "E2134",
    "description": "VALLHORN wireless motion sensor",
    "whiteLabelOf": null,
    "zigbeeModelIds": ["VALLHORN Wireless Motion Sensor"],
    "zigbeeFingerprints": [],
    "zwaveManufacturerId": null,
    "zwaveProducts": [],
    "deviceTypes": ["sensor"],
    "capabilities": ["occupancy", "illuminance", "identify", "battery", "voltage", "lux_value", "timer"],
    "zwaveConfigParameters": [],
    "firmwareVersionRange": null,
    "otaUpdates": true,
    "notes": [],
    "zwaveInclusion": null,
    "manualUrl": null,
    "worksLocallyWith": ["Zigbee2MQTT"],
    "sourceVersion": "zigbee-herdsman-converters@26.119.0",
    "sourceUrl": "https://github.com/Koenkk/zigbee-herdsman-converters/blob/v26.119.0/src/devices/ikea.ts",
    "scrapedAt": "2026-10-14T02:39:18.296Z"
}
```

```json
{
    "protocol": "zwave",
    "vendor": "AEON Labs",
    "model": "ZW117",
    "description": "Range Extender 6",
    "whiteLabelOf": null,
    "zigbeeModelIds": [],
    "zigbeeFingerprints": [],
    "zwaveManufacturerId": "0x0086",
    "zwaveProducts": [
        { "productType": "0x0004", "productId": "0x0075", "zwaveAllianceIds": [1998] },
        { "productType": "0x0104", "productId": "0x0075", "zwaveAllianceIds": [1966] }
    ],
    "deviceTypes": [],
    "capabilities": null,
    "zwaveConfigParameters": ["LED Indicator", "Partner ID", "Lock Configuration", "Device Tag", "Reset to Factory Default Setting"],
    "firmwareVersionRange": { "min": "0.0", "max": "255.255" },
    "otaUpdates": null,
    "notes": [],
    "zwaveInclusion": "Press the Z-Wave Button on Range Extender 6",
    "manualUrl": "https://products.z-wavealliance.org/ProductManual/File?folder=&filename=MarketCertificationFiles/2520/Range%20Extender%206%20manual.pdf",
    "worksLocallyWith": ["Z-Wave JS"],
    "sourceVersion": "@zwave-js/config@15.31.1",
    "sourceUrl": "https://github.com/zwave-js/zwave-js/blob/256c0ad1214947be013828bf9e636455cab4ff9b/packages/config/config/devices/0x0086/zw117.json",
    "scrapedAt": "2026-10-14T02:38:46.869Z"
}
```

Field notes:

- `deviceTypes` and `capabilities` are Zigbee only. They are derived from the Zigbee2MQTT "exposes":
  `light`, `switch`, `cover`, `lock`, `climate`, `fan` come straight from the exposes; `remote` means
  the device sends button `action`s; `sensor` means it has read-only readings other than battery,
  voltage and link quality. For about 270 Zigbee rows the exposes depend on the paired unit, so
  `capabilities` is `null` and `notes` says so.
- Z-Wave config files do not list device classes or command classes (Z-Wave JS discovers them when
  the device is included), so Z-Wave rows carry configuration parameter labels instead.
- `worksLocallyWith` lists only what the source data supports: `Zigbee2MQTT` for devices defined in
  `zigbee-herdsman-converters`, `Z-Wave JS` for devices with a Z-Wave JS config file. ZHA support is
  not claimed, because no MIT-licensed source covers it.

Each run also writes a `RUN_SUMMARY` record (status, counts) and a `SOURCES` record (package
versions and device counts) to its key-value store.

### Data sources, freshness and licences

| Protocol | Source | How it is read | Freshness |
|---|---|---|---|
| Zigbee | npm package `zigbee-herdsman-converters` | Pinned dependency of the Actor build (currently 26.119.0). The Actor imports the per-vendor definition modules and reads their data fields. | As of the last Actor build. Upstream releases several times a week; we rebuild to pick them up. |
| Z-Wave | npm package `@zwave-js/config` | Latest published tarball downloaded from registry.npmjs.org at the start of each run (2 requests), checked against its sha512 integrity, parsed as JSON5 in memory. No package code is run. | Latest release at run time. |

Why this split: the Z-Wave package is pure JSON data, so reading the newest tarball each run is both
fresh and safe. The Zigbee device data is TypeScript compiled to JavaScript and has to be imported to
read capabilities; importing a different, unpinned version on every run would run unreviewed code
and could break the run whenever upstream changes its dependencies, so it is pinned. Every row
carries `sourceVersion` so you always know which release it came from.

Not used: zigbee2mqtt.io documentation pages (GPL-3.0), csa-iot.org product pages (their terms
forbid republishing) and the CSA Distributed Compliance Ledger (terms not yet verified). Matter
devices are therefore not included in this version.

#### Licence notices

The device data is derived from the following MIT-licensed works. Their copyright and permission
notices are reproduced here as the licence requires.

**zigbee-herdsman-converters** (https://github.com/Koenkk/zigbee-herdsman-converters)

```
MIT License

Copyright (c) 2018 Koen Kanters

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

**zwave-js / @zwave-js/config** (https://github.com/zwave-js/zwave-js), including `manufacturers.json`
and the device configuration files

```
MIT License

Copyright (c) 2018-2024 AlCalzone

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

This Actor is not affiliated with or endorsed by the Zigbee2MQTT or Z-Wave JS projects, the
Connectivity Standards Alliance or the Z-Wave Alliance. Product and brand names belong to their
owners.

### Pricing

Pay per event:

| Event | Price | Per 1,000 |
|---|---|---|
| Result (one valid row) | $0.002 | $2.00 |

Plus Apify's standard Actor start charge. A typical run of 20 results costs about $0.04; the whole
database (about 8,200 rows) costs about $16.40.

### Known limits

- Zigbee and Z-Wave only. Matter / Thread devices are not included yet (see "Data sources").
- "Works locally" means the device has a definition in the Zigbee2MQTT or Z-Wave JS database. It
  does not test the device, and some features may still need a recent firmware or a specific
  coordinator. ZHA compatibility is not reported.
- Zigbee data is as fresh as the last Actor build (the pinned package version is in every row);
  Z-Wave data is the latest npm release at run time.
- No prices, shop links or images: the sources do not carry them.
- Z-Wave rows have no `deviceTypes` or `capabilities`; the config files do not contain them.
- Vendor names are as the sources spell them (e.g. Aeotec Z-Wave devices are listed as "AEON Labs").
- Personal data: the sources contain none in the fields we output; free-text fields are additionally
  scrubbed of e-mail addresses.
- Network use per run: at most 2 requests to registry.npmjs.org (none for Zigbee-only runs).

### Support

Open an issue on the Actor's Issues tab. We reply within 2 business days.

# Actor input Schema

## `protocols` (type: `array`):

Which device databases to search: "zigbee" (Zigbee2MQTT device list) and/or "zwave" (Z-Wave JS device config files). Leave empty for both.

## `vendors` (type: `array`):

Only return devices whose vendor name contains one of these strings (case-insensitive), e.g. \["IKEA", "Aqara", "Zooz"]. Leave empty for all vendors.

## `keyword` (type: `string`):

Space-separated words that must all appear in the device's vendor, model, description, white-label original, Zigbee model IDs or fingerprints, Z-Wave IDs ("0x0086:0x0002:0x0064"), device types or capabilities. Case-insensitive. Example: "motion sensor" or "TS0601" or "color_temp". Leave empty for no keyword filter.

## `includeWhiteLabels` (type: `boolean`):

Zigbee only: also return rebranded variants of a device sold under another brand (they carry whiteLabelOf). Default true.

## `maxResults` (type: `integer`):

Stop after this many devices. You are charged per result, so this caps the cost of a run. The full database is about 8,200 devices (5,800 Zigbee incl. white labels, 2,400 Z-Wave).

## Actor input object example

```json
{
  "protocols": [
    "zigbee",
    "zwave"
  ],
  "vendors": [
    "IKEA"
  ],
  "includeWhiteLabels": true,
  "maxResults": 50
}
```

# Actor output Schema

## `results` (type: `string`):

One JSON object per result; fields are described in the dataset schema.

## `runSummary` (type: `string`):

RUN_SUMMARY: status, counts and the silent-failure verdict for this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "protocols": [
        "zigbee",
        "zwave"
    ],
    "vendors": [
        "IKEA"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("homelabmobile/smart-home-device-db").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "protocols": [
        "zigbee",
        "zwave",
    ],
    "vendors": ["IKEA"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("homelabmobile/smart-home-device-db").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "protocols": [
    "zigbee",
    "zwave"
  ],
  "vendors": [
    "IKEA"
  ],
  "maxResults": 50
}' |
apify call homelabmobile/smart-home-device-db --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,homelabmobile/smart-home-device-db"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZuXXiICXne5odQ9M7/builds/1LFR1KJL3k5g8aCxk/openapi.json
