Skip to content

jadenv/petsafe-api

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

114 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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:

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

import petsafe as sf


# replace with your email address
client = sf.PetSafeClient(email="[email protected]")
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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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)

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import asyncio

import petsafe as sf


async def main() -> None:
    client = sf.PetSafeClient(
        email="[email protected]",
        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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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

import petsafe as sf

client = sf.PetSafeClient(email="[email protected]",
                       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!

About

Connect and control a PetSafe devices using the PetSafe API.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Python 99.0%
  • Shell 1.0%