{"id":13585288,"url":"https://github.com/bachya/aioflo","last_synced_at":"2025-07-31T22:09:42.332Z","repository":{"id":40573691,"uuid":"234350072","full_name":"bachya/aioflo","owner":"bachya","description":"A Python3, async-friendly library for Flo by Moen Smart Water Detectors","archived":false,"fork":false,"pushed_at":"2023-08-22T21:30:50.000Z","size":110,"stargazers_count":16,"open_issues_count":1,"forks_count":3,"subscribers_count":5,"default_branch":"dev","last_synced_at":"2024-12-10T08:42:29.358Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bachya.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-16T15:26:44.000Z","updated_at":"2023-11-28T17:18:28.000Z","dependencies_parsed_at":"2024-06-20T22:09:17.966Z","dependency_job_id":null,"html_url":"https://github.com/bachya/aioflo","commit_stats":{"total_commits":109,"total_committers":7,"mean_commits":"15.571428571428571","dds":"0.19266055045871555","last_synced_commit":"30e7862306ce8e433f53e62b161e209955708e59"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bachya%2Faioflo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bachya%2Faioflo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bachya%2Faioflo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bachya%2Faioflo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bachya","download_url":"https://codeload.github.com/bachya/aioflo/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230511478,"owners_count":18237657,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T15:04:51.157Z","updated_at":"2024-12-19T23:13:56.029Z","avatar_url":"https://github.com/bachya.png","language":"Python","funding_links":["https://www.buymeacoffee.com/bachya1208P"],"categories":["Python"],"sub_categories":[],"readme":"# 💧 aioflo: a Python3, asyncio-friendly library for Flo Smart Water Detectors\n\n[![CI](https://github.com/bachya/aioflo/workflows/CI/badge.svg)](https://github.com/bachya/aioflo/actions)\n[![PyPi](https://img.shields.io/pypi/v/aioflo.svg)](https://pypi.python.org/pypi/aioflo)\n[![Version](https://img.shields.io/pypi/pyversions/aioflo.svg)](https://pypi.python.org/pypi/aioflo)\n[![License](https://img.shields.io/pypi/l/aioflo.svg)](https://github.com/bachya/aioflo/blob/main/LICENSE)\n[![Code Coverage](https://codecov.io/gh/bachya/aioflo/branch/dev/graph/badge.svg)](https://codecov.io/gh/bachya/aioflo)\n[![Maintainability](https://api.codeclimate.com/v1/badges/1b6949e0c97708925315/maintainability)](https://codeclimate.com/github/bachya/aioflo/maintainability)\n[![Say Thanks](https://img.shields.io/badge/SayThanks-!-1EAEDB.svg)](https://saythanks.io/to/bachya)\n\n\u003ca href=\"https://www.buymeacoffee.com/bachya1208P\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/default-orange.png\" alt=\"Buy Me A Coffee\" height=\"41\" width=\"174\"\u003e\u003c/a\u003e\n\n`aioflo` is a Python 3, `asyncio`-friendly library for interacting with\n[Flo by Moen Smart Water Detectors](https://www.moen.com/flo).\n\n# Python Versions\n\n`aioflo` is currently supported on:\n\n* Python 3.9\n* Python 3.10\n* Python 3.11\n\n# Installation\n\n```python\npip install aioflo\n```\n\n# Usage\n\n```python\nimport asyncio\n\nfrom aiohttp import ClientSession\n\nfrom aioflo import async_get_api\n\n\nasync def main() -\u003e None:\n    \"\"\"Run!\"\"\"\n    api = await async_get_api(\"\u003cEMAIL\u003e\", \"\u003cPASSWORD\u003e\")\n\n    # Get user account information:\n    user_info = await api.user.get_info()\n    a_location_id = user_info[\"locations\"][0][\"id\"]\n\n    # Get location (i.e., device) information:\n    location_info = await api.location.get_info(a_location_id)\n\n    # Get device information\n    first_device_id = location_info[\"devices\"][0][\"id\"]\n    device_info = await api.device.get_info(first_device_id)\n\n    # Run a health test\n    health_test_response = await api.device.run_health_test(first_device_id)\n\n    # Close the shutoff valve\n    close_valve_response = await api.device.close_valve(first_device_id)\n\n    # Open the shutoff valve\n    open_valve_response = await api.device.open_valve(first_device_id)\n\n    # Get consumption info between a start and end datetime:\n    consumption_info = await api.water.get_consumption_info(\n        a_location_id,\n        datetime(2020, 1, 16, 0, 0),\n        datetime(2020, 1, 16, 23, 59, 59, 999000),\n    )\n\n    # Get various other metrics related to water usage:\n    metrics = await api.water.get_metrics(\n        \"\u003cDEVICE_MAC_ADDRESS\u003e\",\n        datetime(2020, 1, 16, 0, 0),\n        datetime(2020, 1, 16, 23, 59, 59, 999000),\n    )\n\n    # Set the device in \"Away\" mode:\n    await set_mode_away(a_location_id)\n\n    # Set the device in \"Home\" mode:\n    await set_mode_home(a_location_id)\n\n    # Set the device in \"Sleep\" mode for 120 minutes, then return to \"Away\" mode:\n    await set_mode_sleep(a_location_id, 120, \"away\")\n\n\nasyncio.run(main())\n```\n\nBy default, the library creates a new connection to Flo with each coroutine. If you are\ncalling a large number of coroutines (or merely want to squeeze out every second of\nruntime savings possible), an\n[`aiohttp`](https://github.com/aio-libs/aiohttp) `ClientSession` can be used for connection\npooling:\n\n```python\nimport asyncio\n\nfrom aiohttp import ClientSession\n\nfrom aioflo import async_get_api\n\n\nasync def main() -\u003e None:\n    \"\"\"Create the aiohttp session and run the example.\"\"\"\n    async with ClientSession() as websession:\n        api = await async_get_api(\"\u003cEMAIL\u003e\", \"\u003cPASSWORD\u003e\", session=session)\n\n        # Tell Flo to get updated data from the device\n        ping_response = await api.presence.ping()\n\n        # Get user account information:\n        user_info = await api.user.get_info()\n        a_location_id = user_info[\"locations\"][0][\"id\"]\n\n        # Get location (i.e., device) information:\n        location_info = await api.location.get_info(a_location_id)\n\n        # Get device information\n        first_device_id = location_info[\"devices\"][0][\"id\"]\n        device_info = await api.device.get_info(first_device_id)\n\n        # Run a health test\n        health_test_response = await api.device.run_health_test(first_device_id)\n\n        # Close the shutoff valve\n        close_valve_response = await api.device.close_valve(first_device_id)\n\n        # Open the shutoff valve\n        open_valve_response = await api.device.open_valve(first_device_id)\n\n        # Get consumption info between a start and end datetime:\n        consumption_info = await api.water.get_consumption_info(\n            a_location_id,\n            datetime(2020, 1, 16, 0, 0),\n            datetime(2020, 1, 16, 23, 59, 59, 999000),\n        )\n\n        # Get various other metrics related to water usage:\n        metrics = await api.water.get_metrics(\n            \"\u003cDEVICE_MAC_ADDRESS\u003e\",\n            datetime(2020, 1, 16, 0, 0),\n            datetime(2020, 1, 16, 23, 59, 59, 999000),\n        )\n\n        # Set the device in \"Away\" mode:\n        await set_mode_away(a_location_id)\n\n        # Set the device in \"Home\" mode:\n        await set_mode_home(a_location_id)\n\n        # Set the device in \"Sleep\" mode for 120 minutes, then return to \"Away\" mode:\n        await set_mode_sleep(a_location_id, 120, \"away\")\n\n\nasyncio.run(main())\n```\n\n# Contributing\n\n1. [Check for open features/bugs](https://github.com/bachya/aioflo/issues)\n  or [initiate a discussion on one](https://github.com/bachya/aioflo/issues/new).\n2. [Fork the repository](https://github.com/bachya/aioflo/fork).\n3. (_optional, but highly recommended_) Create a virtual environment: `python3 -m venv .venv`\n4. (_optional, but highly recommended_) Enter the virtual environment: `source ./.venv/bin/activate`\n5. Install the dev environment: `script/setup`\n6. Code your new feature or bug fix.\n7. Write tests that cover your new functionality.\n8. Run tests and ensure 100% code coverage: `script/test`\n9. Update `README.md` with any new documentation.\n10. Add yourself to `AUTHORS.md`.\n11. Submit a pull request!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbachya%2Faioflo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbachya%2Faioflo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbachya%2Faioflo/lists"}