Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to access zigbee peripherals (lumi.gateway.v3) #650

Open
miway80 opened this issue Mar 24, 2020 · 86 comments
Open

How to access zigbee peripherals (lumi.gateway.v3) #650

miway80 opened this issue Mar 24, 2020 · 86 comments
Labels

Comments

@miway80
Copy link

miway80 commented Mar 24, 2020

Hi guys,

I am starting with python, I already have token and the gateway ip but I don't know how to start my code, can somebody send me a example or explain me how can i access my gateway and see zigbee devices?

I found it, but i dont know how can i put token and ip and read zigbee goods, for example controller my Plug = 11

Thanks in advance

@rytilahti
Copy link
Owner

Unfortunately that part of the current gateway is not currently implemented, and it's waiting for someone to step in to do that.

If you are interested in digging in, there is some test code I used during the initial implementation in this commit: 57ff028

The command to access zigbee devices differs per device (get_prop_plug for the plug), which requires passing the device id in the payload. The current code does not allow doing this, so to make it work this needs to be adjusted (see #632).

If your goal is to access raw zigbee pieces, GatewayZigbee class contains some (unimplemented) methods for commands that could allow doing it. I have no clue what are the parameters and how they work (if they even work), just writing this down here in case you or someone else comes up looking and is interested in that.

Long story short, there is no way to do that currently without code changes. To get started accessing the gateway and list the devices connected to it:

from miio import Gateway

gw = Gateway("192.168.123.123", "tokentokentoken")
print(gw.devices())

@rytilahti rytilahti changed the title lumi.gateway.v3 How to access zigbee peripherals (lumi.gateway.v3) Mar 24, 2020
@miway80
Copy link
Author

miway80 commented Mar 25, 2020

Thank you very much for answer, i am checking these posts and try to connect to my gateway
at least, i add gateway.py manually and i put code in a file mi.py

from miio import Gateway

gw = Gateway("192.168.123.123", "tokentokentoken")
print(gw.devices())

With this result

pi@rpi:~ $ python3 mi.py
ValueError: 65 is not a valid DeviceType

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "mi.py", line 5, in
print(gw.devices())
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 108, in devices
for x in range(0, len(devices_raw), 5)
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 108, in
for x in range(0, len(devices_raw), 5)
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 485, in init
self.type = DeviceType(type_)
File "/usr/lib/python3.7/enum.py", line 310, in call
return cls.new(cls, value)
File "/usr/lib/python3.7/enum.py", line 564, in new
raise exc
File "/usr/lib/python3.7/enum.py", line 548, in new
result = cls.missing(value)
File "/usr/lib/python3.7/enum.py", line 577, in missing
raise ValueError("%r is not a valid %s" % (value, cls.name))
ValueError: 65 is not a valid DeviceType

@rytilahti
Copy link
Owner

See https://github.com/rytilahti/python-miio/blob/master/miio/gateway.py#L27 - that lists the known subdevices. I'll create soon a PR to make it not crash but report an error during initialization, but until that you can simply modify that enum to contain that value.

@starkillerOG
Copy link
Contributor

@rytilahti I think this ons can also be closed since the issues discussed here are all fixed I think

@rytilahti
Copy link
Owner

The device type of 65 is still unknown/not implemented, so I think this can remain open?

@miway80 could you please test your script with the current master, if it is otherwise working for you? Do you happen to know which device is the one that is causing the error?

@miway80
Copy link
Author

miway80 commented May 31, 2020

Sorry for later answer, with the current master i get it

from miio import Gateway

gw = Gateway("192.168.123.123", "tokentokentoken")
print(gw.devices())

pi@rpi:~ $ python3 mi.py
Traceback (most recent call last):
File "mi.py", line 4, in
print(gw.devices())
TypeError: 'list' object is not callable

@starkillerOG
Copy link
Contributor

@miway80 you schould use gw.discover_devices() to get the devices.

If you run that command and want to access the devices again you can use the gw.devices property (note that a property is not callable, there do not use brackets behind a property, that is the warning you are seeing).

@miway80
Copy link
Author

miway80 commented Jun 1, 2020

Good, thanks, with gw.discover_devices() i get many subdevices, but how can i read and modify states each subdevices? I want use it for plug and switch

Unknown subdevice type SubDeviceInfo(sid='lumi.158d0002013f4d', type_id=65, unkn own=1, unknown2=31, fw_ver=1) discovered, of Xiaomi gateway with ip: 192.168.31. 47
<Subdevice Unknown: lumi.158d0002013f4d fw: 1 bat: 60 props: {}>

With gw.devices i only get only []

@starkillerOG
Copy link
Contributor

You need to run gw.discover_devices() and then gw.devices for the devices to show up in gw.devices.
(gw.devices stores the devices that are discovered using gw.discover_devices() so you don't need to discover them again and again if you need to acces them a second time.)

The error about the Unknown subdevice is a devicetype "65" that is not yet implemented in the code because we don't know what kind of device it is.
Could you look in the MiHome app under gateway-->...-->about--> hub_info, there schould be a list of all your subdevices showing the sid, model_info and name.
Please find the device with sid='lumi.158d0002013f4d' and tell us what model_info is showing, and please explain what kind of device that is if you recognize the name.

@starkillerOG
Copy link
Contributor

If a subdevice is implemented you can get info of the subdevice by executing the following code:

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices:
    dev.update()
    print(dev)

The update() command will get the info from the device and then the properties can be vieuwd under the props: {} dict in print(dev).
(to get the properties as a dict use property dev.status)

for control of specific subdevices see the implementation of that subdevice in the https://github.com/rytilahti/python-miio/blob/master/miio/gateway.py file.

from the looks of it the plug does not have control capabilty implemented yet, but I imagine that it will use very simular commands as the already implemented AqaraRelayTwoChannels, you are very welcome to implement control capability of the plug!
since I do not own a plug I cannot implement it myself, but I am willing to give you directions to help you implement it.

@miway80
Copy link
Author

miway80 commented Jun 2, 2020

Thanks again, i just get info from hub_info, model: lumi.ctrl_86plug.aq1 is a wall plug as this photo
https://http2.mlstatic.com/aqara-wall-outlet-zigbee-xiaomi-mi-aqara-marca-smart-wall-D_NQ_NP_750688-MLM32148824770_092019-F.jpg

I only want controller before wall plug and aqara wall one switch ( lumi.ctrl_neutral1.v1 )
https://gloimg.gbtcdn.com/soa/gb/pdm-product-pic/Electronic/2017/09/16/goods_img_big-v1/20170916200232_74480.jpg

@miway80
Copy link
Author

miway80 commented Jun 2, 2020

With this code

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices:
dev.update()
print(dev)

I get

Unknown subdevice type SubDeviceInfo(sid='lumi.158d00015767a7', type_id=14, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 192.168.31.240
Unknown subdevice type SubDeviceInfo(sid='lumi.158d0002013f4d', type_id=65, unknown=1, unknown2=31, fw_ver=1) discovered, of Xiaomi gateway with ip: 192.168.31.240
<Subdevice Switch: lumi.158d0001f3b1b1 fw: 10 bat: 60 props: {}>
<Subdevice Unknown: lumi.158d00015767a7 fw: 4 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d00012e1f0c fw: 1 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d0001614697 fw: 1 bat: 60 props: {}>
<Subdevice SensorHT: lumi.158d0001f47015 fw: 2 bat: 60 props: {'temperature': 100.0, 'humidity': 0.0, 'pressure': 0.0}>
<Subdevice Unknown: lumi.158d0002013f4d fw: 1 bat: 60 props: {}>

sid='lumi.158d00015767a7', type_id=14 == lumi.sensor_86sw1.v1 = aqara one switch wifi version
sid='lumi.158d0002013f4d', type_id=65 == lumi.ctrl_86plug.aq1 = aqara wall plug

seems that SwitchOneChannel = lumi.ctrl_neutral1.v1

@starkillerOG
Copy link
Contributor

@miway80 I just added the two device types in this PR: https://github.com/starkillerOG/python-miio/blob/patch-5/miio/gateway.py

The RemoteSwitchSingleV1 (lumi.sensor_86sw1.v1) will probably not have properties that you can get and will require this PR to be merged and fully implemented #709, that will still take some time.

If you want to use the AqaraWallOutlet (lumi.ctrl_86plug.aq1), you will have to figure out what properties the device has, follow these steps in editing the gateway.py file:

  1. add the devictypes to the class DeviceType(IntEnum) as is done in the mentioned PR
  2. add the device to the device_type_mapping dict so the new dict becomes:
device_type_mapping = {
            DeviceType.AqaraRelayTwoChannels: AqaraRelayTwoChannels,
            DeviceType.Plug: AqaraPlug,
            DeviceType.SensorHT: SensorHT,
            DeviceType.AqaraHT: AqaraHT,
            DeviceType.AqaraMagnet: AqaraMagnet,
            DeviceType.AqaraSwitchOneChannel: AqaraSwitchOneChannel,
            DeviceType.AqaraSwitchTwoChannels: AqaraSwitchTwoChannels,
            DeviceType.AqaraWallOutlet: AqaraWallOutlet,
        }
  1. add the following class at the bottom of the gateway.py file:
class AqaraWallOutlet(SubDevice):
    """Subdevice AqaraWallOutlet specific properties and methods"""

    properties = ["neutral_0", "load_power"]

    @attr.s(auto_attribs=True)
    class props:
        """Device specific properties"""

        status: str = None  # 'on' / 'off'
        load_power: int = None  # power consumption in ?unit?

    @command()
    def update(self):
        """Update all device properties"""
        values = self.get_property_exp(self.properties)
        self._props.status = values[0]
        self._props.load_power = values[1]
  1. try it out, if it does not work you can also try "channel_0" as property
  2. if that does not work or if you want to look if more properties are suported you will need to sniff the traffic of the MiHome app and figure out what the properties are, I succesfully sniffed traffic using BlueStack :

I was able to sniff trafic using BlueStack (an android emulator for windows), install MiHome App and then capture packets using wireshark --> export as json and use the miio tool https://github.com/aholstenson/miio to decode the packets.

if you also want to controll the wall outlet you will need to implement something like is done with the AqaraRelayTwoChannels class, but lets first try to see if getting the status will work.

@miway80 How experianced are you with programming?

@miway80
Copy link
Author

miway80 commented Jun 2, 2020

How experianced are you with programming? I am learning now in quarentine to program with tutorials..

Thank you very much, i just modified gateway.py and work for WallOulet, as do you said i changed neutral_0 by channel_0.

<Subdevice Switch: lumi.158d0001f3b1b1 fw: 10 bat: 60 props: {}>
<Subdevice RemoteSwitchSingleV1: lumi.158d00015767a7 fw: 4 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d00012e1f0c fw: 1 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d0001614697 fw: 1 bat: 60 props: {}>
<Subdevice SensorHT: lumi.158d0001f47015 fw: 2 bat: 60 props: {'temperature': 100.0, 'humidity': 0.0, 'pressure': 0.0}>
<Subdevice AqaraWallOutlet: lumi.158d0002013f4d fw: 1 bat: 60 props: {'status': 'on', 'load_power': 587.86}>

Now the question is how can i change Status via python code? can i send any command for put Status on/off ?

Also i will try sniff trafic using BlueStack, i have some xiaomi goods, if i get sniff goods then i can add to gateway.py and share here

@starkillerOG
Copy link
Contributor

Excelent, so the properties that worked are properties = ["channel_0", "load_power"] right?
Could you look in the Mi Home app what unit the load_power is (is it 587.86 Watt)?

Are there any other properties besides status and load_power that are visable in the MiHome app?

to control the plug add this to the AqaraWallOutlet class:

    def toggle(self):
        """Toggle Aqara Wall Outlet"""
        return self.send_arg("toggle_ctrl_neutral", ["toggle"]).pop()

then you can test it by running:

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices:
    dev.update()
    print(dev)

walloutlet = devices[5]

print(walloutlet.toggle())

if it does not work:

  1. see if devices[5] is indeed the walloutlet device otherwise change the index
  2. modify the parameters of the command try instead of ["toggle"]
  • ["channel_0", "toggle"]
  • ["channel_0", "on"]
  • ["channel_0", "off"]
  • ["on"]
  • ["off"]
  1. if that does not work you will have to sniff the trafic using bluestack and figure out what the command and paramters are that you need.

@miway80
Copy link
Author

miway80 commented Jun 3, 2020

Excelent, so the properties that worked are properties = ["channel_0", "load_power"] right? yes, it is ok
Could you look in the Mi Home app what unit the load_power is (is it 587.86 Watt)? yes, same power, 587.86

Are there any other properties besides status and load_power that are visable in the MiHome app? No, in Mihome app only put, Today, Month, Current, Turn on / Turn off, Schedule, Countdown

If only add it to gateway.py without modify mi.py i get a error, also if modify mi.py i get same error

python3 mi.py
Traceback (most recent call last):
File "mi.py", line 1, in
from miio import Gateway
File "/home/pi/.local/lib/python3.7/site-packages/miio/init.py", line 23, in
from miio.gateway import Gateway
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 943
def toggle(self):
^
TabError: inconsistent use of tabs and spaces in indentation

@starkillerOG
Copy link
Contributor

The error says it all: the indentation is wrong, apperently line 943 of the gateway.py file has a tab as indentation while the rest of the file uses spaces (or the other way around).
just make sure you are consistant throughout the file.
and probably also check your indentation, if everything uses the correct amount of tabs/spaces

@miway80
Copy link
Author

miway80 commented Jun 3, 2020

Sorry, i used tab and needed 2 spaces.. Now no identation error

I check again and i change ["toggle"] for this another ["channel_0", "toggle"], ["channel_0", "on"],
["channel_0", "off"],["on"],["off"] wit same result, seems that i need modify line 661 and 666

python3 mi.py
<Subdevice Switch: lumi.158d0001f3b1b1 fw: 10 bat: 60 props: {}>
<Subdevice RemoteSwitchSingleV1: lumi.158d00015767a7 fw: 4 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d00012e1f0c fw: 1 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d0001614697 fw: 1 bat: 60 props: {}>
<Subdevice SensorHT: lumi.158d0001f47015 fw: 2 bat: 60 props: {'temperature': 100.0, 'humidity': 0.0, 'pressure': 0.0}>
<Subdevice AqaraWallOutlet: lumi.158d0002013f4d fw: 1 bat: 60 props: {'status': 'on', 'load_power': 0.0}>
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 661, in send_arg
return self._gw.send(command, arguments, extra_parameters={"sid": self.sid})
TypeError: send() got an unexpected keyword argument 'extra_parameters'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "mi.py", line 15, in
print(walloutlet.toggle())
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 945, in toggle
return self.send_arg("toggle_ctrl_neutral", ["toggle"]).pop()
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 666, in send_arg
) from ex
miio.gateway.GatewayException: Got an exception while sending command 'toggle_ctrl_neutral' with arguments '['toggle']'

I just install BlueStack, but put can be not compatible with my hardware, i need a better laptop..

@starkillerOG
Copy link
Contributor

The error above means that you still have old files of the latest release version, the master branch has more up to date files that include the "extra_parameters" capability mentioned in the error.

  1. Make a backup of the gateway.py file that you have been modifing

  2. Please go to the master branch of this code: https://github.com/rytilahti/python-miio and hit the green "clone or download" button. download all the files and replace all the files in your python installation of miio with the files in the miio folder that you just downloaded (except for the gateway.py file or put back your backup of the gateway.py file after you updated all files)

Then the error above schould go away.

@starkillerOG
Copy link
Contributor

starkillerOG commented Jun 4, 2020

@miway80 if you finish testing the control command code fast, it might be in time for version 0.5.1 that is about to be released.
I already made a PR to include the status reporting as you have tested: #717

@rytilahti
Copy link
Owner

0.5.1 is already out, but I'm thinking about streamlining the release process to make it easier to make releases (and to shorter the cycle to wait for fixes to go out) in the future.

@miway80
Copy link
Author

miway80 commented Jun 4, 2020

Sorry for later answer, but i was working.. I did it, but i got this error

python3 mi.py
Traceback (most recent call last):
File "mi.py", line 1, in
from miio import Gateway
File "/home/pi/.local/lib/python3.7/site-packages/miio/init.py", line 2, in
from importlib_metadata import version # type: ignore
ModuleNotFoundError: No module named 'importlib_metadata'

Then i put # in line 2
#from importlib_metadata import version # type: ignore

and got this error

python3 mi.py
Traceback (most recent call last):
File "mi.py", line 1, in
from miio import Gateway
File "/home/pi/.local/lib/python3.7/site-packages/miio/init.py", line 35, in
from miio.vacuum import Vacuum, VacuumException
File "/home/pi/.local/lib/python3.7/site-packages/miio/vacuum.py", line 18, in
from .vacuumcontainers import (
File "/home/pi/.local/lib/python3.7/site-packages/miio/vacuumcontainers.py", line 6, in
from croniter import croniter
ModuleNotFoundError: No module named 'croniter'

I also update and upgrade all via sudo apt-get, strange error because i dont have vacuum

@miway80
Copy link
Author

miway80 commented Jun 5, 2020

Hi again, i tried to fix it, yesterday installed neccesary modules croniter-0.3.32.tar.gz, zipp-3.1.0.tar.gz and importlib_metadata-1.6.0.tar.gz, now only vacuum and discovery error

pi@rpi:~ $ python3 mi.py
Traceback (most recent call last):
File "mi.py", line 1, in
from miio import Gateway
File "/home/pi/.local/lib/python3.7/site-packages/miio/init.py", line 49, in
from miio.discovery import Discovery
File "/home/pi/.local/lib/python3.7/site-packages/miio/discovery.py", line 10, in
from . import (
ImportError: cannot import name 'Vacuum' from 'miio' (/home/pi/.local/lib/python3.7/site-packages/miio/init.py)

I check miio files and have discovery.py

@starkillerOG
Copy link
Contributor

@miway80 I do not know much about these import errors, however version 0.5.1 of python-miio has been released yesterday.
So you schould now be able to simply run pip3 install --upgrade python-miio to get all the files and required modules up to date.

After you run that command you just need to reapply the changes that you made in the gateway.py file (just restore the backup of that file).

@miway80
Copy link
Author

miway80 commented Jun 5, 2020

@starkillerOG I just upgrade miio to 0.5.1. and restaure gateway.py but now i got other error

python3 mi.py
<Subdevice Switch: lumi.158d0001f3b1b1 fw: 10 bat: 60 props: {}>
<Subdevice RemoteSwitchSingleV1: lumi.158d00015767a7 fw: 4 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d00012e1f0c fw: 1 bat: 60 props: {}>
<Subdevice SwitchOneChannel: lumi.158d0001614697 fw: 1 bat: 60 props: {}>
<Subdevice SensorHT: lumi.158d0001f47015 fw: 2 bat: 60 props: {'temperature': 10 0.0, 'humidity': 0.0, 'pressure': 0.0}>
<Subdevice AqaraWallOutlet: lumi.158d0002013f4d fw: 1 bat: 60 props: {'status': 'on', 'load_power': 0.0}>
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 661, in send_arg
return self._gw.send(command, arguments, extra_parameters={"sid": self.sid})
File "/home/pi/.local/lib/python3.7/site-packages/miio/device.py", line 147, i n send
command, parameters, retry_count, extra_parameters=extra_parameters
File "/home/pi/.local/lib/python3.7/site-packages/miio/miioprotocol.py", line 203, in send
self._handle_error(payload["error"])
File "/home/pi/.local/lib/python3.7/site-packages/miio/miioprotocol.py", line 263, in _handle_error
raise DeviceError(error)
miio.exceptions.DeviceError: {'code': -5005, 'message': 'params error'}

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "mi.py", line 15, in
print(walloutlet.toggle())
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 945, in toggle
return self.send_arg("toggle_ctrl_neutral", ["toggle"]).pop()
File "/home/pi/.local/lib/python3.7/site-packages/miio/gateway.py", line 666, in send_arg
) from ex
miio.gateway.GatewayException: Got an exception while sending command 'toggle_ct rl_neutral' with arguments '['toggle']'

@miway80
Copy link
Author

miway80 commented Jun 11, 2020

You can pass those parameters to the Gateway constructor, like:

gw = Gateway("127.0.0.1", "tokentoken", lazy_discovery=True, start_id=1000)

I got error, then check in gateway.py and is lazy_discover=True

from miio import Gateway
gw = Gateway("192.168.31.240", "tokentoken",lazy_discover=True, start_id=1000)

print(gw.info())

gw.discover_devices()
devices = gw.devices

for dev in devices:
dev.update()
print(dev)

I got

-> 192.168.31.197 data= {"id": 1001, "method": "miIO.info", "params": []}
<- 192.168.31.240 data= {"result":{"life":4494802,"cfg_time":0,"token":"tokentoken","mac":"78:11:DC:B2:XX:XX","fw_ver":"1.4.1_175","hw_ver":"MW300","model":"lumi.gateway.v3","mcu_fw_ver":"0220","wifi_fw_ver":"SD878x-14.76.36.p84-702.1.0-WM","ap":{"rssi":-50,"ssid":"miway","bssid":"50:64:2B:92:XX:XX"},"netif":{"localIp":"192.168.31.240","mask":"255.255.255.0","gw":"192.168.31.1","gw_mac":"50:64:2B:92:XX:XX"},"mmfree":168312,"ot":"otu","otu_stat":[290,212,84097,3134,75338,473],"ott_stat":[718, 27, 213, 335]},"id":1001}
-> 192.168.31.197 data= {"id": 1002, "method": "get_device_prop", "params": ["lumi.0", "device_list"]}
<- 192.168.31.240 data= {"result":["lumi.158d0001f3b1b1",1,1,0,10,"lumi.158d00015767a7",14,1,0,4,"lumi.158d00012e1f0c",9,1,21,1,"lumi.158d0001614697",9,1,21,1,"lumi.158d0001f47015",10,0,0,2,"lumi.158d000201407c",65,1,31,1],"id":1002}
-> 192.168.31.197 data= {"id": 1003, "method": "get_battery", "params": ["lumi.158d0001f3b1b1"]}
<- 192.168.31.240 data= {"result":[60],"id":1003}
-> 192.168.31.197 data= {"id": 1004, "method": "get_battery", "params": ["lumi.158d00015767a7"]}
<- 192.168.31.240 data= {"result":[60],"id":1004}
-> 192.168.31.197 data= {"id": 1005, "method": "get_device_prop_exp", "params": [["lumi.158d00012e1f0c", "neutral_0"]]}
<- 192.168.31.240 data= {"result":[["off"]],"id":1005}
-> 192.168.31.197 data= {"id": 1006, "method": "get_battery", "params": ["lumi.158d00012e1f0c"]}
<- 192.168.31.240 data= {"result":[60],"id":1006}
-> 192.168.31.197 data= {"id": 1007, "method": "get_device_prop_exp", "params": [["lumi.158d0001614697", "neutral_0"]]}
<- 192.168.31.240 data= {"result":[["off"]],"id":1007}
-> 192.168.31.197 data= {"id": 1008, "method": "get_battery", "params": ["lumi.158d0001614697"]}
<- 192.168.31.240 data= {"result":[60],"id":1008}
-> 192.168.31.197 data= {"id": 1009, "method": "get_device_prop_exp", "params": [["lumi.158d0001f47015", "temperature", "humidity", "pressure"]]}
<- 192.168.31.240 data= {"result":[[10000,0,0]],"id":1009}
-> 192.168.31.197 data= {"id": 1010, "method": "get_battery", "params": ["lumi.158d0001f47015"]}
<- 192.168.31.240 data= {"result":[60],"id":1010}
-> 192.168.31.197 data= {"id": 1011, "method": "get_device_prop_exp", "params": [["lumi.158d000201407c", "channel_0", "load_power"]]}
<- 192.168.31.240 data= {"result":[["on",0.00]],"id":1011}
-> 192.168.31.197 data= {"id": 1012, "method": "get_battery", "params": ["lumi.158d000201407c"]}
<- 192.168.31.240 data= {"result":[60],"id":1012}

@starkillerOG
Copy link
Contributor

@miway80 default is lazy_discover=True (sorry for my spelling mistake)
So as I sayed I would try lazy_discover=False, furthermore I was hoping that that could make the gateway that is not working work (so the one with ip=192.168.31.224)

The gateway with ip 192.168.31.240 seems to be working as expected so I dont think there is need for aditional packet captures from that gateway. Mostly the gateway with ip 192.168.31.224 is intresting because we are trying to get that one to work right?

So could you try with lazy_discover=False and start_id=1000 on the gateway 192.168.31.224 that is giving you problems?

@starkillerOG
Copy link
Contributor

@miway80 I checked the device info from both gateways and they seem to be identical and running the same firmware, so they schould both work....

wifi signal strenght looks OK on both gateways (RSSI of -42 and -50)
basically the only diffrence I see is the otu_stat and "ott_stat" but I do not know what those mean

@miway80
Copy link
Author

miway80 commented Jun 11, 2020

@miway80 default is lazy_discover=True (sorry for my spelling mistake)
So as I sayed I would try lazy_discover=False, furthermore I was hoping that that could make the gateway that is not working work (so the one with ip=192.168.31.224)

The gateway with ip 192.168.31.240 seems to be working as expected so I dont think there is need for aditional packet captures from that gateway. Mostly the gateway with ip 192.168.31.224 is intresting because we are trying to get that one to work right?

So could you try with lazy_discover=False and start_id=1000 on the gateway 192.168.31.224 that is giving you problems?

I just try it and get same error,

Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/miio/miioprotocol.py", line 182, in send
data, addr = s.recvfrom(1024)
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "mii.py", line 11, in
gw.discover_devices()
File "/usr/local/lib/python3.6/dist-packages/miio/gateway.py", line 167, in discover_devices
devices_raw = self.get_prop("device_list")
File "/usr/local/lib/python3.6/dist-packages/miio/gateway.py", line 206, in get_prop
return self.send("get_device_prop", ["lumi.0", property])
File "/usr/local/lib/python3.6/dist-packages/miio/device.py", line 147, in send
command, parameters, retry_count, extra_parameters=extra_parameters
File "/usr/local/lib/python3.6/dist-packages/miio/miioprotocol.py", line 226, in send
extra_parameters=extra_parameters,
File "/usr/local/lib/python3.6/dist-packages/miio/miioprotocol.py", line 150, in send
self.send_handshake()
File "/usr/local/lib/python3.6/dist-packages/miio/miioprotocol.py", line 62, in send_handshake
header = m.header.value
AttributeError: 'NoneType' object has no attribute 'header'

@miway80 I checked the device info from both gateways and they seem to be identical and running the same firmware, so they schould both work....

wifi signal strenght looks OK on both gateways (RSSI of -42 and -50)
basically the only diffrence I see is the otu_stat and "ott_stat" but I do not know what those mean

This gateway is very near to router, have good signal, i think that many devices linked is the problem

@starkillerOG
Copy link
Contributor

I am kind of out of ideas if you can't get response of that gateway to show up in wireshark I would not know how to get it working....

You could try to remove the devices from the crouded gateway and move them to the now working gateway. Then you can test if the now working gateway stops working if you add too many devices and what the device limit is.
The now broken gateway schould at some point than start to work with less devices.....

But I understand that that might mess up you current setup if you start moving devices from one gateway to the other..... So it is up to you if your are willing to try that....

@miway80
Copy link
Author

miway80 commented Jun 12, 2020

I am kind of out of ideas if you can't get response of that gateway to show up in wireshark I would not know how to get it working....

You could try to remove the devices from the crouded gateway and move them to the now working gateway. Then you can test if the now working gateway stops working if you add too many devices and what the device limit is.
The now broken gateway schould at some point than start to work with less devices.....

But I understand that that might mess up you current setup if you start moving devices from one gateway to the other..... So it is up to you if your are willing to try that....

Yes, i will do it, but now very busy, about 10 days i will be more quiet, then try remove device one per one and put in other gateway checking code

@rytilahti
Copy link
Owner

It could very well be that we are hitting the datagram size limitations (similar what happens with some devices when trying to request too many properties at once, hard to know without checking tho..), while it works just fine when the request is done through the cloud.

@wuid24
Copy link

wuid24 commented Jun 23, 2020

Hi all,
I would like to fit into this thread,
i'm looking for option to control my Xiaomi zigbee smart plug (toggle off/on).
So going through this thread - i've configured my environment as follows:
python-miio
npm-miio
wireshark
Bluestack with installed mihome linked to my user.
next ill try to capture and analyse the toggling packets.
Surely i'll have to ask your assistance, will update on progress.

@miway80
Copy link
Author

miway80 commented Jun 23, 2020

Hi all,
I would like to fit into this thread,
i'm looking for option to control my Xiaomi zigbee smart plug (toggle off/on).
So going through this thread - i've configured my environment as follows:
python-miio
npm-miio
wireshark
Bluestack with installed mihome linked to my user.
next ill try to capture and analyse the toggling packets.
Surely i'll have to ask your assistance, will update on progress.

Can be is very similar to walloutlet

Create a file x.py for get info

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices:
dev.update()
print(dev)

And add to gateway.py


Smart_plug = X ( X = number get in discover_devices)


DeviceType.Smart_plug: Smart_plug,


class Smart_plug(SubDevice):
"""Subdevice Smart_plug specific properties and methods"""

properties = ["channel_0", "load_power"]

@attr.s(auto_attribs=True)
class props:
    """Device specific properties"""

    status: str = None  # 'on' / 'off'
    load_power: int = None  # power consumption in ?unit?

@command()
def update(self):
    """Update all device properties"""
    values = self.get_property_exp(self.properties)
    self._props.status = values[0]
    self._props.load_power = values[1]

@command()
def toggle(self):
    """Toggle Smart_plug"""
    return self.send_arg("toggle_plug", ["channel_0", "toggle"]).pop()

@command()
def on(self):
    """Turn on Smart_plug"""
    return self.send_arg("toggle_plug", ["channel_0", "on"]).pop()

@command()
def off(self):
    """Turn off Smart_plug"""
    return self.send_arg("toggle_plug", ["channel_0", "off"]).pop()

@starkillerOG
Copy link
Contributor

@miway80 is right.
I would like to add that you schould first update your gateway.py file inside the python-miio folder to the latest version in https://github.com/rytilahti/python-miio/blob/master/miio/gateway.py
There is a good change your plug will then already be recognized if you run the test script as pointed out by @miway80:

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices:
    dev.update()
    print(dev)

@wuid24 please post the results of that test script so we can point you in the right direction.

@wuid24
Copy link

wuid24 commented Jun 24, 2020

Hi all,
I would like to fit into this thread,
i'm looking for option to control my Xiaomi zigbee smart plug (toggle off/on).
So going through this thread - i've configured my environment as follows:
python-miio
npm-miio
wireshark
Bluestack with installed mihome linked to my user.
next ill try to capture and analyse the toggling packets.
Surely i'll have to ask your assistance, will update on progress.

Can be is very similar to walloutlet

Create a file x.py for get info

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices:
dev.update()
print(dev)

And add to gateway.py

Smart_plug = X ( X = number get in discover_devices)

DeviceType.Smart_plug: Smart_plug,

class Smart_plug(SubDevice):
"""Subdevice Smart_plug specific properties and methods"""

properties = ["channel_0", "load_power"]

@attr.s(auto_attribs=True)
class props:
    """Device specific properties"""

    status: str = None  # 'on' / 'off'
    load_power: int = None  # power consumption in ?unit?

@command()
def update(self):
    """Update all device properties"""
    values = self.get_property_exp(self.properties)
    self._props.status = values[0]
    self._props.load_power = values[1]

@command()
def toggle(self):
    """Toggle Smart_plug"""
    return self.send_arg("toggle_plug", ["channel_0", "toggle"]).pop()

@command()
def on(self):
    """Turn on Smart_plug"""
    return self.send_arg("toggle_plug", ["channel_0", "on"]).pop()

@command()
def off(self):
    """Turn off Smart_plug"""
    return self.send_arg("toggle_plug", ["channel_0", "off"]).pop()

Hi,

trying to get the Plug type_id as @miway80 wrote,
but I can't find it from the print:
Unknown subdevice type SubDeviceInfo(sid='lumi.158d00035ab657', type_id=55, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 10.100.102.7 Unknown subdevice type SubDeviceInfo(sid='lumi.158d00035ab56a', type_id=55, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 10.100.102.7 <Subdevice SensorHT: lumi.158d00020291ea fw: 2 bat: 60 props: {'temperature': 25.7, 'humidity': 66.67, 'pressure': 0.0}> <Subdevice Plug: lumi.158d0002855e4c fw: 1 bat: 60 props: {'status': 'off', 'power': '', 'load_power': 0.0}> <Subdevice Unknown: lumi.158d00035ab657 fw: 4 bat: 60 props: {}> <Subdevice Plug: lumi.158d00025856ca fw: 1 bat: 60 props: {'status': 'off', 'power': '', 'load_power': 0.0}> <Subdevice SensorHT: lumi.158d00034f7a0b fw: 2 bat: 60 props: {'temperature': 32.12, 'humidity': 51.12, 'pressure': 0.0}> <Subdevice Plug: lumi.158d0002677318 fw: 1 bat: 60 props: {'status': 'on', 'power': '', 'load_power': 102.42}> <Subdevice Unknown: lumi.158d00035ab56a fw: 4 bat: 60 props: {}> <Subdevice SensorHT: lumi.158d0003502737 fw: 2 bat: 60 props: {'temperature': 27.38, 'humidity': 83.63, 'pressure': 0.0}>

I've also tried to work on debug mode (using pycharm) and got the following error:
dev.update() AttributeError: 'str' object has no attribute 'update'

@starkillerOG
Copy link
Contributor

starkillerOG commented Jun 24, 2020

@wuid24 alright, so there are two "unknown" devices, both with type_id=55, however in the latest python-miio gateway.py file this device type is already included as AqaraWaterLeak = 55 _zigbee_model = "lumi.sensor_wleak.aq1" _model = "SJCGQ11LM"
Is it correct that you have two of such a water leak sensors?

Besides those two water leak sensors 3 temperature sensors and 3 plugs are correctly detected.
Please format the results of the test script with enters like this (for the next time):

Unknown subdevice type SubDeviceInfo(sid='lumi.158d00035ab657', type_id=55, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 10.100.102.7
Unknown subdevice type SubDeviceInfo(sid='lumi.158d00035ab56a', type_id=55, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 10.100.102.7

<Subdevice SensorHT: lumi.158d00020291ea fw: 2 bat: 60 props: {'temperature': 25.7, 'humidity': 66.67, 'pressure': 0.0}>
<Subdevice SensorHT: lumi.158d0003502737 fw: 2 bat: 60 props: {'temperature': 27.38, 'humidity': 83.63, 'pressure': 0.0}>
<Subdevice SensorHT: lumi.158d00034f7a0b fw: 2 bat: 60 props: {'temperature': 32.12, 'humidity': 51.12, 'pressure': 0.0}>
<Subdevice Plug: lumi.158d0002855e4c fw: 1 bat: 60 props: {'status': 'off', 'power': '', 'load_power': 0.0}>
<Subdevice Plug: lumi.158d0002677318 fw: 1 bat: 60 props: {'status': 'on', 'power': '', 'load_power': 102.42}>
<Subdevice Plug: lumi.158d00025856ca fw: 1 bat: 60 props: {'status': 'off', 'power': '', 'load_power': 0.0}>
<Subdevice Unknown: lumi.158d00035ab657 fw: 4 bat: 60 props: {}>
<Subdevice Unknown: lumi.158d00035ab56a fw: 4 bat: 60 props: {}>

I can see you did not update the gateway.py file from https://github.com/rytilahti/python-miio/blob/master/miio/gateway.py yet when you obtained this print. Please do update (the official version has not been released, so updating usig pip will not give you the latest version).

Regarding the error message, you will get that error once you have the latest version of gateway.py because the gateway.devices have changed from a list to a dict. To resolve it, change the test script to (add the .values()):

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices.values():
    dev.update()
    print(dev)

Regarding the plugs you want to integrate, as you can see you can already read out the status and load_power.
Apprently the power is not a correct property since it is empty.
Is there any more information available in the Mi Home App besides the status and the load_power?
other properties that you could try besides "channel_0" and "load_power"are:

"power_consumed"
"energy_consumed"
"inuse"

To add functionallity the Plug class on line 982 of the gateway.py file needs to be modified:

class Plug(SubDevice):

Try adding this to that class:

    @command()
    def toggle(self):
        """Toggle Plug."""
        return self.send_arg("toggle_ctrl_neutral", ["channel_0", "toggle"]).pop()

    @command()
    def on(self):
        """Turn on Plug."""
        return self.send_arg("toggle_ctrl_neutral", ["channel_0", "on"]).pop()

    @command()
    def off(self):
        """Turn off Plug."""
        return self.send_arg("toggle_ctrl_neutral", ["channel_0", "off"]).pop()

@starkillerOG
Copy link
Contributor

@wuid24 I also noticed that the SensorHT reports a pressure of 0.0
Does your temperature sensor report pressure in the MiHome app, or only temperature and humidity?

@rytilahti
Copy link
Owner

@starkillerOG my understanding is that the older aqara sensors (the round ones) do not have the pressure measurement, only the newer rectangular ones do.

@starkillerOG
Copy link
Contributor

@wuid24 I already updated the sensorHT and plug class for the properties in this PR: #735

Could you let me know the unit for the load_power as displayed in the MiHome app for the plug?

@wuid24
Copy link

wuid24 commented Jun 25, 2020

@wuid24 alright, so there are two "unknown" devices, both with type_id=55, however in the latest python-miio gateway.py file this device type is already included as AqaraWaterLeak = 55 _zigbee_model = "lumi.sensor_wleak.aq1" _model = "SJCGQ11LM"
Is it correct that you have two of such a water leak sensors?

Besides those two water leak sensors 3 temperature sensors and 3 plugs are correctly detected.
Please format the results of the test script with enters like this (for the next time):

Unknown subdevice type SubDeviceInfo(sid='lumi.158d00035ab657', type_id=55, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 10.100.102.7
Unknown subdevice type SubDeviceInfo(sid='lumi.158d00035ab56a', type_id=55, unknown=1, unknown2=0, fw_ver=4) discovered, of Xiaomi gateway with ip: 10.100.102.7

<Subdevice SensorHT: lumi.158d00020291ea fw: 2 bat: 60 props: {'temperature': 25.7, 'humidity': 66.67, 'pressure': 0.0}>
<Subdevice SensorHT: lumi.158d0003502737 fw: 2 bat: 60 props: {'temperature': 27.38, 'humidity': 83.63, 'pressure': 0.0}>
<Subdevice SensorHT: lumi.158d00034f7a0b fw: 2 bat: 60 props: {'temperature': 32.12, 'humidity': 51.12, 'pressure': 0.0}>
<Subdevice Plug: lumi.158d0002855e4c fw: 1 bat: 60 props: {'status': 'off', 'power': '', 'load_power': 0.0}>
<Subdevice Plug: lumi.158d0002677318 fw: 1 bat: 60 props: {'status': 'on', 'power': '', 'load_power': 102.42}>
<Subdevice Plug: lumi.158d00025856ca fw: 1 bat: 60 props: {'status': 'off', 'power': '', 'load_power': 0.0}>
<Subdevice Unknown: lumi.158d00035ab657 fw: 4 bat: 60 props: {}>
<Subdevice Unknown: lumi.158d00035ab56a fw: 4 bat: 60 props: {}>

I can see you did not update the gateway.py file from https://github.com/rytilahti/python-miio/blob/master/miio/gateway.py yet when you obtained this print. Please do update (the official version has not been released, so updating usig pip will not give you the latest version).

Regarding the error message, you will get that error once you have the latest version of gateway.py because the gateway.devices have changed from a list to a dict. To resolve it, change the test script to (add the .values()):

from miio import Gateway

gateway = Gateway("192.168.1.IP", "tokentokentoken")

gateway.discover_devices()
devices = gateway.devices

for dev in devices.values():
    dev.update()
    print(dev)

Regarding the plugs you want to integrate, as you can see you can already read out the status and load_power.
Apprently the power is not a correct property since it is empty.
Is there any more information available in the Mi Home App besides the status and the load_power?
other properties that you could try besides "channel_0" and "load_power"are:

"power_consumed"
"energy_consumed"
"inuse"

To add functionallity the Plug class on line 982 of the gateway.py file needs to be modified:

class Plug(SubDevice):

Try adding this to that class:

    @command()
    def toggle(self):
        """Toggle Plug."""
        return self.send_arg("toggle_ctrl_neutral", ["channel_0", "toggle"]).pop()

    @command()
    def on(self):
        """Turn on Plug."""
        return self.send_arg("toggle_ctrl_neutral", ["channel_0", "on"]).pop()

    @command()
    def off(self):
        """Turn off Plug."""
        return self.send_arg("toggle_ctrl_neutral", ["channel_0", "off"]).pop()

@starkillerOG , i've aligned to gateway.py from master,
load_power is the current consumption power in Wattage.
No other properties for the AqaraSmartPlug.

I've added the @command's to the plug class and tried to turn off the plug without success.

gateway = Gateway("10.100.102.7", "token")
gateway.discover_devices()
devices = gateway.devices

for dev in devices.values():
    dev.update()
    print(dev)

plug_test = devices['lumi.158d0002677318']
print(plug_test.status)
plug_test.off()
time.sleep(5)
print(plug_test.status)
<Subdevice SensorHT: lumi.158d00020291ea, model: RTCGQ01LM, zigbee: lumi.sensor_ht, fw: 2, bat: 60, props: {'temperature': 26.69, 'humidity': 62.71, 'pressure': 0.0}>
<Subdevice Plug: lumi.158d0002855e4c, model: ZNCZ02LM, zigbee: lumi.plug, fw: 1, bat: 60, props: {'status': 'off', 'power': '', 'load_power': 0.0}>
<Subdevice AqaraWaterLeak: lumi.158d00035ab657, model: SJCGQ11LM, zigbee: lumi.sensor_wleak.aq1, fw: 4, bat: 60, props: {}>
<Subdevice Plug: lumi.158d00025856ca, model: ZNCZ02LM, zigbee: lumi.plug, fw: 1, bat: 60, props: {'status': 'off', 'power': '', 'load_power': 0.0}>
<Subdevice SensorHT: lumi.158d00034f7a0b, model: RTCGQ01LM, zigbee: lumi.sensor_ht, fw: 2, bat: 60, props: {'temperature': 26.89, 'humidity': 73.82, 'pressure': 0.0}>
<Subdevice Plug: lumi.158d0002677318, model: ZNCZ02LM, zigbee: lumi.plug, fw: 1, bat: 60, props: {'status': 'on', 'power': '', 'load_power': 107.19}>
<Subdevice AqaraWaterLeak: lumi.158d00035ab56a, model: SJCGQ11LM, zigbee: lumi.sensor_wleak.aq1, fw: 4, bat: 60, props: {}>
<Subdevice SensorHT: lumi.158d0003502737, model: RTCGQ01LM, zigbee: lumi.sensor_ht, fw: 2, bat: 60, props: {'temperature': 26.85, 'humidity': 64.75, 'pressure': 0.0}>
{'status': 'on', 'power': '', 'load_power': 107.19}
{'status': 'on', 'power': '', 'load_power': 107.19}

@starkillerOG
Copy link
Contributor

starkillerOG commented Jun 25, 2020

@miway80 thanks for the information.

Your test script is missing a plug_test.update() between trying to turn it off and printing the status again.

So the script schould be:

gateway = Gateway("10.100.102.7", "token")
gateway.discover_devices()
devices = gateway.devices

for dev in devices.values():
    dev.update()
    print(dev)

plug_test = devices['lumi.158d0002677318']
print(plug_test.status)
print(plug_test.off())
time.sleep(5)
plug_test.update()
print(plug_test.status)

@starkillerOG
Copy link
Contributor

@miway80 You can also try replacing "toggle_ctrl_neutral" with "toggle_plug" in the control commands and/or change "channel_0" with "neutral_0".

If those all don't work in the combinations that you can come up with, you will have to use bluestack to sniff the commands while turning on/off the plug and see what the exact commands are....

@wuid24
Copy link

wuid24 commented Jun 25, 2020

@miway80 You can also try replacing "toggle_ctrl_neutral" with "toggle_plug" in the control commands and/or change "channel_0" with "neutral_0".

If those all don't work in the combinations that you can come up with, you will have to use bluestack to sniff the commands while turning on/off the plug and see what the exact commands are....

Hi,
so toggling is working with toggle_plug and not with toggle_ctrl_neutral .
I'm running my python scripts over pycharm and by hitting "run" the toggling doesn't work, while in debug mode it is working.

@starkillerOG
Copy link
Contributor

@wuid24 to be sure, it works with return self.send_arg("toggle_plug", ["channel_0", "toggle"]).pop() right?
I added the commands in this PR: https://github.com/rytilahti/python-miio/pull/737/files

I just use python 3.7.1 and command line, so I don't know how pycharm works....

@MicroSur
Copy link

MicroSur commented Jun 26, 2020

Please do update

Will this command be true for the latest update in venv?
pip install -e git+https://github.com/rytilahti/python-miio.git#egg=python-miio

@starkillerOG
Copy link
Contributor

pip install -e git+https://github.com/rytilahti/python-miio.git#egg=python-miio

I think so, but you can just try and then check if the gateway.py file looks the same right?
(There have been a lot of changes since the last release so the diffrence schould be easy to spot).

@wuid24
Copy link

wuid24 commented Jun 28, 2020

just use python 3.7.1 and command line, so I don't know how pycharm works....

@starkillerOG sorry for the late response, busy weekend...
pasted the modified lines which works for toggle,on,off commands:

    @command()
    def toggle(self):
        """Toggle Plug."""
        # return self.send_arg("toggle_ctrl_neutral", ["channel_0", "toggle"]).pop()
        return self.send_arg("toggle_plug", ["channel_0", "toggle"]).pop()

    @command()
    def on(self):
        """Turn on Plug."""
        return self.send_arg("toggle_plug", ["channel_0", "on"]).pop()

    @command()
    def off(self):
        """Turn off Plug."""
        return self.send_arg("toggle_plug", ["channel_0", "off"]).pop()

@starkillerOG
Copy link
Contributor

@wuid24 thanks for confirming.
The correct commands have already been merged and are included in the latest unreleased version.

@matteos1
Copy link

matteos1 commented Jul 27, 2020

@matteos1
Copy link

when it will be possible to access the new platform via cloud for xiaomi gateways?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants