Skip to main content

Simple fetcher for NYC 311 trash collection, school closing, and alternate side parking schedules. Built to drive a Home Assistant add-in.

Project description

nyc311calendar

Python library for asynchronously fetching data for NYC school closures, trash collection holidays, and alternate side parking suspensions.


GitHub

Uses the NYC 311 Public API. Built to drive the Home Assistant NYC 311 Public Services Calendar add-in.

Warning

This is an alpha release. Expect breaking changes.

I take no responsibility for parking tickets, overflowing trash cans, kids stranded at bus stops or missing exams, etc. 🤷🏼‍♂️

Use at your own risk.

Usage

First, install via pip

pip install nyc311calendar

Then, get an API key

An NYC API Portal developer account is required to use this library.

  1. Sign up at https://api-portal.nyc.gov/signup/.
  2. Log in, then subscribe to the "NYC 311 Public Developers" product at https://api-portal.nyc.gov/products?api=nyc-311-public-api. This subscription unlocks the calendar product.
  3. Get your API key at https://api-portal.nyc.gov/developer. Either key (primary/secondary) will work.

Finally, get data

# Import modules
from nyc311calendar import CalendarType, NYC311API

# Instantiate class
calendar = NYC311API(session, API_KEY)

# Fetch calendar
resp = await calendar.get_calendar()

There's more to this. You'll need to provide an aiohttp ClientSession object. See the examples folder for guidance.

Constants

This library converts strings in the source API to constants wherever sensible and uses these constants everywhere (even as dictionary keys). That is, "status": "CLOSED" in the source API is represented as 'status_id': <Status.CLOSED: 7>} in this library, where Status is an enum in the CivCalNYC class.

Constants are defined for:

  1. Public services in services.ServiceType.
  2. Service statuses in services.StandardizedStatusTypes. The source API is a mess of poorly named statuses. The StandardizedStatusTypes attempts to make sense of the underlying statuses.
  3. Calendar types in CalendarType. See below for more info on calendar types.

Calendar Day Entries

Data for each calendar day is returned in a CalendarDayEntry dataclass.

Calendar Types

nyc311calendar can return data in several formats, each defined in the CalendarType enum:

Quarter Ahead

The Quarter Ahead calendar type returns all statuses for all services for 90 days starting on the day before the API request was made. The response dict has two sub-dicts keyed by calendar date and service. This is essentially a constant-ized dump from the source API. The example below is truncated to save space, showing two of 90 days.

async with aiohttp.ClientSession() as session:
    calendar = NYC311API(session, API_KEY)
    resp = await calendar.get_calendar(
        calendars=[CalendarType.QUARTER_AHEAD], scrub=True
    )
{
    <CalendarType.QUARTER_AHEAD: 1>: {
        <GroupBy.DATE: "date">: {
            datetime.date(2021, 12, 31): {
                <ServiceType.PARKING: "Alternate Side Parking">: CalendarDayEntry(...),
                <ServiceType.SCHOOL: "Schools">: CalendarDayEntry(...),
                <ServiceType.SANITATION: "Collections">: CalendarDayEntry(...)
            },
            datetime.date(2022, 1, 1): {
                <ServiceType.PARKING: "Alternate Side Parking">: CalendarDayEntry(...),
                <ServiceType.SCHOOL: "Schools">: CalendarDayEntry(...),
                <ServiceType.SANITATION: "Collections">: CalendarDayEntry(...)
            }
        },
        <GroupBy.SERVICE: "service">: {
            <ServiceType.PARKING: "Alternate Side Parking">: {
                datetime.date(2021, 12, 31): CalendarDayEntry(...),
                datetime.date(2022, 1, 1): CalendarDayEntry(...)
            },
            <ServiceType.SCHOOL: "Schools">: {
                datetime.date(2021, 12, 31): CalendarDayEntry(...),
                datetime.date(2022, 1, 1): CalendarDayEntry(...)
            },
            <ServiceType.SANITATION: "Collections">: {
                datetime.date(2021, 12, 31): CalendarDayEntry(...),
                datetime.date(2022, 1, 1): CalendarDayEntry(...)
            }
        }
    }
}

Week Ahead

The Week Ahead calendar type returns all statuses for all services for 8 days starting on the day before the API request was made. The response dict is keyed by number of days relative to today. This is useful for showing a calendar of the week ahead (and yesterday, just in case you forgot to move your car). The example below is truncated to save space, showing three of 90 days.

async with aiohttp.ClientSession() as session:
    calendar = NYC311API(session, API_KEY)
    resp = await calendar.get_calendar(
        calendars=[CalendarType.WEEK_AHEAD], scrub=True
    )
{
    <CalendarTypes.WEEK_AHEAD: 2>: {
        -1: {
            'date': datetime.date(2021, 12, 23),
            'services': {
                <ServiceType.PARKING: "Alternate Side Parking">: CalendarDayEntry(...),
                <ServiceType.SCHOOL: "Schools">: CalendarDayEntry(...),
                <ServiceType.SANITATION: "Collections">: CalendarDayEntry(...)
        },
        0: {
            'date': datetime.date(2021, 12, 24),
            'services': {
                <ServiceType.PARKING: "Alternate Side Parking">: CalendarDayEntry(...),
                <ServiceType.SCHOOL: "Schools">: CalendarDayEntry(...),
                <ServiceType.SANITATION: "Collections">: CalendarDayEntry(...)
        },
        1: {
            'date': datetime.date(2021, 12, 25),
            'services': {
                <ServiceType.PARKING: "Alternate Side Parking">: CalendarDayEntry(...),
                <ServiceType.SCHOOL: "Schools">: CalendarDayEntry(...),
                <ServiceType.SANITATION: "Collections">: CalendarDayEntry(...)
        }
    }
}

Next Exceptions

The Next Exceptions calendar type returns the next date on which there is a service exception for either of the three covered services. The response dict is keyed by service type. This is useful when you're not interested in normal operations and only want to know, say, when the next school closure is. The example below shows the full response.

Note that exceptions include things like holidays, snow days, half days, and winter break.

async with aiohttp.ClientSession() as session:
    calendar = NYC311API(session, API_KEY)
    resp = await calendar.get_calendar(
        calendars=[CalendarType.NEXT_EXCEPTIONS], scrub=True
    )
{
    <CalendarTypes.NEXT_EXCEPTIONS: 3>: {
        <ServiceType.PARKING: "Alternate Side Parking">: CalendarDayEntry(...),
        <ServiceType.SCHOOL: "Schools">: CalendarDayEntry(...),
        <ServiceType.SANITATION: "Collections">: CalendarDayEntry(...)
    }
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nyc311calendar-0.4.1.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

nyc311calendar-0.4.1-py3-none-any.whl (11.5 kB view details)

Uploaded Python 3

File details

Details for the file nyc311calendar-0.4.1.tar.gz.

File metadata

  • Download URL: nyc311calendar-0.4.1.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for nyc311calendar-0.4.1.tar.gz
Algorithm Hash digest
SHA256 a9cfa2ca893124f314e7449f87ee72e0215ad93691d5701d5cf7469d2405250b
MD5 08ff4a603dc610edea65fd46a6e93f52
BLAKE2b-256 5db2cd884aa56e77e08df3897409b2a44017f763c49ff4fb27c1c38f92f69bb5

See more details on using hashes here.

File details

Details for the file nyc311calendar-0.4.1-py3-none-any.whl.

File metadata

File hashes

Hashes for nyc311calendar-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ca8173e6721297a0bd340241c4cf1fbaf67766325d9127841e5a1a41446902a2
MD5 41472c69f80d3cea3ee78422a2e99148
BLAKE2b-256 a98a27eb5012aca3faee41fad112dea6d3ab88d680da959316c3dd3315705de0

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page