Skip to main content

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

  1. Add the device. In Devices, create a new device with driver meross_em. Set ip, username (Meross email), and password (Meross cloud password).
  2. Let it pair and discover — automatic. As soon as the device has a username and password, 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.
  3. Manual re-pair / re-scan (only when needed). Run the pair command to re-pair after a Meross password change (a stale key surfaces as a 5001 "sign error" on every command). Run sync_zones to re-scan for channels and create any zone that is missing. Run refresh to force an immediate read outside the poll interval.
  4. Verify. Each channel's zone fills in within one status_interval: power, current, voltage, power_factor, energy_today, energy_week, energy_month (and their _export siblings for back-feed). state reads on when channel power is at or above 5 W, otherwise off.
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

NameTypeDescription
ipstringDevice LAN IP.
usernamestringMeross cloud email. Only used during pair.
passwordstring (secure)Meross cloud password. Only used during pair; can be cleared after.

Device — optional

NameTypeDefaultDescription
cloud_basestringhttps://iotx-us.meross.comRegion: US/EU/AP.
status_intervalint (ms)10000Polling cadence for per-channel electricity.
http_timeoutint (ms)5000Local HTTP request timeout.
user_idstring (readonly)Populated by pair.
uuidstring (readonly)Populated by pair. 32-char hex.
keystring (secure, readonly)Per-account shared secret. Populated by pair; same key shared with any other Meross device on the account.
modelstring (readonly)Populated from the device hardware block (em01 / em06 / em16 / em16p). Determines how many channels the discovery sweep asks for.

Zone — address

FieldDescription
addressCT-clamp channel number (1..N). Auto-populated by sync_zones.

Commands

NameArgsDescription
pairOne-time cloud login to fetch the account key + device uuid. Re-runnable safely.
sync_zonesCreate one read-only zone per active CT-clamp channel.
refreshForce an immediate per-channel poll outside the regular status interval.
get_stateaddressFetch raw electricity reading for one channel.
get_allDump Appliance.System.All + per-channel electricity (raw).

Zone state attributes

AttributeUnitNotes
stateon / offFlips to on when power ≥ 5 W (clears the standby-load floor).
powerWTagged with the power.circuit metric role → feeds the Top Circuits widget on the Power Management dashboard.
currentA
voltageVLive 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_factor0..1Live value only — not written to attribute history (same per-poll jitter).
energy_today / energy_week / energy_monthWhCumulative. 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_exportWhNon-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.