MerossIot is a free, open source internet of things (iot) project written in Python and released under MIT. It has 538 GitHub stars, 105 forks and 11 open issues, and was last pushed 8 months ago. On this registry it ranks #98 of 99 tracked projects in Internet of Things (IoT), with 5 head-to-head comparisons available.

What is MerossIot?

MerossIot is an asynchronous Python library for controlling Meross smart-home devices, built for Python developers and home-automation builders who want to drive Meross hardware from code rather than through the vendor's app.

What it is

MerossIot is an open-source Python library, published on PyPI as meross-iot, that provides asynchronous access to Meross cloud and MQTT endpoints so that Meross devices can be discovered, queried, and commanded from Python. It lives in the Python and home-automation ecosystem, carries the MIT licence, and is documented at a dedicated project site. Development is active, with the most recent push in March 2026 and the library released to PyPI automatically whenever the CI pipeline passes.

The concrete problem it solves is that Meross hardware is normally reachable only through the vendor app or through hand-rolled calls against the Meross cloud HTTP API and MQTT broker. Those endpoints are undocumented, authenticated with a sign-in flow, and change without notice. MerossIot replaces that ad-hoc integration work with a maintained client: it handles login through the newer signIn path, carries the API and MQTT endpoints inside its CloudCreds object, manages MFA responses in the login data, and exposes devices through a single MerossManager entry point.

Key capabilities

  • Asynchronous device management and control through the MerossManager class, with a control parameter for automatic device discovery.
  • MQTT connectivity built on paho-mqtt v2 while remaining backward compatible, with an SSL context that can be passed to MerossManager() for MQTT SSL connections.
  • Local-LAN encryption support for the newest Meross devices, alongside the cloud connection path.
  • Login and credential handling that covers the new signIn API path, a configurable api_base_url, auto-retry on a wrong endpoint, and MFA code error handling.
  • Device coverage that includes water-leak sensors such as the MS400 and MS405, the MTS960, and roller shutter devices with position tracking through a dedicated mixin.
  • The meross_sniffer utility, which collects messages by spoofing the hardware device on the Meross cloud, plus a device registry dumper.
  • Cryptographic dependencies satisfied through pycryptodomex rather than the older Crypto package.

Who uses it and how

  • Python developers who want Meross devices inside larger automation scripts instead of the Meross app, using one library for login, discovery, and command execution.
  • Home Assistant users, since a Meross Home Assistant component is referenced in the changelog as having been affected by library defects and API changes.
  • Contributors, who work against a CI pipeline that builds the code, runs junit tests on Python 3.8 and above, and issues real on/off commands against dedicated devices kept online around the clock.
  • Debuggers and reverse engineers, who use the meross_sniffer utility and its hardware-spoofing mode to inspect what the Meross cloud sends and receives.
  • Maintainers of long-running installations, who must track upstream Meross API shifts and upgrade promptly when the vendor changes an endpoint.

Getting started

Install the package from PyPI as meross-iot, then construct a MerossManager with valid Meross cloud credentials, supplying api_base_url as described in the documentation. Full usage guidance is published at the project documentation site.

How it compares

This registry provides no list of paid products that MerossIot replaces, and the facts name no competing library. The only adjacent tooling named is a Meross Home Assistant component, which is a consumer of this library rather than an alternative to it. On the evidence available, MerossIot stands alone in this registry as a client library for Meross devices.

When to use it — and when not to

Choose it if the devices are Meross, the workflow is Python, and someone is willing to keep pace with upstream cloud changes: the project has already shipped breaking changes to the MerossManager() signature and a breaking change to the LOGIN method, dropped Python 3.7 support, and warned publicly that Meross altered the HTTP SubDevice info API without notice, which broke library versions. It is a poor fit for anyone who needs a frozen, never-changing integration, or who cannot act on MFA prompts and endpoint corrections when Meross changes them. The local-LAN encryption path covers the newest devices, but the project's primary dependency remains the Meross cloud.

project readme (upstream, from github) — read inline

DEV Build Status 0.4.X.X Build codecov Documentation PyPI version Downloads PyPI - Downloads

⚠ !Attention! ⚠

Meross did change the HTTP SubDevice info API without notice. This has caused the library (versions Look at the test environment that ensures high quality code of the library!

When a pull-request is performed against this repository, a CI pipeline takes care of building the code, testing it on Python 3.8+, relying on some junit tests and, if all the tests pass as expected, the library is released on Pypi. However, to ensure that the code really works, the pipeline will issue on/off commands against real devices, that are dedicated 24/7 to the tests. Such devices have been bought by myself (with contributions received by donors). However, keeping such devices connected 24/7 has a cost, which I sustain happily due to the success of the library. Anyway, feel free to contribute via donations!

Changelog

0.4.10.4

  • Address #428 in response to unnotified HTTP API changes from meross cloud.
Older #### 0.4.10.3 - Add support for water leak sensors such as MS400 and MS405 - Add water-leak sensor examples

0.4.10.2

  • Allows to pass a specific ssl context to the manager to perform MQTT ssl connections using that SSL context. This is a breaking change: signature of MerossManager() has changed.

0.4.9.2

  • Partially Address #569, fix error when dealing with unknown sub-devices. Water leak sensor not supported yet.

0.4.9.1

  • Fix credentials object's "mqtt_domain" attribute being created as tuple rather than string. This error cased varius issues also with Meross Homeassistant component.

0.4.9.0

  • Upgrades paho-mqtt dependency to v2 but keeps backward compatibility - Thanks @mmatuska

0.4.8.0

  • Drops python 3.7 support
  • Address #410

0.4.7.5

  • Adds support for MTS960, addressing #337

0.4.7.3

  • Fixes missing mfaLockExpire key in login response data due to unexpected API changes from Meross
0.4.7.1
  • Updated requirements to use pycryptodomex instead of Crypto
0.4.7.0
  • Added local-lan encryption capabilities to support newest Meross devices
  • Fixed roller shutter mixin not updating initial position after a full async_update() invocation
  • Fixed #352
0.4.6.2
  • Fix dependency specification for paho-mqtt and other libraries
0.4.6.0
  • NOTE: this API version breaks backward compatibility with LOGIN method. When upgrading to this version, make sure to pass the new api_base_url value correctly as described in the documentation.
  • Switched the login API to the new signIn path as old /Auth/login is being deprecated
  • Improved CloudCreds to carry also API and MQTT endpoints
  • Handled auto-retry in case of wrong endpoint being used for login
  • Added mac-address attribute to BaseDevice class
  • Fix recursive import error for CLI utility and updated help command for API-BASE-URL parameter
  • Handling MFA code errors
  • Fix sniffer script and added MFA disable disclaimer
0.4.5.9
  • Improve meross_sniffer utility: add support to collect messages spoofing the hardware device on meross cloud.
  • Allow string namespace value for execute_command within manager.
0.4.5.7
  • Fix regression introduced with the latest refactor: missing properties on SubDevices.
0.4.5.4
  • Fix #274, due to Meross API change
0.4.5.4-rc1
  • Fix tests
  • Implement auto-discovery control parameter for the MerossManager
0.4.5.3
  • Implement device registry dumper (#255)
0.4.5.2
  • Adds support for Runtime mixin (addresses #270)
  • Improves documentation
0.4.5.1
  • Adds support for MOD150 oil diffuser
  • Enables position set for MSR100 devices (might not work with non-HomeKit versions, though)
0.4.5.0
  • Introduced support for local-lan-http command handling
  • RollerShutter refactor and code improvements
  • Added RollerShutter automatic tests
  • Added support for do-not-disturb mode
  • Implemented ThermostatMixin and added support for MTS200
0.4.4.7
  • Added manager options to override default mqtt server host/port connection info.
0.4.4.5
  • Added Content-Type header to API calls
0.4.4.4
  • Added support for MSG200
0.4.4.3
  • Improved mqtt client and async: switched back to mixed async/threading approach.
  • Added triggerSrc and uuid attributes to header
  • Fixed a bug affecting message dispatching to sub-devices
0.4.4.2
  • Removed rate limiting logic/switches
  • Fixed light_rgb test failing when issuing commands to smart-humidifier led
  • Handling HUB_ONLINE event at subdevice level
0.4.3.1
  • Fixed MQTT reconnection issue
0.4.3.0
  • Refactored asyncio calls affected by loop parameter deprecation
  • Various subdevice event handling improvements and bugfixes
0.4.2.4
  • Added manager reference to Manager push notification handlers
  • Improved push notification tests
0.4.2.3
  • Added new HTTP request headers (introduced with latest APP versions)
  • Added custom user agent customization option to MerossHttpClient
  • Implemented pending task cancellation when shutting down the manager
  • Implemented HTTP API stats counting
  • Fixed bug affecting push notification parsing when multiple sensors/valves were in use
0.4.2.2
  • Fixed asyncio and threading bug in _schedule_later() utility
  • Improved timeout argument not being always passed downstream
  • Implemented default command execution property on base-device
  • Added configurable timeout automatic test
  • Implemented device filtering by multiple types
  • Fixed client reconnection not working as expected
0.4.2.1
  • Fixed "None error" when calling limiter api
  • Updated aiohttp dependency to 3.7.4 due to security issues
0.4.2.0
  • Refactored MerossManager avoiding usage of multiple threads
  • Implemented multiple mqtt connections to different servers
  • Added custom API URL endpoint
  • Merged #150 (Added MSS620 support)
  • Added ErrorCode 1022
  • Renamed MerossManager domain and port parameters
  • Improved disconnection/reconnection event handling
  • OnlineEvent is now being re-issued after client disconnection/reconnection
  • Implemented disconnect/reconnect automatic test
0.4.1.0rc8
  • Implemented first roller_shutter support (merged #160), thanks to @adrigonzalvez
0.4.1.0rc7
  • Implemented exponential backoff for api-rate limiter
  • Fixed memory leakage that occurred for long-lived sessions of the MerossManager
  • Static known device types support added
  • Returning newly discovery devices from the discovery method()
  • Implemented first version of meross_api_cli
  • Improved device state recover after connection drop
  • Added API rate skip options
  • Tuned API rate limiting defaults
  • Fixed meross_sniffer utility not starting when ran from commandline
  • Addressed problems with online events not being propagated correctly in some edge cases
  • Fixed some known-cached types that were missing SystemOnline and SystemAll mixins
  • Removed warning logs from LightMixin when checking supported modes
0.4.0.6
  • Added device internal id parameter to async event handlers
0.4.0.5
  • Implemented MQTT rate-limiter
  • Updated documentation
  • Fixed error occurring with paho-mqtt > 1.5.0
0.4.0.3
  • Improved sniffing data masking
  • Added light.py update instruction
  • Added error logs in case of missing async_update() call first call
0.4.0.2
  • Re-Implemented Meross Sniffer utility
0.4.0.1
  • Fixed #117
  • Extended API error codes
  • Updated paho-mqtt dependency to v1.5.0
  • Fixed errors caused in tests when running on windows system / Python 3.8
0.4.0.0

Complete re-engineerization of the library.

  • Asynchronous approach using asyncio
  • Runtime ability discovery using runtime pluggable mixin architecture
  • Dramatically increased performance using low-level asynchronous aiohttp and almost no locking primitive
  • Added full-featured documentation
  • Added python type hints
  • Moved CI/CD to GitHub pages for letting PR test with on-premise Meross devices
0.3.4.0RC
  • Added HTTP API logout capability
  • Refactored MerossManager/HTTPClient classes
0.3.3.3
  • Added lock-assistant capability to help debug deadlock cases
  • Improved tests
0.3.3.0
  • Added auto-reconnection capabilities by default
  • Improved automated testing skipping
0.3.2.22
  • Fixed MerossManager not being thread-safe
0.3.2.21
  • Fixed status integer not being parsed as INT
0.3.2.20
  • Merged PR that adds supports for humidity sensor

0.3.2.17

  • Added Offline event emulation

0.3.2.15

  • Fixed deadlock occurring when handling Thermostat
  • Implementing callback/timeouts

0.3.2.14

  • Added option to force status-update on devices
  • get_sys_data now ignores online status in order to allow full status update (including online status)

0.3.2.12

  • Hotfix for introduced regression
  • Minor fix for power_plugs

0.3.2.9

  • Implemented battery stats fetch for HUB devices (valve)

0.3.2.7

  • Added support for smart humidifier

0.3.2.6

  • Added support for binding/unbinding events

0.3.2.5

  • Fixed set_target_temperature not working as intended

0.3.2.4

  • Improved thermostat support
  • New handling of Hub and subdevices
  • General refactor

0.3.1.12

  • Implemented meross_sniffer tool for collecting unknown devices logs

0.3.1.11

  • Implemented meross_info_gather script

0.3.1.10

  • Improved logging

0.3.1.9

  • Fixed missing method implementation
  • Improved logging
  • Minor improvements str methods

0.3.1.8

  • Added HUB + thermostat support

0.3.1.6

  • Improved light bulb driver (capacity)

0.3.1.5

  • Fixed wrong MerossEventType being advertised for DeviceDoorStatusEvent

0.3.1.3

  • Added event fire capability to GenericBulb class.
  • Fixed bulb state kwargs bug
  • Improved set_light_color function for bulbs

0.3.0.2

  • Fixed door closing checks when using the async + callback close() and open() methods.

0.3.0.1

  • Added get_power_consumption() and get_electricity() methods as abstract methods of AbstractMerossDevice
  • Fixed regression passing manager parameter when firing Meross events.

0.3.0.0rc4

  • Added added switch_state to the generated event

0.3.0.0rc3

  • Added quick fix for MSS560 color control

0.3.0.0rc2

  • Fixed Major bugs with MSG100
  • Updated README examples

0.3.0.0rc1

  • Added MSG100 support
  • Fixed errors being logged when power consumptionX command was issued on powerplugs

0.3.0.0b1

  • General refactor of the library
  • Added event-based support
  • Fixed default mqtt broker address for non-european devices

0.2.2.1

  • Added basic bulb support: turning on/off and light control
  • Implemented MSL120 support
  • Implemented MSL120 automatic test
  • Extended example script usage to show how to control the light bulbs
  • Added maximum retry limit for execute_command and connect()

0.2.1.1

  • Code refactoring to support heterogeneous devices (bulbs, plugs, garage openers)

0.2.1.0

  • Implemented auto-reconnect on lost connection
  • Improving locking system in order to prevent library hangs when no ack is received

Frequently asked questions

Is MerossIot free to use?

MerossIot is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does MerossIot do?

Async Python library for controlling Meross devices

What is MerossIot written in?

MerossIot is primarily written in Python. Its source is publicly available at https://github.com/albertogeniola/MerossIot, and it has 538 GitHub stars.