Skip to main content

Meross Smart Hub

GEM driver for the Meross Smart Hub (msh300, msh400 Pro) and its paired sub-devices: sprinkler timers (mst100/mst200), thermostat valves (mts100/mts150/mts150p), temperature & humidity sensors (ms100/ms130), door/window sensors (ms200), water-leak sensors (ms400/ms405), and smoke alarms (ma151). The hub keeps talking to the Meross cloud — the Meross mobile app continues to work alongside GEM — but every GEM command and state read flows over signed HTTP /config on the hub's LAN address.

Prerequisites

  • Meross Smart Hub on the same LAN, already onboarded via the Meross app at least once.
  • Meross cloud account credentials. Used only during the one-time pair command to fetch the per-account key and the hub's uuid; not used afterward.

Setup steps

  1. Add the device. In Devices, create a new device with driver meross_hub. Set ip, username (Meross email), and password (Meross cloud password).
  2. Pair. Run the pair command on the device. The driver logs into the Meross cloud, fetches the account key and this hub's uuid, and persists them as secure device attributes. After a successful pair the password can be cleared if desired.
  3. Sync zones. Run sync_zones to enumerate paired sub-devices and auto-create matching GEM zones — one zone per sub-device, with zone.address set to the 12-char Meross sub-device id and meross_subdevice_type recorded as a zone attribute so the driver knows which Hub.* namespace to use.
  4. Verify. State polling fires every status_interval (default 10 s) and writes state, battery, and (for thermostats) temperature/setpoint/system_mode/heating/flow_rate/elapsed_seconds onto the zone.

Attributes

Device — required

NameTypeDescription
ipstringHub 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 Appliance.System.All.
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; used to sign every HTTP request.

Zone — address

FieldDescription
addressMeross sub-device id (12 hex chars, e.g. 1B008FAD9F7C). Auto-populated by sync_zones.

Commands

NameArgsDescription
pairOne-time cloud login to fetch the account key + hub uuid. Re-runnable after a password change.
sync_zonesEnumerate sub-devices on the hub and auto-create matching GEM zones.
on / off / open / close / stopaddressGeneric verbs. Sprinklers route through Appliance.Control.Water; everything else through Appliance.Hub.ToggleX.
leveladdress, level (0-100)Sub-devices are binary; level > 0 is treated as on.
heat_setpoint / cool_setpointaddress, setpoint (°C)Thermostat valves. Accepts °C × 1 or × 10.
system_modeaddress, mode (auto / cool / heat / off)
fan_modeaddress, mode (auto / on)
get_stateaddressFetch current ToggleX state for one sub-device.
get_allDump Appliance.System.All for diagnostics.

Known quirks

  • The hub stays subscribed to mqtt-us-X.meross.com. The driver never alters broker config — the Meross app keeps working alongside GEM.
  • Commands return SETACK immediately; the hub does not push real-time state changes over local HTTP. State is refreshed only by polling.
  • Newer firmware advertises Appliance.Encrypt.ECDHE. This driver speaks plaintext HTTP onlymsh400 firmware 4.5.36 works as-is; newer encrypted-only firmware does not.
  • The cloud login signs with a hard-coded Meross app secret and the v1/Auth/signIn endpoint. Meross occasionally bumps that 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 (iotx-us / iotx-eu / iotx-ap).
  • Commands return error 5001 "sign error". The stored key is stale (typically because the user changed their Meross password). Re-run pair.
  • No zones after sync_zones. Use get_all to inspect digest.hub.subdevice. An empty array means no paired sub-devices, or that the hub is currently offline.
  • Every command times out. Hub may be rebooting or off-network; ping <ip> first. Otherwise raise http_timeout for slow networks.