Meross EM-series Energy Monitor
GEM driver for the Meross EM-series multi-channel energy monitors — em01 (1-channel), em06 (6-channel), em16 / em16p (16-channel). Pairs once with the Meross cloud to extract the account key and the device uuid; thereafter every poll flows over signed HTTP /config on the device. Read-only — these meters have no relay/switching surface, so the driver exposes no on/off verbs.
Prerequisites
- Meross EM-series device on the same LAN, already onboarded via the Meross app at least once.
- Meross cloud account credentials (used only during the one-time
pair to fetch the account key and the device uuid).
Setup steps
- Add the device. In Devices, create a new device with driver
meross_em. Set ip, username (Meross email), password (Meross cloud password).
- Pair. Run the
pair command to fetch and persist the account key + device uuid + model.
- Sync zones. Run
sync_zones. The driver creates one read-only zone per active CT-clamp channel (1..N for the detected model).
- Verify. Zone attributes populate within one
status_interval: power, current, voltage, power_factor, energy_today, energy_week, energy_month (and their _export siblings for back-feed). state flips to on when channel power exceeds 5 W, otherwise off.
Attributes
Device — required
| Name | Type | Description |
|---|
ip | string | Device LAN IP. |
username | string | Meross cloud email. Only used during pair. |
password | string (secure) | Meross cloud password. Only used during pair; can be cleared after. |
Device — optional
| Name | Type | Default | Description |
|---|
cloud_base | string | https://iotx-us.meross.com | Region: US/EU/AP. |
status_interval | int (ms) | 10000 | Polling cadence for per-channel electricity. |
http_timeout | int (ms) | 5000 | Local HTTP request timeout. |
user_id | string (readonly) | — | Populated by pair. |
uuid | string (readonly) | — | Populated by pair. 32-char hex. |
key | string (secure, readonly) | — | Per-account shared secret. Populated by pair; same key shared with any other Meross device on the account. |
model | string (readonly) | — | Populated from the device hardware block (em01 / em06 / em16 / em16p). Determines how many channels the discovery sweep asks for. |
Zone — address
| Field | Description |
|---|
address | CT-clamp channel number (1..N). Auto-populated by sync_zones. |
Commands
| Name | Args | Description |
|---|
pair | — | One-time cloud login to fetch the account key + device uuid. Re-runnable safely. |
sync_zones | — | Create one read-only zone per active CT-clamp channel. |
refresh | — | Force an immediate per-channel poll outside the regular status interval. |
get_state | address | Fetch raw electricity reading for one channel. |
get_all | — | Dump Appliance.System.All + per-channel electricity (raw). |
Zone state attributes
| Attribute | Unit | Notes |
|---|
state | on / off | Flips to on when power ≥ 5 W (clears the standby-load floor). |
power | W | |
current | A | |
voltage | V | History-enabled by default — useful for brown-out hunting. |
power_factor | 0..1 | History-enabled. |
energy_today / energy_week / energy_month | Wh | Cumulative. History-enabled on energy_today. |
energy_today_export / _week_export / _month_export | Wh | Non-zero indicates back-feed (solar/generator). |
Known quirks
- Channels are 1..N on every model; channel 0 is reserved and silently filtered by firmware.
- Polling
Appliance.Control.ElectricityX with malformed payloads (e.g. empty electricity[]) causes the device to drop the TCP connection silently. The driver always sends {electricity:[{channel:1}..{channel:N}]}.
todayX / weekX / mConsumeX are signed export counters. The driver surfaces them as energy_*_export so the sign survives downstream.
- The cloud login uses a hard-coded Meross app secret. Meross occasionally bumps this contract; if
pair fails after a Meross app update the constant may need refreshing.
Troubleshooting
pair fails with bad credentials. Verify email/password against the Meross app and confirm cloud_base matches your region.
- Commands return error
5001 "sign error". Stored key is stale (typically a password change). Re-run pair.
sync_zones creates fewer zones than expected. Run get_all and confirm hardware.type matches one of em01 / em06 / em16 / em16p. The driver bounds zone creation by model channel count.
- All channels read 0. CT clamps may be installed backwards or not seated — verify in the Meross app first.