Metadata-Version: 2.4
Name: pysifely
Version: 0.1.0
Summary: Async Python client for the Sifely Smart Lock Cloud API
Project-URL: Homepage, https://github.com/sifely/pysifely
Project-URL: Bug Tracker, https://github.com/sifely/pysifely/issues
License: MIT
Keywords: aiohttp,async,iot,sifely,smart lock
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Home Automation
Requires-Python: >=3.11
Requires-Dist: aiohttp>=3.9
Description-Content-Type: text/markdown

# pysifely

Async Python client for the [Sifely](https://www.sifely.com) Smart Lock Cloud API.

## Installation

```bash
pip install pysifely
```

## Quick start

```python
import asyncio
import aiohttp
from pysifely import SifelyApiClient, DEFAULT_BASE_URL

async def main():
    async with aiohttp.ClientSession() as session:
        # Login
        creds = await SifelyApiClient.login(
            base_url=DEFAULT_BASE_URL,
            username="your@email.com",
            password_md5=SifelyApiClient.md5_password("yourpassword"),
            client_id="home_assistant",
            session=session,
        )

        client = SifelyApiClient(
            base_url=DEFAULT_BASE_URL,
            access_token=creds["access_token"],
            session=session,
            refresh_token=creds["refresh_token"],
        )

        locks = await client.get_locks()
        for lock in locks:
            print(lock["lockId"], lock.get("lockAlias"))

asyncio.run(main())
```

## API reference

### `SifelyApiClient`

| Method | Description |
|---|---|
| `login(base_url, username, password_md5, client_id, session)` | Classmethod — authenticate and return tokens |
| `get_locks()` | List all locks on the account |
| `get_lock_detail(lock_id)` | Detailed info (firmware, battery, …) |
| `get_lock_state(lock_id)` | Current open/closed state |
| `unlock(lock_id)` | Remote unlock |
| `lock(lock_id)` | Remote lock |
| `list_passcodes(lock_id)` | List keyboard passcodes |
| `add_passcode(lock_id, ...)` | Add a passcode |
| `delete_passcode(lock_id, keyboard_pwd_id)` | Delete a passcode |

### Exceptions

- `SifelyApiError` — general API error
- `SifelyAuthError(SifelyApiError)` — authentication failure (bad credentials or expired token)

## License

MIT
