8000 Unable to constantly query bulb in loop · Issue #225 · python-kasa/python-kasa · GitHub
[go: up one dir, main page]

Skip to content

Unable to constantly query bulb in loop #225

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

Closed
jasonlboggs opened this issue Oct 1, 2021 · 2 comments
Closed

Unable to constantly query bulb in loop #225

jasonlboggs opened this issue Oct 1, 2021 · 2 comments

Comments

@jasonlboggs
Copy link

Hello there! Thank you for this library; it has been immensely useful in automating my smart home full of mostly TPLink devices.

I am having an issue simply querying and printing several of a bulb's properties using the current version of python-kasa. I checked the documentation and my code seems to be in line with the examples.

I'm running this code in a clean VM with only python-kasa installed using sudo pip3 install python-kasa
Ubuntu 20.04.3 LTS
Python 3.8.10
kasa, version 0.4.0

Code:

#!/usr/bin/env python3

import os
import time
import asyncio
from kasa import SmartBulb

bulb = SmartBulb('10.10.10.123')

count = 0
while True:
  count = count + 1
  asyncio.run(bulb.update())

  os.system('clear')

  print ('\n\n')
  print (f'\tCount: {count}\n')
  print (f'\tPower: {"On" if bulb.is_on else "Off"}')
  print (f'\tHue:   {bulb.hsv[0]}')
  print (f'\tSat:   {bulb.hsv[1]}')
  print (f'\tVol:   {bulb.hsv[2]}')
  print (f'\tTemp:  {bulb.color_temp}')

  time.sleep(1)

Error message:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/kasa/protocol.py", line 138, in _query
    return await asyncio.wait_for(
  File "/usr/lib/python3.8/asyncio/tasks.py", line 494, in wait_for
    return fut.result()
  File "/usr/local/lib/python3.8/dist-packages/kasa/protocol.py", line 99, in _execute_query
    packed_block_size = await self.reader.readexactly(self.BLOCK_SIZE)
  File "/usr/lib/python3.8/asyncio/streams.py", line 723, in readexactly
    await self._wait_for_data('readexactly')
  File "/usr/lib/python3.8/asyncio/streams.py", line 517, in _wait_for_data
    await self._waiter
RuntimeError: Task <Task pending name='Task-11' coro=<TPLinkSmartHomeProtocol._execute_query() running at /usr/local/lib/python3.8/dist-packages/kasa/protocol.py:99> cb=[_release_waiter(<Future pendi...0bdabfc10>()]>)() at /usr/lib/python3.8/asyncio/tasks.py:429]> got Future <Future pending> attached to a different loop

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./bulb.py", line 13, in <module>
    asyncio.run(bulb.update())
  File "/usr/lib/python3.8/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/usr/local/lib/python3.8/dist-packages/kasa/smartdevice.py", line 302, in update
    self._last_update = await self.protocol.query(req)
  File "/usr/local/lib/python3.8/dist-packages/kasa/protocol.py", line 71, in query
    return await self._query(request, retry_count, timeout)
  File "/usr/local/lib/python3.8/dist-packages/kasa/protocol.py", line 142, in _query
    await self.close()
  File "/usr/local/lib/python3.8/dist-packages/kasa/protocol.py", line 115, in close
    writer.close()
  File "/usr/lib/python3.8/asyncio/streams.py", line 353, in close
    return self._transport.close()
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 692, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "/usr/lib/python3.8/asyncio/base_events.py", line 719, in call_soon
    self._check_closed()
  File "/usr/lib/python3.8/asyncio/base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

At time of error, my counter (count) prints 2

Output of kasa --host 10.10.10.123 --bulb

== Desk Lamp - KL130(US) ==
	Host: 10.10.10.123
	Device state: ON

	== Generic information ==
	Time:         2021-10-01 07:55:57
	Hardware:     2.0
	Software:     1.0.12 Build 210329 Rel.141126
	MAC (rssi):   (sanitized) (-65)
	Location:     {'latitude': xx.xxxx, 'longitude': xx.xxxx}

	== Device specific information ==
	Brightness: 100
	Is dimmable: True
	Color temperature: 0
	Valid temperature range: ColorTempRange(min=2500, max=9000)
	HSV: HSV(hue=110, saturation=4, value=100)


	== Current State ==
	<EmeterStatus power=10.8 voltage=None current=None total=0.573>

On a side note, when I install(ed) python-kasa, there is an error with requests and idna:
sudo pip3 install python-kasa --force-reinstall
ERROR: requests 2.25.1 has requirement idna<3,>=2.5, but you'll have idna 3.2 which is incompatible.

Also, on my "prod" machine, I use the code from PR-117 installed and this code functions without issue, although a lot of newer HW versioned switches don't show up (out of scope).

@rytilahti
Copy link
Member

Hi there!

So, the current version of this library will re-use an existing TCP session to optimize the updates, which is especially useful for devices like HS300 which require multiple requests for the energy consumption information. In your example code you are calling asyncio.run() once per loop, which internally creates a new event loop for each iteration and this causes the exception you are seeing.

Here's the preferred way to do it:

#!/usr/bin/env python3

import os
import time
import asyncio
from kasa import SmartBulb


async def show_bulb_state(host):
    bulb = SmartBulb(host)

    count = 0
    while True:
        count = count + 1
        await bulb.update()

        os.system('clear')

        print ('\n\n')
        print (f'\tCount: {count}\n')
        print (f'\tPower: {"On" if bulb.is_on else "Off"}')
        print (f'\tHue:   {bulb.hsv[0]}')
        print (f'\tSat:   {bulb.hsv[1]}')
        print (f'\tVol:   {bulb.hsv[2]}')
        print (f'\tTemp:  {bulb.color_temp}')

        time.sleep(1)


if __name__ == "__main__":
    asyncio.run(show_bulb_state("10.10.10.123"))

Hope that helps, feel free to open separate issues for the other things you mentioned. I don't think that idna/requests warning is caused by python-kasa as we don't depend (at least directly) on those, but it's still worth verifying.

@jasonlboggs
Copy link
Author

This worked. Thank you!

rytilahti added a commit to rytilahti/python-kasa that referenced this issue Jan 14, 2022
This minor release fixes issues that were found after homeassistant integration got converted over from pyhs100.

[Full Changelog](python-kasa/python-kasa@0.4.0...0.4.1)

**Implemented enhancements:**

- Add --type option to cli [\python-kasa#269](python-kasa#269) ([rytilahti](https://github.com/rytilahti))
- Minor improvements to onboarding doc [\python-kasa#264](python-kasa#264) ([rytilahti](https://github.com/rytilahti))
- Add fixture file for KL135 [\python-kasa#263](python-kasa#263) ([ErikSGross](https://github.com/ErikSGross))
- Add KL135 color temperature range [\python-kasa#256](python-kasa#256) ([rytilahti](https://github.com/rytilahti))
- Add py.typed to flag that the package is typed [\python-kasa#251](python-kasa#251) ([rytilahti](https://github.com/rytilahti))
- Add script to check supported devices, update README [\python-kasa#242](python-kasa#242) ([rytilahti](https://github.com/rytilahti))
- Add perftest to devtools [\python-kasa#236](python-kasa#236) ([rytilahti](https://github.com/rytilahti))
- Add KP401 US fixture [\python-kasa#234](python-kasa#234) ([bdraco](https://github.com/bdraco))
- Add KL60 US KP105 UK fixture [\python-kasa#233](python-kasa#233) ([bdraco](https://github.com/bdraco))
- Make cli interface more consistent [\python-kasa#232](python-kasa#232) ([rytilahti](https://github.com/rytilahti))
- Add KL400, KL50 fixtures [\python-kasa#231](python-kasa#231) ([bdraco](https://github.com/bdraco))
- Add fixture for newer KP400 firmware [\python-kasa#227](python-kasa#227) ([bdraco](https://github.com/bdraco))
- Switch to poetry-core [\python-kasa#226](python-kasa#226) ([fabaff](https://github.com/fabaff))
- Add fixtures for LB110, KL110, EP40, KL430, KP115 [\python-kasa#224](python-kasa#224) ([bdraco](https://github.com/bdraco))

**Fixed bugs:**

- Discovery on WSL results in OSError: \[Errno 22\] Invalid argument [\python-kasa#246](python-kasa#246)
- New firmware for HS103 blocking local access? [\python-kasa#42](python-kasa#42)
- Pin mistune to \<2.0.0 to fix doc builds [\python-kasa#270](python-kasa#270) ([rytilahti](https://github.com/rytilahti))
- Catch exceptions raised on unknown devices during discovery [\python-kasa#240](python-kasa#240) ([rytilahti](https://github.com/rytilahti))

**Closed issues:**

- Control device with alias via python api? [\python-kasa#285](python-kasa#285)
- Can't install using pip install python-kasa [\python-kasa#255](python-kasa#255)
- Kasa Smart Bulb KL135 - Unknown color temperature range error [\python-kasa#252](python-kasa#252)
- KL400 Support [\python-kasa#247](python-kasa#247)
- Cloud support? [\python-kasa#245](python-kasa#245)
- Support for kp401 [\python-kasa#241](python-kasa#241)
- LB130 Bulb stopped working [\python-kasa#237](python-kasa#237)
- Unable to constantly query bulb in loop [\python-kasa#225](python-kasa#225)
- HS103: Unable to query the device: unpack requires a buffer of 4 bytes [\python-kasa#187](python-kasa#187)
- Help request - query value [\python-kasa#171](python-kasa#171)
- Can't Discover Devices [\python-kasa#164](python-kasa#164)
- Concurrency performance question [\python-kasa#110](python-kasa#110)
- Define the port by self? [\python-kasa#108](python-kasa#108)
- Convert homeassistant integration to use the library [\python-kasa#9](python-kasa#9)

**Merged pull requests:**

- Publish to pypi on github release published [\python-kasa#287](python-kasa#287) ([rytilahti](https://github.com/rytilahti))
- Relax asyncclick version requirement [\python-kasa#286](python-kasa#286) ([rytilahti](https://github.com/rytilahti))
- Do not crash on discovery on WSL [\python-kasa#283](python-kasa#283) ([rytilahti](https://github.com/rytilahti))
- Add python 3.10 to CI [\python-kasa#279](python-kasa#279) ([rytilahti](https://github.com/rytilahti))
- Use codecov-action@v2 for CI [\python-kasa#277](python-kasa#277) ([rytilahti](https://github.com/rytilahti))
- Add coverage\[toml\] dependency to fix coverage on CI [\python-kasa#271](python-kasa#271) ([rytilahti](https://github.com/rytilahti))
- Allow publish on test pypi workflow to fail [\python-kasa#248](python-kasa#248) ([rytilahti](https://github.com/rytilahti))
rytilahti added a commit that referenced this issue Jan 14, 2022
This minor release fixes issues that were found after homeassistant integration got converted over from pyhs100.

[Full Changelog](0.4.0...0.4.1)

**Implemented enhancements:**

- Add --type option to cli [\#269](#269) ([rytilahti](https://github.com/rytilahti))
- Minor improvements to onboarding doc [\#264](#264) ([rytilahti](https://github.com/rytilahti))
- Add fixture file for KL135 [\#263](#263) ([ErikSGross](https://github.com/ErikSGross))
- Add KL135 color temperature range [\#256](#256) ([rytilahti](https://github.com/rytilahti))
- Add py.typed to flag that the package is typed [\#251](#251) ([rytilahti](https://github.com/rytilahti))
- Add script to check supported devices, update README [\#242](#242) ([rytilahti](https://github.com/rytilahti))
- Add perftest to devtools [\#236](#236) ([rytilahti](https://github.com/rytilahti))
- Add KP401 US fixture [\#234](#234) ([bdraco](https://github.com/bdraco))
- Add KL60 US KP105 UK fixture [\#233](#233) ([bdraco](https://github.com/bdraco))
- Make cli interface more consistent [\#232](#232) ([rytilahti](https://github.com/rytilahti))
- Add KL400, KL50 fixtures [\#231](#231) ([bdraco](https://github.com/bdraco))
- Add fixture for newer KP400 firmware [\#227](#227) ([bdraco](https://github.com/bdraco))
- Switch to poetry-core [\#226](#226) ([fabaff](https://github.com/fabaff))
- Add fixtures for LB110, KL110, EP40, KL430, KP115 [\#224](#224) ([bdraco](https://github.com/bdraco))

**Fixed bugs:**

- Discovery on WSL results in OSError: \[Errno 22\] Invalid argument [\#246](#246)
- New firmware for HS103 blocking local access? [\#42](#42)
- Pin mistune to \<2.0.0 to fix doc builds [\#270](#270) ([rytilahti](https://github.com/rytilahti))
- Catch exceptions raised on unknown devices during discovery [\#240](#240) ([rytilahti](https://github.com/rytilahti))

**Closed issues:**

- Control device with alias via python api? [\#285](#285)
- Can't install using pip install python-kasa [\#255](#255)
- Kasa Smart Bulb KL135 - Unknown color temperature range error [\#252](#252)
- KL400 Support [\#247](#247)
- Cloud support? [\#245](#245)
- Support for kp401 [\#241](#241)
- LB130 Bulb stopped working [\#237](#237)
- Unable to constantly query bulb in loop [\#225](#225)
- HS103: Unable to query the device: unpack requires a buffer of 4 bytes [\#187](#187)
- Help request - query value [\#171](#171)
- Can't Discover Devices [\#164](#164)
- Concurrency performance question [\#110](#110)
- Define the port by self? [\#108](#108)
- Convert homeassistant integration to use the library [\#9](#9)

**Merged pull requests:**

- Publish to pypi on github release published [\#287](#287) ([rytilahti](https://github.com/rytilahti))
- Relax asyncclick version requirement [\#286](#286) ([rytilahti](https://github.com/rytilahti))
- Do not crash on discovery on WSL [\#283](#283) ([rytilahti](https://github.com/rytilahti))
- Add python 3.10 to CI [\#279](#279) ([rytilahti](https://github.com/rytilahti))
- Use codecov-action@v2 for CI [\#277](#277) ([rytilahti](https://github.com/rytilahti))
- Add coverage\[toml\] dependency to fix coverage on CI [\#271](#271) ([rytilahti](https://github.com/rytilahti))
- Allow publish on test pypi workflow to fail [\#248](#248) ([rytilahti](https://github.com/rytilahti))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants
0