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.
This repository is now named petsafe-api and the published package name is petsafe-api on PyPI.
Import paths are unchanged: continue using
import petsafeandpython -m petsafe.
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.
pip install petsafe-api
If installing from source code,
python setup.py install
You must use tokens to interact with the PetSafe Smart-Feed API.
There are two methods to retrieve tokens:
- Execute
python -m petsafe [email_address]to request an email code. - Check your email for an email code from PetSafe.
- Enter your code to generate tokens.
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)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)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)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)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.")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())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)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())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()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)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()All contributions are welcome. Please, feel free to create a pull request!