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
pairto fetch the account key and the device uuid).
Setup steps
- Add the device. In Devices, create a new device with driver
meross_em. Setip,username(Meross email), andpassword(Meross cloud password). - Let it pair and discover — automatic. As soon as the device has a
usernameandpassword, GEM pairs itself the first time it connects: it logs into the Meross cloud, pulls the per-account key + device uuid + model, then immediately creates one read-only zone per active CT-clamp channel (1..N for the detected model). You do not have to run anything by hand for first-time setup. - Manual re-pair / re-scan (only when needed). Run the
paircommand to re-pair after a Meross password change (a stale key surfaces as a5001 "sign error"on every command). Runsync_zonesto re-scan for channels and create any zone that is missing. Runrefreshto force an immediate read outside the poll interval. - Verify. Each channel's zone fills in within one
status_interval:power,current,voltage,power_factor,energy_today,energy_week,energy_month(and their_exportsiblings for back-feed).statereadsonwhen channel power is at or above 5 W, otherwiseoff.
Where the zones land
Auto-created channel zones are placed under the Power subsystem (present on every stock install). If you have deleted the Power subsystem, zone creation is skipped silently — re-add it under Subsystems, then run sync_zones. The meter itself has no switching surface, so each zone is a read-only sensor; its address is the CT-clamp channel number.
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 | Tagged with the power.circuit metric role → feeds the Top Circuits widget on the Power Management dashboard. |
current | A | |
voltage | V | Live value only — not written to attribute history (it jitters on every poll and would flood the history table). Watch it live on a zone tile or in the script console. |
power_factor | 0..1 | Live value only — not written to attribute history (same per-poll jitter). |
energy_today / energy_week / energy_month | Wh | Cumulative. Only energy_today is history-enabled (use it for daily-trend reports); the week/month totals are live counters. |
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.ElectricityXwith malformed payloads (e.g. emptyelectricity[]) causes the device to drop the TCP connection silently. The driver always sends{electricity:[{channel:1}..{channel:N}]}. todayX/weekX/mConsumeXare signed export counters. The driver surfaces them asenergy_*_exportso the sign survives downstream.- The cloud login uses a hard-coded Meross app secret. Meross occasionally bumps this contract; if
pairfails after a Meross app update the constant may need refreshing.
Troubleshooting
pairfails with bad credentials. Verify email/password against the Meross app and confirmcloud_basematches your region.- Commands return error
5001 "sign error". Storedkeyis stale (typically a password change). Re-runpair. sync_zonescreates fewer zones than expected. Runget_alland confirmhardware.typematches one ofem01/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.