Skip to main content

A simple library to deal with Meross devices. At the moment MSS110, MSS210, MSS310, MSS310H smart plugs and the MSS425E power strip. Other meross device might work out of the box with limited functionality. Give it a try and, in case of problems, let the developer know by opening an issue on Github.

Project description

Azure DevOps builds (branch) Deployment Test status PyPI version Downloads PyPI - Downloads Beerpay

Meross IoT library

A pure-python based library providing API for controlling Meross IoT devices over the internet.

To see what devices are currently supported, checkout the Currently supported devices section. Hopefully, more Meross hardware will be supported in the future.

This library is still work in progress, therefore use it with caution.

Installation

Due to the popularity of the library, I've decided to list it publicly on the Pipy index. So, the installation is as simple as typing the following command:

pip install meross_iot --upgrade

Usage

The following script demonstrates how to use this library.

from meross_iot.manager import MerossManager
from meross_iot.meross_event import MerossEventType
from meross_iot.cloud.devices.light_bulbs import GenericBulb
from meross_iot.cloud.devices.power_plugs import GenericPlug
import time


def event_handler(eventobj):
    if eventobj.event_type == MerossEventType.DEVICE_ONLINE_STATUS:
        print("Device online status changed: %s went %s" % (eventobj.device.name, eventobj.status))
        pass
    elif eventobj.event_type == MerossEventType.DEVICE_SWITCH_STATUS:
        print("Switch state changed: Device %s (channel %d) went %s" % (eventobj.device.name, eventobj.channel_id,
                                                                        eventobj.switch_state))
    else:
        print("Unknown event!")


if __name__=='__main__':
    # Initiates the Meross Cloud Manager. This is in charge of handling the communication with the remote endpoint
    manager = MerossManager(meross_email="YOUR_MEROSS_CLOUD_EMAIL", meross_password="YOUR_MEROSS_CLOUD_PASSWORD")

    # Register event handlers for the manager...
    manager.register_event_handler(event_handler)

    # Starts the manager
    manager.start()

    # You can retrieve the device you are looking for in various ways:
    # By kind
    bulbs = manager.get_devices_by_kind(GenericBulb)
    plugs = manager.get_devices_by_kind(GenericPlug)
    all_devices = manager.get_supported_devices()

    # Print some basic specs about the discovered devices
    print("All the bulbs I found:")
    for b in bulbs:
        print(b)

    print("All the plugs I found:")
    for p in plugs:
        print(p)

    print("All the supported devices I found:")
    for d in all_devices:
        print(d)

    # You can also retrieve devices by the UUID/name
    # a_device = manager.get_device_by_name("My Plug")
    # a_device = manager.get_device_by_uuid("My Plug")

    # Or you can retrieve all the device by the HW type
    # all_mss310 = manager.get_devices_by_type("mss310")

    # ---------------------
    # Let's play with bulbs
    # ---------------------
    for b in bulbs:  # type: GenericBulb
        if not b.online:
            print("The bulb %s seems to be offline. Cannot play with that..." % b.name)
        print("Let's play with bulb %s" % b.name)
        if not b.supports_light_control():
            print("Too bad bulb %s does not support light control %s" % b.name)
        else:
            # Let's make it red!
            b.set_light_color(rgb=(255, 0, 0))

        b.turn_on()

    # ---------------------------
    # Let's play with smart plugs
    # ---------------------------
    for p in plugs:  # type: GenericPlug
        if not p.online:
            print("The plug %s seems to be offline. Cannot play with that..." % p.name)
        print("Let's play with smart plug %s" % p.name)

        channels = len(p.get_channels())
        print("The plug %s supports %d channels." % (p.name, channels))
        for i in range(0, channels):
            print("Turning on channel %d of %s" % (i, p.name))
            p.turn_on_channel(i)

            time.sleep(1)

            print("Turning off channel %d of %s" % (i, p.name))
            p.turn_off_channel(i)

        usb_channel = p.get_usb_channel_index()
        if usb_channel is not None:
            print("Awesome! This device also supports USB power.")
            p.enable_usb()
            time.sleep(1)
            p.disable_usb()

        if p.supports_electricity_reading():
            print("Awesome! This device also supports power consumption reading.")
            print("Current consumption is: %s" % str(p.get_electricity()))

    # At this point, we are all done playing with the library, so we gracefully disconnect and clean resources.
    print("We are done playing. Cleaning resources...")
    manager.stop()

    print("Bye bye!")

Currently supported devices

Starting from v0.2.0.0, this library should support the majority of Meross devices on the market. The list of tested devices is the following:

  • MSL120
  • MSS110
  • MSS210
  • MSS310
  • MSS310h
  • MSS425e
  • MSS530H
  • MSG100

I'd like to thank all the people who contributed to the early stage of library development, who stimulated me to continue the development and making this library support more devices:

Thanks to DanoneKiD, virtualdj, ictes, soberstadt, ping-localhost.

Protocol details

This library was implemented by reverse-engineering the network communications between the plug and the meross network. Anyone can do the same by simply installing a Man-In-The-Middle proxy and routing the ssl traffic of an Android emulator through the sniffer.

If you want to understand how the Meross protocol works, have a look at the Wiki. Be aware: this is still work in progress, so some pages of the wiki might still be blank/under construction.

Donate!

I like reverse engineering and protocol inspection, I think it keeps your mind trained and healthy. However, if you liked or appreciated by work, why don't you buy me a beer? It would really motivate me to continue working on this repository to improve documentation, code and extend the supported meross devices.

Moreover, donations will make me raise money to spend on other Meross devices. So far, I've bought the following devices:

  • MSL120
  • MSS210
  • MSS310
  • MSS425E
  • MSS530H
  • MSG100

By issuing a donation, you will:

  1. Give me the opportunity to buy new devices and support them in this library
  2. Pay part of electricity bill used to keep running the plugs 24/7 (Note that they are used for Unit-Testing on the continuous integration engine when someone pushes a PR... I love DEVOPing!)
  3. You'll increase the quality of my coding sessions with free-beer!

Buy me a beer

Beerpay Beerpay

Look at these babies!

Look at the test environment that ensures high quality code of the library!

Current test environemnt

When a pull-request is performed against this repository, a CI pipeline takes care of building the code, testing it on Python 3.5/3.6/3.7, 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 donators). Hoever, keeping such devices connected 24/7 has a cost, which I sustain happily due to the success of the library. Anyways, feel free to contribute via donations!

Changelog

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

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

meross_iot-0.3.0.0rc1.tar.gz (24.4 kB view details)

Uploaded Source

Built Distribution

meross_iot-0.3.0.0rc1-py3-none-any.whl (29.9 kB view details)

Uploaded Python 3

File details

Details for the file meross_iot-0.3.0.0rc1.tar.gz.

File metadata

  • Download URL: meross_iot-0.3.0.0rc1.tar.gz
  • Upload date:
  • Size: 24.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for meross_iot-0.3.0.0rc1.tar.gz
Algorithm Hash digest
SHA256 9b31ffb31b8ec73e29f4d1257bcb09e624614f242ed1f6b254e8a5110b93a06e
MD5 5329f948343326218dc9391957881317
BLAKE2b-256 9b15a70a55c15dcd7da9060165e36ff27ac9064e7107ff8171584fa306968b22

See more details on using hashes here.

File details

Details for the file meross_iot-0.3.0.0rc1-py3-none-any.whl.

File metadata

  • Download URL: meross_iot-0.3.0.0rc1-py3-none-any.whl
  • Upload date:
  • Size: 29.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for meross_iot-0.3.0.0rc1-py3-none-any.whl
Algorithm Hash digest
SHA256 edf92b7c0f25c60a1c49dbf20684ff4dad63cc869ca13a9ef92e60a52ee7a7ae
MD5 91d78703cd1aa5ec7e9c5d432dc52462
BLAKE2b-256 839734ebaf3207baf63dcff6bba962ffd26f73f56997878ca7a91d8d47b1c61c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page