Skip to main content

Library built for Home Assistant to integrate with the City of Toronto MyWaterToronto service

Project description

🌤️ Python Wrapper for MyWaterToronto REST API

Latest PyPI version Supported Python

This module communicates with the City of Toronto MyWaterToronto service.

The module is primarily written for the purpose of being used in Home Assistant for the Custom Integration called mywatertoronto .

This API will read the account information and obtain a list of address(es) and meter(s).

Consumption data incude

Unfortunately, the City of Toronto only appears to be pulling meter data every 1-2 days.

Install

pymywatertoronto is avaible on PyPi:

pip install pymywatertoronto

Consumption Buckets

This library will provide the following consumption buckets

  • Total usage
  • Today usage
  • Week-to-date usage
  • Month-to-date usage
  • Year-to-date usage

Usage

This library is primarily designed to be used in Home Assistant.

The main interface for the library is the pymywatertoronto.MyWaterToronto. This interface takes 6 options:

  • session: (required) An existing aiohttp.ClientSession.
  • account_number: (required) Enter your Account No. found on the utility bill.
  • client_number: (required) Enter your Client No. found on the utility bill.
  • last_name: (required) Enter your Last Name - must match the first last name on the utility bill.
  • postal_code: (required) Enter your Postal Code - must match the postal code on the utility bill.
  • last_payment_method: (required) use the enumerations from const.LastPaymentMethod.
import asyncio

from datetime import timedelta
from aiohttp import ClientSession
import logging

from pymywatertoronto.mywatertoronto import (
    MyWaterToronto, 
)
from pymywatertoronto.const import (
    KEY_ADDRESS,
    KEY_METER_FIRST_READ_DATE,
    KEY_METER_LIST,
    KEY_METER_NUMBER,
    KEY_PREMISE_ID,
    KEY_PREMISE_LIST, 
)
from pymywatertoronto.enums import (
    ConsumptionBuckets,
    LastPaymentMethod, 
)
from pymywatertoronto.errors import (
    AccountDetailsError,
    ApiError,
    ValidateAccountInfoError,
)

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("debug.log",mode='w'),
        logging.StreamHandler()
    ]
)

# Update this section with your City of Toronto Utility account information
account_number="000000000"
client_number="000000000=00"
last_name="lastname"
postal_code="x1x_1x1"
last_payment_method=LastPaymentMethod.BANK_PAYMENT

async def main():
    session = ClientSession()

    mywatertoronto = MyWaterToronto(session,
                                    account_number, 
                                    client_number, 
                                    last_name, 
                                    postal_code, 
                                    last_payment_method )

    try:
        await mywatertoronto.async_validate_account()
    except ( ValidateAccountInfoError, ApiError ) as err:
        logging.debug(f"Error validating account with MyWaterToronto API: {err}")

    try:
        account_details = await mywatertoronto.async_get_account_details()
    except ( AccountDetailsError, ApiError ) as err:
        logging.debug(f"Error getting account details from MyWaterToronto API: {err}")

    try:
        consumption_data = await mywatertoronto.async_get_consumption()
    except ( ApiError ) as err:
        logging.debug(f"Error getting water consumption data from MyWaterToronto API: {err}")

    for premise in account_details[KEY_PREMISE_LIST]:
        premise_id = premise[KEY_PREMISE_ID]
        premise_address = premise[KEY_ADDRESS]
        logging.debug('Premise Address: %s', premise_address)  # noqa: WPS323

        meter_list = premise[KEY_METER_LIST]
        for meter in meter_list:
            meter_number = meter[KEY_METER_NUMBER]
            meter_name = f"{premise_address} {meter_number}"
            logging.debug('Meter Name: %s', meter_name)  # noqa: WPS323

            data = consumption_data[KEY_PREMISE_LIST][premise_id][KEY_METER_LIST][meter_number]
            firstReadDate = data[KEY_METER_FIRST_READ_DATE]
            logging.debug('First Read Date: %s', firstReadDate)  # noqa: WPS323

            for bucket in ConsumptionBuckets:
                consumption = data['consumption_data'][bucket.value]['consumption']
                unit = data['consumption_data'][bucket.value]['unit_of_measure']
                logging.debug('%s: %s %s', bucket.value, consumption, unit)  # noqa: WPS323

    await session.close()

asyncio.run(main())

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

pymywatertoronto-1.0.0.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

pymywatertoronto-1.0.0-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file pymywatertoronto-1.0.0.tar.gz.

File metadata

  • Download URL: pymywatertoronto-1.0.0.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.4

File hashes

Hashes for pymywatertoronto-1.0.0.tar.gz
Algorithm Hash digest
SHA256 e8bd21b4a8ed6836fc28f009655782598d2c90b6986672275603b7949371cc61
MD5 c29a4bface22bf4b6788d21008804bd1
BLAKE2b-256 857ff40a94826eb0ed928f295c7ab383e5ae47d9c2adcbf8d2458dd2893bc090

See more details on using hashes here.

File details

Details for the file pymywatertoronto-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pymywatertoronto-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4fa1122ab9c9647b97442a8fba2c9b15b3ce049dcdf57915891ae0bec8f608be
MD5 ea555565c818d95ab966ba4d7557e314
BLAKE2b-256 fcd6c3185c9f09ccf463059a28af26aed9a47bd7d0c8837d56628ba68c6d6fb3

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