{"id":24484,"library":"pyworxcloud","title":"pyworxcloud","description":"Python library for interacting with the Positec/Landroid cloud API. Provides asynchronous control of Landroid robotic lawn mowers. Current version 6.3.6, supports Python 3.9+ with <4.0.","status":"active","version":"6.3.6","language":"python","source_language":"en","source_url":"https://github.com/mt-ai/pyworxcloud","tags":["landroid","mower","async","cloud"],"install":[{"cmd":"pip install pyworxcloud","lang":"bash","label":"pip"}],"dependencies":[],"imports":[{"symbol":"WorxCloud","correct":"from pyworxcloud import WorxCloud"},{"symbol":"const","correct":"from pyworxcloud import const"}],"quickstart":{"code":"import asyncio\nimport os\nfrom pyworxcloud import WorxCloud\n\nasync def main():\n    email = os.environ.get('EMAIL', '')\n    password = os.environ.get('PASSWORD', '')\n    async with WorxCloud(email, password) as cloud:\n        # List all mowers\n        for product in cloud.products:\n            print(f\"Mower: {product.name}, serial: {product.serial_number}\")\n\nasyncio.run(main())","lang":"python","description":"Initializes WorxCloud and lists mowers."},"warnings":[{"fix":"Use 'async with WorxCloud(...) as cloud' instead of WorxCloud(...) without async.","message":"WorxCloud is now an async context manager (async with). You must use async/await; synchronous usage is removed.","severity":"breaking","affected_versions":">=6.0.0"},{"fix":"WorxCloud(email, password, region='EU'). Common regions: 'EU', 'US', 'CN'.","message":"Region selection is automatic but may delay login. If you know your region, set it explicitly to avoid extra API calls.","severity":"gotcha","affected_versions":"all"},{"fix":"Use cloud.products instead of cloud.mowers.","message":"The 'mowers' attribute was renamed to 'products' to support non-mower devices (e.g., vacuums).","severity":"deprecated","affected_versions":">=6.0.0"}],"env_vars":null,"last_verified":"2026-05-01T00:00:00.000Z","next_check":"2026-07-30T00:00:00.000Z","problems":[{"fix":"Use 'await main()' if already in an event loop, or nest with 'asyncio.get_event_loop().run_until_complete(main())'.","cause":"Running asyncio.run() inside an event loop (e.g., in Jupyter or IPython).","error":"RuntimeError: asyncio.run() cannot be called from a running event loop"},{"fix":"Replace cloud.mowers with cloud.products.","cause":"Upgrading to v6.x where 'mowers' was renamed to 'products'.","error":"AttributeError: 'WorxCloud' object has no attribute 'mowers'"},{"fix":"URL-encode password or switch region: WorxCloud(email, password, region='EU'). Also ensure you use the exact email for the Positec account.","cause":"Password uses special characters incorrectly encoded, or region mismatch.","error":"Invalid credentials: HTTP 403"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}