Metadata-Version: 2.4
Name: petsafe-api
Version: 3.0.1
Summary: Provides ability to connect and control a PetSafe Smart Feed, Scoopfree, and Smart Door devices using the PetSafe API.
Home-page: https://github.com/ThomasHFWright/petsafe-api
Author: Jordan Stremming & Dominick Meglio & Thomas Wright
Author-email: thomas.h.f.wright@gmail.com
License: MIT
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: httpx
Requires-Dist: botocore
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# petsafe-api
Connect and control PetSafe Smart Feed, ScoopFree, and Smart Door devices using the PetSafe API.

> **BREAKING CHANGE:** Version 2.0 uses the new PetSafe API.
> You will need to request new tokens.

> PetSafe will lock your account if you request data more often than once per 5 minutes.

## Project rename
This repository is now named **petsafe-api** and the published package name is **petsafe-api** on PyPI.

> Import paths are unchanged: continue using `import petsafe` and `python -m petsafe`.

## Acknowledgements
This project builds on the excellent prior work from the original developers:
- https://github.com/Techzune/petsafe_smartfeed
- https://github.com/dcmeglio/petsafe

Thank you to both projects for building the API integrations for existing feeder and ScoopFree functionality. This repository includes all of that previous work, with Smart Door API support added on top.

## Installation
`pip install petsafe-api`

If installing from source code,
`python setup.py install`

## Login tokens
You **must** use tokens to interact with the PetSafe Smart-Feed API.  
There are two methods to retrieve tokens:

#### Get tokens using command line
1. Execute `python -m petsafe [email_address]` to request an email code.
2. Check your email for an email code from PetSafe.
3. Enter your code to generate tokens.

#### Get tokens using Python
```python
import petsafe as sf


# replace with your email address
client = sf.PetSafeClient(email="email@example.com")
client.request_code()

# check your email for a code
code = input("Enter email code: ")
token = client.request_tokens_from_code(code)

print("email:", client.email)
print("id_token:", client.id_token)
print("refresh_token:", client.refresh_token)
print("access_token:", client.access_token)
```


## Example usage
#### List feeders

```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_feeders(client)

# print all feeders
for device in devices:
    print(device)

```
#### Feed 1/8 cup at normal speed
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_feeders(client)

# get the first feeder
feeder = devices[0]
feeder.feed(amount=1, slow_feed=False)

```
#### Get current battery level (0 - 100)
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_feeders(client)

# get the first feeder
feeder = devices[0]
print(feeder.battery_level)

```
#### Get current food level
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_feeders(client)

# get the first feeder
feeder = devices[0]
status = feeder.food_low_status

if status == 0:
    print("Feeder has food.")
elif status == 1:
    print("Feeder is low on food.")
elif status == 2:
    print("Feeder is out of food.")

```

## SmartDoor controls
```python
import asyncio

import petsafe as sf


async def main() -> None:
    client = sf.PetSafeClient(
        email="email@example.com",
        id_token="YOUR_ID_TOKEN",
        refresh_token="YOUR_REFRESH_TOKEN",
        access_token="YOUR_ACCESS_TOKEN",
    )

    doors = await client.get_smartdoors()
    door = doors[0]

    # Manually lock the door and refresh its reported state
    await door.lock()

    # Switch back to Smart mode without forcing a refresh
    await door.smart_mode(update_data=False)

    # Or use the client helpers that return the updated door instance
    updated = await client.manual_unlock_smartdoor(door.api_name)
    print(updated.mode)


asyncio.run(main())
```

# get litterboxes
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_litterboxes(client)

# print all litterboxes
for device in devices:
    print(device)

```

# get litterbox activity
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_litterboxes(client)

litterbox = devices[0]
print(litterbox.get_schedule())

```

# rake the litterbox
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_litterboxes(client)

litterbox = devices[0]
litterbox.rake()

```

# modify the litterbox rake timer
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_litterboxes(client)

litterbox = devices[0]
litterbox.modify_timer(15)

```

# reset the litterbox rake count
```python
import petsafe as sf

client = sf.PetSafeClient(email="email@example.com",
                       id_token="YOUR_ID_TOKEN",
                       refresh_token="YOUR_REFRESH_TOKEN",
                       access_token="YOUR_ACCESS_TOKEN")
devices = sf.devices.get_litterboxes(client)

litterbox = devices[0]
litterbox.reset()

```

## Contributing
All contributions are welcome. 
Please, feel free to create a pull request!
