Skip to content

Xiaomi Smart Tower Fan 2 spec parsing throws errors #2032

@OevreFlataeker

Description

@OevreFlataeker

I have one of those rather new Xiaomi Smart Tower Fan 2 devices.
They are supported by the genericmiio command, but parsing the spec throws and error in pydantic:

(.venv) daubsi@t14:/tmp/.venv$ bin/miiocli genericmiot --ip 192.168.0.22 --token xxxx settings

Running command settings
ERROR:miio.click_common:Exception: 14 validation errors for DeviceModel
services -> 0 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 1 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 2 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 3 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 4 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 1 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 2 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 3 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 4 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 5 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 6 -> source
  extra fields not permitted (type=value_error.extra)
services -> 2 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
services -> 3 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
Traceback (most recent call last):
  File "/tmp/.venv/lib/python3.12/site-packages/miio/click_common.py", line 55, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/core.py", line 1059, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/core.py", line 1665, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/core.py", line 1665, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/core.py", line 1401, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/core.py", line 767, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/click_common.py", line 306, in wrap
    result = kwargs["result"] = func(*args, **kwargs)
                                ^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/click/core.py", line 767, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/click_common.py", line 271, in command_callback
    return miio_command.call(miio_device, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/click_common.py", line 219, in call
    return method(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/click_common.py", line 186, in _wrap
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/device.py", line 288, in settings
    for k, v in self.descriptors().items()
                ^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/click_common.py", line 186, in _wrap
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/device.py", line 265, in descriptors
    self._initialize_descriptors()
  File "/tmp/.venv/lib/python3.12/site-packages/miio/integrations/genericmiot/genericmiot.py", line 143, in _initialize_descriptors
    self.initialize_model()
  File "/tmp/.venv/lib/python3.12/site-packages/miio/integrations/genericmiot/genericmiot.py", line 56, in initialize_model
    self._miot_model = miotcloud.get_device_model(self.model)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/miot_cloud.py", line 90, in get_device_model
    return DeviceModel.parse_obj(spec)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/pydantic/v1/main.py", line 532, in parse_obj
    return cls(**obj)
           ^^^^^^^^^^
  File "/tmp/.venv/lib/python3.12/site-packages/miio/miot_models.py", line 456, in __init__
    super().__init__(*args, **kwargs)
  File "/tmp/.venv/lib/python3.12/site-packages/pydantic/v1/main.py", line 347, in __init__
    raise validation_error
pydantic.v1.error_wrappers.ValidationError: 14 validation errors for DeviceModel
services -> 0 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 1 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 2 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 3 -> source
  extra fields not permitted (type=value_error.extra)
services -> 0 -> properties -> 4 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 1 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 2 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 3 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 4 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 5 -> source
  extra fields not permitted (type=value_error.extra)
services -> 1 -> properties -> 6 -> source
  extra fields not permitted (type=value_error.extra)
services -> 2 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)
services -> 3 -> properties -> 0 -> source
  extra fields not permitted (type=value_error.extra)

Commenting thes lines 347,348

if validation_error:
              raise validation_error

in pydantic/v1/main.py

makes everything work fine (all commands for genericmiio work), but ofc the exceptions are probably here for a reason. What exactly it is complaining about?

"services -> 3 -> properties -> 0 -> source
extra fields not permitted (type=value_error.extra)"

xiaomi.fan.p45.json

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions