imow-webapi


Nameimow-webapi JSON
Version 0.8.4 PyPI version JSON
download
home_pagehttps://github.com/ChrisHaPunkt/stihl-imow-webapi
SummaryA library to authenticate and interact with STIHL iMow mowers using their WebAPI
upload_time2023-12-09 16:22:08
maintainer
docs_urlNone
authorChrisHaPunkt
requires_python
licenseGPL
keywords stihl imow mower api
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # STIHL iMow unofficial Python API wrapper

[![PyPI version shields.io](https://img.shields.io/pypi/v/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)
[![Docs on GitHub pages](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](hhttps://chrishapunkt.github.io/stihl-imow-webapi/imow)
[![CI](https://github.com/ChrisHaPunkt/stihl-imow-webapi/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/ChrisHaPunkt/stihl-imow-webapi/actions/workflows/python-package.yml)
[![PyPI download total](https://img.shields.io/pypi/dm/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)
[![PyPI pyversions](https://img.shields.io/pypi/pyversions/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)
[![PyPI license](https://img.shields.io/pypi/l/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)


This unofficial Python API was created to provide an interface to interact with the STIHL iMow mower WebAPI. This wrapper is able to receive the current state
from the mowers and to send actions.  
I wrote this library to implement an integration for the [Home Assistant Smart Home System](https://www.home-assistant.io/), which you can find [here](https://github.com/ChrisHaPunkt/ha-stihl-imow).

## iMOW compatibility
STIHL uses different webapps for their iMOW generations. Currently only the **iMOW RMI series are supported** by this library, because i'm not able to reverse engineer the newer generation.
This is simply because I do not own them. 

If you use this webapp, [https://app.imow.sithl.com](https://app.imow.stihl.com), this library should work for your mower.

Also see here: [Issue #13](https://github.com/ChrisHaPunkt/stihl-imow-webapi/issues/13)
## Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing
purposes. See deployment for notes on how to deploy the project on a live system.

API Documentation is available on: [https://chrishapunkt.github.io/stihl-imow-webapi/imow](https://chrishapunkt.github.io/stihl-imow-webapi/imow)

If you want to  
[!["Buy Me A Coffee"](
https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee&emoji=&slug=chrishapunkt&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/chrishapunkt)


### Prerequisites

Python 3.8+ is required to run this application, other than that there are no prerequisites for the project, as the
dependencies are included in the repository.

### Installing

To install the library is as simple as cloning the repository and running

```bash
pip install -e .
```

It is recommended to create an virtual environment prior to installing this library. Alternatively, you can also install
this library via Pip:

```bash
pip install imow-webapi
```

And have fun!

## Usage
### Python Import and Usage
Import the module and instantiate the `IMowApi()` constructor with credentials. Afterwards, initiate the `get_token()` method.
Or place credentials in the `get_token()` method.

```python
from imow.api import IMowApi
from imow.common.actions import IMowActions
import asyncio
import aiohttp


async def main():
    async with aiohttp.ClientSession() as session:
        api = IMowApi(aiohttp_session=session, lang="de")
        # save token for later use if you want to recreate IMowApi(token=my_token) because the created token is valid for
        # 30 days
        token, expire_time = await api.get_token("email@account.stihl", "supersecret", return_expire_time=True)
        
        print(await api.get_token())
        
        mowers = await api.receive_mowers()
        mower = mowers[0]
        
        print(f"{mower.name} @ {mower.coordinateLatitude},{mower.coordinateLongitude}")
        print(f"Currently: {mower.stateMessage['short']}")
        await mower.update_setting("gpsProtectionEnabled", True)
        
        print(mower.stateMessage)
        print(mower.machineState)
        await mower.intent(IMowActions.TO_DOCKING)
        print(await mower.update_from_upstream())
        print(await mower.get_startpoints())
        

if __name__ == "__main__":
    asyncio.run(main())

```
```text
Selection of outputs from above statements:
> Mährlin @ 54.123456,10.12345
> Currently: Hood blocked
> {'short': 'Hood blocked', 'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).', 'legacyMessage': 'Abschaltung Automatikmode durch Bumper', 'errorId': '', 'error': False}
> HOOD_BLOCKED
> <imow.common.mowerstate.MowerState object at 0x000001B034C245F8>
```

### Example: Receive startpoints and intent mowing 
Save the following as `myscript.sh` and execute `chmod +x myscript.sh`. Make sure you install the api via `pip3 install imow-webapi`  
Afterwards you can execute via `./myscript.sh`
```bash
#!/usr/bin/env python3
from imow.api import IMowApi
from imow.common.actions import IMowActions
import asyncio
import aiohttp
import logging

logger = logging.getLogger("imow")
# Enable DEBUG output
logging.basicConfig(level=logging.DEBUG)

async def main():
    async with aiohttp.ClientSession() as session:
        api = IMowApi(aiohttp_session=session, lang="de")
        # save token for later use if you want to recreate IMowApi(token=my_token) because the created token is valid for
        # 30 days
        token, expire_time = await api.get_token("email@account.stihl", "supersecret", return_expire_time=True)
    
        print(await api.get_token())
    
        mowers = await api.receive_mowers()
        mower = mowers[0]
    
        print(f"{mower.name} @ {mower.coordinateLatitude},{mower.coordinateLongitude}")
        print(f"Currently: {mower.stateMessage['short']}")
    
        startpoints = await mower.get_startpoints()
        for i in range(len(startpoints)):
            print("Startpoint {}: {}".format(i, startpoints[i]))
        
        # if your mower supports the "startMowing" call, use this action (i.e iMow 600 series)
        await mower.intent(IMowActions.START_MOWING, starttime="2023-08-12 20:50")
        # await mower.intent(IMowActions.START_MOWING, endtime="2023-08-12 22:50")
        # await mower.intent(IMowActions.START_MOWING, starttime="2023-08-12 20:50", endtime="2023-08-12 22:50")

        # if your mower supports the "startMowingFromPoint" call, use this action (i.e iMow 400 series)
        await mower.intent(IMowActions.START_MOWING_FROM_POINT, duration=50)
        # await mower.intent(IMowActions.START_MOWING_FROM_POINT, startpoint=2)
        # await mower.intent(IMowActions.START_MOWING_FROM_POINT, duration=50, startpoint=2)


if __name__ == "__main__":
    asyncio.run(main())

```
## Testing
For unit testing run `pytest -s tests/test_unit*`. For upstream integration testing, provide a `/secrets.py` with the following contents:
````python
EMAIL = "email@account.stihl"
PASSWORD = "supersecret"
MOWER_NAME = "MyRobot"
````
and run `pytest -s tests/test_integration*` or `pytest -s`. 

## Built With

* aiohttp
* BeautifulSoup
* asyncio

## Versioning

Navigate to [tags on this repository](https://github.com/ChrisHaPunkt/imow-webapi/releases)
to see all available versions.

## Authors

| Mail Address                | GitHub Profile                                |
-----------------------------|-----------------------------------------------|
| chris@homeset.de          | [ChrisHaPunkt](https://github.com/ChrisHaPunkt)     |

## License

This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md)
license file for more details.

# Acknowledges

Thanks to

* https://github.com/nstrydom2/anonfile-api
* https://github.com/OpenXbox/xbox-webapi-python

for repo structure inspiration


# Changelog

## Version 0.8.4 (2023-12-09)
### Fix
- Loosen the version requirements for dependency libs
- update the tested python version placed inside setup and PyPi to python 3.12

## Version 0.8.2 (2023-08-26)
### Fix
- validation of values in keyword arguments
### BREAKING CHANGE
The iMow action `IMowActions.START_MOWING` now creates a `startMowing` action and no longer a `startMowingFromPoint` action.
To issue a `startMowingFromPoint`, the new `IMowAction.START_MOWING_FROM_POINT` needs to be used.

#### Added 
- keywork arguments `starttime` and `endtime` in `IMow.intent()` call to be used with IMowActions.START_MOWING
- Updated Readme with `IMow.intent` exampes
- added debug log output in `intent()` call

## Version 0.7.10 (2023-05-13)
- Bugfix http_session not present on logout
## Version 0.7.9 (2023-05-13)
- remove unnecessary http_session closes
## Version 0.7.8 (2022-03-06)
- Implement a logout function `ImowAPI.api_logout()`. Use within re-authentication
## Version 0.7.7 (2022-03-06)
- Use more `async with`s
## Version 0.7.6 (2022-03-05)

### Dependency updates
- Update dependencies to latest

## Version 0.7.4 (2021-09-06)

### Bugfxes
- Allow handling of timestamps on mower intents (StartTime/Endtime)

## Version 0.7.3 (2021-07-03)

### Bugfxes
- Always return a MowerState on settings update

## Version 0.7.2 (2021-07-03)
```python
await mower.update_setting("gpsProtectionEnabled", True)
```
### Features
- Possibility to update a specific settings for a mower like gpsProtection on/off
## Version 0.7.0 (2021-06-30)
### Breaking Changes
- `IMowApi.intent` Parameter `mower_action_id` is renamed to `mower_external_id` to match the upstream api expectation.
### Features
- If an `api_request` is intended, and the used `access_token` expires in less than one day, it's automatically renewed.

## Version 0.6.0 (2021-06-28)
- ```python
  mower.machineError = 'M1120',
  mower.machineState = 'HOOD_BLOCKED',
  mower.stateMessage: dict = {
      'short': 'Hood blocked',
      'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).',
      'legacyMessage': 'Abschaltung Automatikmode durch Bumper',
      'errorId': 'M1120',
      'error': True
  }
  ```

### Breaking Changes
- Migrated all own MowerState attributes to camelCase to match the upstream attributes style.
  ```
  - MowerState.stateMessage = None
  - MowerState.machineError = None
  - MowerState.machineState = None
  ```
## Version 0.5.2 (2021-06-15)

## Bugfixes
- Also quote password string in auth request to support more special chars

## Version 0.5.1 (2021-06-13)

## Features
- ```python
  mower.machine_error = 'M1120',
  mower.machine_state = 'HOOD_BLOCKED',
  mower.state_message: dict = {
      'short': 'Hood blocked',
      'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).',
      'legacyMessage': 'Abschaltung Automatikmode durch Bumper',
      'errorId': 'M1120',
      'error': True
  }
  ```
  Provide a machine usable string from the short message in english

## Version 0.5.0 (2021-06-12)

### Breaking Changes

- The ``MowerTask`` class is removed in favor of the new ``state_message`` property on th ``MowerState`` object.
- The ``MowerState.get_current_task()`` method now returns the `short` property of the state message instead of a ``MowerTask``
  property and is now longer an ``async`` method.

### Features

- ```python
  mower.state_message -> dict
  {
      'short': 'Hood blocked',
      'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).',
      'errorId': 'M1120',
      'error': True
  }
  ```
  The MowerState Class now provides a ```state_message``` property which gives a ``short`` and``long`` text for
  description (Besides an error indication and errorId). All error and status codes are now dynamically matched and
  human readable available.
  **This makes the ``MowerTask`` obsolete and it is removed with this release.**
- ``api = IMowApi(lang="en")``
  The imow api can now be instanced with a language code (fallback to ``en``).
  The ``state_message`` property displays the messages in the corresponding language.

## Version 0.4.5 (2021-06-01)

### Features

- Add 2 new identified Tasks within `MowerTask` (Thanks to @lausser)
- Add `check_api_maintenance()` method to `IMowAPI` Class. Check if the api server is currently under maintenance.
  This method is automatically called if the api server returns a 500 error response for any request.
- One should call the new `close()` method for the `IMowAPI` Class when finishing the api interactions to correctly
  close the http session.

### Bugfixes

- [Issue #8](https://github.com/ChrisHaPunkt/stihl-imow-webapi/issues/8) - Example not working

## Version 0.4.4 (2021-05-28)

### Features

- Add `validate_token()` method to `IMowAPI` Class. Test if a token is valid and is able to call the webapi.

## Version 0.4.3 (2021-05-27)

### Features

- Allow `IMowAPI` Class to use predefined `aiohttp` session when instantiating

## Version 0.4.1 (2021-05-24)

### Changes

- Even more asynchronously with switch from `requests` to `aiohttp`

## Version 0.4.0 (2021-05-17)

### Breaking Changes

- Reworked everything to use asyncio where possible. See Readme.md for new usage example.
- Renamed MowerState method `update` to `update_from_upstream`
- Renamed MowerState method `get_status` to `get_current_status`

## Version 0.3.0 (2021-05-17)

### Breaking Changes

- Renamed Class/Enum `MowerState` to `MowerTask` because it describes the current task not the state
- Renamed Class `Mower` to `MowerState` because it's just a snapshot of the last upstream state

### Features

- Add methods to work on `MowerState` objects, like action intents or statistic receive
- Add PDoc documents, available
  on [https://chrishapunkt.github.io/stihl-imow-webapi/imow](https://chrishapunkt.github.io/stihl-imow-webapi/imow)

### Bugfixes

- Return a valid error message and raise if provided login credentials are wrong

## Version 0.2.2 (2021-05-00)

- Initial release

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ChrisHaPunkt/stihl-imow-webapi",
    "name": "imow-webapi",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "stihl imow mower api",
    "author": "ChrisHaPunkt",
    "author_email": "",
    "download_url": "https://files.pythonhosted.org/packages/c7/ee/57190917ef291b965811821ef0149b49216b461878299e293ee1c51971fb/imow-webapi-0.8.4.tar.gz",
    "platform": null,
    "description": "# STIHL iMow unofficial Python API wrapper\n\n[![PyPI version shields.io](https://img.shields.io/pypi/v/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)\n[![Docs on GitHub pages](https://img.shields.io/badge/docs-GitHub%20Pages-blue)](hhttps://chrishapunkt.github.io/stihl-imow-webapi/imow)\n[![CI](https://github.com/ChrisHaPunkt/stihl-imow-webapi/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/ChrisHaPunkt/stihl-imow-webapi/actions/workflows/python-package.yml)\n[![PyPI download total](https://img.shields.io/pypi/dm/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)\n[![PyPI pyversions](https://img.shields.io/pypi/pyversions/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)\n[![PyPI license](https://img.shields.io/pypi/l/imow-webapi)](https://pypi.python.org/pypi/imow-webapi/)\n\n\nThis unofficial Python API was created to provide an interface to interact with the STIHL iMow mower WebAPI. This wrapper is able to receive the current state\nfrom the mowers and to send actions.  \nI wrote this library to implement an integration for the [Home Assistant Smart Home System](https://www.home-assistant.io/), which you can find [here](https://github.com/ChrisHaPunkt/ha-stihl-imow).\n\n## iMOW compatibility\nSTIHL uses different webapps for their iMOW generations. Currently only the **iMOW RMI series are supported** by this library, because i'm not able to reverse engineer the newer generation.\nThis is simply because I do not own them. \n\nIf you use this webapp, [https://app.imow.sithl.com](https://app.imow.stihl.com), this library should work for your mower.\n\nAlso see here: [Issue #13](https://github.com/ChrisHaPunkt/stihl-imow-webapi/issues/13)\n## Getting Started\n\nThese instructions will get you a copy of the project up and running on your local machine for development and testing\npurposes. See deployment for notes on how to deploy the project on a live system.\n\nAPI Documentation is available on: [https://chrishapunkt.github.io/stihl-imow-webapi/imow](https://chrishapunkt.github.io/stihl-imow-webapi/imow)\n\nIf you want to  \n[![\"Buy Me A Coffee\"](\nhttps://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20coffee&emoji=&slug=chrishapunkt&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff)](https://www.buymeacoffee.com/chrishapunkt)\n\n\n### Prerequisites\n\nPython 3.8+ is required to run this application, other than that there are no prerequisites for the project, as the\ndependencies are included in the repository.\n\n### Installing\n\nTo install the library is as simple as cloning the repository and running\n\n```bash\npip install -e .\n```\n\nIt is recommended to create an virtual environment prior to installing this library. Alternatively, you can also install\nthis library via Pip:\n\n```bash\npip install imow-webapi\n```\n\nAnd have fun!\n\n## Usage\n### Python Import and Usage\nImport the module and instantiate the `IMowApi()` constructor with credentials. Afterwards, initiate the `get_token()` method.\nOr place credentials in the `get_token()` method.\n\n```python\nfrom imow.api import IMowApi\nfrom imow.common.actions import IMowActions\nimport asyncio\nimport aiohttp\n\n\nasync def main():\n    async with aiohttp.ClientSession() as session:\n        api = IMowApi(aiohttp_session=session, lang=\"de\")\n        # save token for later use if you want to recreate IMowApi(token=my_token) because the created token is valid for\n        # 30 days\n        token, expire_time = await api.get_token(\"email@account.stihl\", \"supersecret\", return_expire_time=True)\n        \n        print(await api.get_token())\n        \n        mowers = await api.receive_mowers()\n        mower = mowers[0]\n        \n        print(f\"{mower.name} @ {mower.coordinateLatitude},{mower.coordinateLongitude}\")\n        print(f\"Currently: {mower.stateMessage['short']}\")\n        await mower.update_setting(\"gpsProtectionEnabled\", True)\n        \n        print(mower.stateMessage)\n        print(mower.machineState)\n        await mower.intent(IMowActions.TO_DOCKING)\n        print(await mower.update_from_upstream())\n        print(await mower.get_startpoints())\n        \n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n\n```\n```text\nSelection of outputs from above statements:\n> M\u00e4hrlin @ 54.123456,10.12345\n> Currently: Hood blocked\n> {'short': 'Hood blocked', 'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).', 'legacyMessage': 'Abschaltung Automatikmode durch Bumper', 'errorId': '', 'error': False}\n> HOOD_BLOCKED\n> <imow.common.mowerstate.MowerState object at 0x000001B034C245F8>\n```\n\n### Example: Receive startpoints and intent mowing \nSave the following as `myscript.sh` and execute `chmod +x myscript.sh`. Make sure you install the api via `pip3 install imow-webapi`  \nAfterwards you can execute via `./myscript.sh`\n```bash\n#!/usr/bin/env python3\nfrom imow.api import IMowApi\nfrom imow.common.actions import IMowActions\nimport asyncio\nimport aiohttp\nimport logging\n\nlogger = logging.getLogger(\"imow\")\n# Enable DEBUG output\nlogging.basicConfig(level=logging.DEBUG)\n\nasync def main():\n    async with aiohttp.ClientSession() as session:\n        api = IMowApi(aiohttp_session=session, lang=\"de\")\n        # save token for later use if you want to recreate IMowApi(token=my_token) because the created token is valid for\n        # 30 days\n        token, expire_time = await api.get_token(\"email@account.stihl\", \"supersecret\", return_expire_time=True)\n    \n        print(await api.get_token())\n    \n        mowers = await api.receive_mowers()\n        mower = mowers[0]\n    \n        print(f\"{mower.name} @ {mower.coordinateLatitude},{mower.coordinateLongitude}\")\n        print(f\"Currently: {mower.stateMessage['short']}\")\n    \n        startpoints = await mower.get_startpoints()\n        for i in range(len(startpoints)):\n            print(\"Startpoint {}: {}\".format(i, startpoints[i]))\n        \n        # if your mower supports the \"startMowing\" call, use this action (i.e iMow 600 series)\n        await mower.intent(IMowActions.START_MOWING, starttime=\"2023-08-12 20:50\")\n        # await mower.intent(IMowActions.START_MOWING, endtime=\"2023-08-12 22:50\")\n        # await mower.intent(IMowActions.START_MOWING, starttime=\"2023-08-12 20:50\", endtime=\"2023-08-12 22:50\")\n\n        # if your mower supports the \"startMowingFromPoint\" call, use this action (i.e iMow 400 series)\n        await mower.intent(IMowActions.START_MOWING_FROM_POINT, duration=50)\n        # await mower.intent(IMowActions.START_MOWING_FROM_POINT, startpoint=2)\n        # await mower.intent(IMowActions.START_MOWING_FROM_POINT, duration=50, startpoint=2)\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n\n```\n## Testing\nFor unit testing run `pytest -s tests/test_unit*`. For upstream integration testing, provide a `/secrets.py` with the following contents:\n````python\nEMAIL = \"email@account.stihl\"\nPASSWORD = \"supersecret\"\nMOWER_NAME = \"MyRobot\"\n````\nand run `pytest -s tests/test_integration*` or `pytest -s`. \n\n## Built With\n\n* aiohttp\n* BeautifulSoup\n* asyncio\n\n## Versioning\n\nNavigate to [tags on this repository](https://github.com/ChrisHaPunkt/imow-webapi/releases)\nto see all available versions.\n\n## Authors\n\n| Mail Address                | GitHub Profile                                |\n-----------------------------|-----------------------------------------------|\n| chris@homeset.de          | [ChrisHaPunkt](https://github.com/ChrisHaPunkt)     |\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md)\nlicense file for more details.\n\n# Acknowledges\n\nThanks to\n\n* https://github.com/nstrydom2/anonfile-api\n* https://github.com/OpenXbox/xbox-webapi-python\n\nfor repo structure inspiration\n\n\n# Changelog\n\n## Version 0.8.4 (2023-12-09)\n### Fix\n- Loosen the version requirements for dependency libs\n- update the tested python version placed inside setup and PyPi to python 3.12\n\n## Version 0.8.2 (2023-08-26)\n### Fix\n- validation of values in keyword arguments\n### BREAKING CHANGE\nThe iMow action `IMowActions.START_MOWING` now creates a `startMowing` action and no longer a `startMowingFromPoint` action.\nTo issue a `startMowingFromPoint`, the new `IMowAction.START_MOWING_FROM_POINT` needs to be used.\n\n#### Added \n- keywork arguments `starttime` and `endtime` in `IMow.intent()` call to be used with IMowActions.START_MOWING\n- Updated Readme with `IMow.intent` exampes\n- added debug log output in `intent()` call\n\n## Version 0.7.10 (2023-05-13)\n- Bugfix http_session not present on logout\n## Version 0.7.9 (2023-05-13)\n- remove unnecessary http_session closes\n## Version 0.7.8 (2022-03-06)\n- Implement a logout function `ImowAPI.api_logout()`. Use within re-authentication\n## Version 0.7.7 (2022-03-06)\n- Use more `async with`s\n## Version 0.7.6 (2022-03-05)\n\n### Dependency updates\n- Update dependencies to latest\n\n## Version 0.7.4 (2021-09-06)\n\n### Bugfxes\n- Allow handling of timestamps on mower intents (StartTime/Endtime)\n\n## Version 0.7.3 (2021-07-03)\n\n### Bugfxes\n- Always return a MowerState on settings update\n\n## Version 0.7.2 (2021-07-03)\n```python\nawait mower.update_setting(\"gpsProtectionEnabled\", True)\n```\n### Features\n- Possibility to update a specific settings for a mower like gpsProtection on/off\n## Version 0.7.0 (2021-06-30)\n### Breaking Changes\n- `IMowApi.intent` Parameter `mower_action_id` is renamed to `mower_external_id` to match the upstream api expectation.\n### Features\n- If an `api_request` is intended, and the used `access_token` expires in less than one day, it's automatically renewed.\n\n## Version 0.6.0 (2021-06-28)\n- ```python\n  mower.machineError = 'M1120',\n  mower.machineState = 'HOOD_BLOCKED',\n  mower.stateMessage: dict = {\n      'short': 'Hood blocked',\n      'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).',\n      'legacyMessage': 'Abschaltung Automatikmode durch Bumper',\n      'errorId': 'M1120',\n      'error': True\n  }\n  ```\n\n### Breaking Changes\n- Migrated all own MowerState attributes to camelCase to match the upstream attributes style.\n  ```\n  - MowerState.stateMessage = None\n  - MowerState.machineError = None\n  - MowerState.machineState = None\n  ```\n## Version 0.5.2 (2021-06-15)\n\n## Bugfixes\n- Also quote password string in auth request to support more special chars\n\n## Version 0.5.1 (2021-06-13)\n\n## Features\n- ```python\n  mower.machine_error = 'M1120',\n  mower.machine_state = 'HOOD_BLOCKED',\n  mower.state_message: dict = {\n      'short': 'Hood blocked',\n      'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).',\n      'legacyMessage': 'Abschaltung Automatikmode durch Bumper',\n      'errorId': 'M1120',\n      'error': True\n  }\n  ```\n  Provide a machine usable string from the short message in english\n\n## Version 0.5.0 (2021-06-12)\n\n### Breaking Changes\n\n- The ``MowerTask`` class is removed in favor of the new ``state_message`` property on th ``MowerState`` object.\n- The ``MowerState.get_current_task()`` method now returns the `short` property of the state message instead of a ``MowerTask``\n  property and is now longer an ``async`` method.\n\n### Features\n\n- ```python\n  mower.state_message -> dict\n  {\n      'short': 'Hood blocked',\n      'long': 'The hood is blocked. Please check the hood and press the OK button on your machine (M1120).',\n      'errorId': 'M1120',\n      'error': True\n  }\n  ```\n  The MowerState Class now provides a ```state_message``` property which gives a ``short`` and``long`` text for\n  description (Besides an error indication and errorId). All error and status codes are now dynamically matched and\n  human readable available.\n  **This makes the ``MowerTask`` obsolete and it is removed with this release.**\n- ``api = IMowApi(lang=\"en\")``\n  The imow api can now be instanced with a language code (fallback to ``en``).\n  The ``state_message`` property displays the messages in the corresponding language.\n\n## Version 0.4.5 (2021-06-01)\n\n### Features\n\n- Add 2 new identified Tasks within `MowerTask` (Thanks to @lausser)\n- Add `check_api_maintenance()` method to `IMowAPI` Class. Check if the api server is currently under maintenance.\n  This method is automatically called if the api server returns a 500 error response for any request.\n- One should call the new `close()` method for the `IMowAPI` Class when finishing the api interactions to correctly\n  close the http session.\n\n### Bugfixes\n\n- [Issue #8](https://github.com/ChrisHaPunkt/stihl-imow-webapi/issues/8) - Example not working\n\n## Version 0.4.4 (2021-05-28)\n\n### Features\n\n- Add `validate_token()` method to `IMowAPI` Class. Test if a token is valid and is able to call the webapi.\n\n## Version 0.4.3 (2021-05-27)\n\n### Features\n\n- Allow `IMowAPI` Class to use predefined `aiohttp` session when instantiating\n\n## Version 0.4.1 (2021-05-24)\n\n### Changes\n\n- Even more asynchronously with switch from `requests` to `aiohttp`\n\n## Version 0.4.0 (2021-05-17)\n\n### Breaking Changes\n\n- Reworked everything to use asyncio where possible. See Readme.md for new usage example.\n- Renamed MowerState method `update` to `update_from_upstream`\n- Renamed MowerState method `get_status` to `get_current_status`\n\n## Version 0.3.0 (2021-05-17)\n\n### Breaking Changes\n\n- Renamed Class/Enum `MowerState` to `MowerTask` because it describes the current task not the state\n- Renamed Class `Mower` to `MowerState` because it's just a snapshot of the last upstream state\n\n### Features\n\n- Add methods to work on `MowerState` objects, like action intents or statistic receive\n- Add PDoc documents, available\n  on [https://chrishapunkt.github.io/stihl-imow-webapi/imow](https://chrishapunkt.github.io/stihl-imow-webapi/imow)\n\n### Bugfixes\n\n- Return a valid error message and raise if provided login credentials are wrong\n\n## Version 0.2.2 (2021-05-00)\n\n- Initial release\n",
    "bugtrack_url": null,
    "license": "GPL",
    "summary": "A library to authenticate and interact with STIHL iMow mowers using their WebAPI",
    "version": "0.8.4",
    "project_urls": {
        "Homepage": "https://github.com/ChrisHaPunkt/stihl-imow-webapi"
    },
    "split_keywords": [
        "stihl",
        "imow",
        "mower",
        "api"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d74f2cc68c7bfa979a5ddfec9c00853058e51559c26094dd371e1b367f0b9afd",
                "md5": "fc8fb8e21c38db6409f860c3ea6e3bd8",
                "sha256": "404c82730317aca9fc7ece7d316ab2ae36511b0af2538e27ed3cd9f191d93919"
            },
            "downloads": -1,
            "filename": "imow_webapi-0.8.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "fc8fb8e21c38db6409f860c3ea6e3bd8",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 22561,
            "upload_time": "2023-12-09T16:22:06",
            "upload_time_iso_8601": "2023-12-09T16:22:06.893585Z",
            "url": "https://files.pythonhosted.org/packages/d7/4f/2cc68c7bfa979a5ddfec9c00853058e51559c26094dd371e1b367f0b9afd/imow_webapi-0.8.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c7ee57190917ef291b965811821ef0149b49216b461878299e293ee1c51971fb",
                "md5": "bfbf3ddb54a016ffe5c81049e4217e9a",
                "sha256": "d92c68d3e4329268f673a40708b968d4a0453ec93925ab4e7e9d1e4c0dafa1d6"
            },
            "downloads": -1,
            "filename": "imow-webapi-0.8.4.tar.gz",
            "has_sig": false,
            "md5_digest": "bfbf3ddb54a016ffe5c81049e4217e9a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 27049,
            "upload_time": "2023-12-09T16:22:08",
            "upload_time_iso_8601": "2023-12-09T16:22:08.464115Z",
            "url": "https://files.pythonhosted.org/packages/c7/ee/57190917ef291b965811821ef0149b49216b461878299e293ee1c51971fb/imow-webapi-0.8.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-09 16:22:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "ChrisHaPunkt",
    "github_project": "stihl-imow-webapi",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "imow-webapi"
}
        
Elapsed time: 0.32161s