%global _empty_manifest_terminate_build 0 Name: python-pyrituals Version: 0.0.6 Release: 1 Summary: Async Python wrapper for the Rituals Perfume Genie API License: GPLv3 URL: https://github.com/milanmeu/pyrituals Source0: https://mirrors.aliyun.com/pypi/web/packages/8d/97/1364136ac7b9668f28def833beffcdbf1cee6adf9bc827934cf941fb3ebf/pyrituals-0.0.6.tar.gz BuildArch: noarch Requires: python3-aiohttp %description # PyRituals package [![PyPI](https://img.shields.io/pypi/v/pyrituals)](https://pypi.org/project/pyrituals/) ![PyPI - Downloads](https://img.shields.io/pypi/dm/pyrituals) [![PyPI - License](https://img.shields.io/pypi/l/pyrituals?color=blue)](https://github.com/milanmeu/pyrituals/blob/main/LICENSE) An async Python wrapper for the Rituals Perfume Genie API. It allows you to control the diffuser and retrieve its state. The package supports the first and second version. ## Installation ```bash pip install pyrituals ``` ## Usage ### Import ```python from pyrituals import Account, Diffuser, AuthenticationException ``` ### Create a `aiohttp.ClientSession` to make requests ```python from aiohttp import ClientSession session = ClientSession() ``` ### Endpoints Default endpoints: ```python AUTH_URL = "https://rituals.sense-company.com/ocapi/login" # Account.authenticate() ACCOUNT_URL = "https://rituals.sense-company.com/api/account/hubs" # Account.get_devices() HUB_URL = "https://rituals.sense-company.com/api/account/hub" # Diffuser.update_data() UPDATE_URL = "https://rituals.sense-company.com/api/hub/update/attr" # Diffuser.turn_*(), Diffuser.set_*() ``` To change the used API endpoints add an `url` parameter to the function. Example: ```python LOGIN_URL = "https://rituals.sense-company.com/ocapi/login" account = Account("name@example.com", "passw0rd", session) await account.authenticate(url=LOGIN_URL) ``` ### Account #### Create an instance ```python email = "name@example.com" password = "passw0rd" account = Account(email, password, session) ``` #### Authenticate ```python try: await account.authenticate() except AuthenticationException as e: print("Could not authenticate:", e) ``` #### Account data The account data is only available after authentication. ```python account.data ``` #### Get linked devices `get_devices()` returns a list of `Diffuser`s. ```python devices = await account.get_devices() ``` ### Diffuser #### Diffuser data The initial data and format is different from the data after executing `update_data()`. Some properties require data that is only available after executing `update_data()`. Therefore, it's required to execute `update_data()` before using the diffuser properties. ```python diffuser.data diffuser.battery_percentage diffuser.charging diffuser.has_battery diffuser.has_cartridge diffuser.hash diffuser.hub_data diffuser.hublot diffuser.fill diffuser.perfume diffuser.perfume_amount diffuser.room_size diffuser.is_on diffuser.is_online diffuser.name diffuser.version diffuser.wifi_percentage diffuser.room_size_square_meter ``` #### Get updated data ```python await diffuser.update_data() ``` #### Turn the diffuser on ```python await diffuser.turn_on() ``` #### Turn the diffuser off ```python await diffuser.turn_off() ``` #### Set the diffuser perfume amount Amount must be an integer between 1 and 3, inclusive. ```python amount = 1 await diffuser.set_perfume_amount(amount) ``` #### Set the diffuser room size Size must be an integer between 1 and 4, inclusive. ```python size = 2 await diffuser.set_room_size(size) ``` #### Set the diffuser room size in square meters Size must be the integer 15, 30, 60 or 100. ```python size = 60 await diffuser.set_room_size_square_meter(size) ``` ## Example ```python from aiohttp import ClientSession from asyncio import run import pyrituals async def main(): async with ClientSession() as session: account = pyrituals.Account("name@example.com", "passw0rd", session) try: await account.authenticate() except pyrituals.AuthenticationException as ex: print("Could not authenticate:", ex) return print("Account data:", account.data) devices = await account.get_devices() for diffuser in devices: print("Diffuser data:", diffuser.data) await diffuser.turn_on() await diffuser.set_perfume_amount(1) await diffuser.set_room_size(4) await diffuser.update_data() print("Diffuser updated data:", diffuser.data) if diffuser.has_battery: print(f"Battery percentage: {diffuser.battery_percentage}%") run(main()) ``` %package -n python3-pyrituals Summary: Async Python wrapper for the Rituals Perfume Genie API Provides: python-pyrituals BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-pyrituals # PyRituals package [![PyPI](https://img.shields.io/pypi/v/pyrituals)](https://pypi.org/project/pyrituals/) ![PyPI - Downloads](https://img.shields.io/pypi/dm/pyrituals) [![PyPI - License](https://img.shields.io/pypi/l/pyrituals?color=blue)](https://github.com/milanmeu/pyrituals/blob/main/LICENSE) An async Python wrapper for the Rituals Perfume Genie API. It allows you to control the diffuser and retrieve its state. The package supports the first and second version. ## Installation ```bash pip install pyrituals ``` ## Usage ### Import ```python from pyrituals import Account, Diffuser, AuthenticationException ``` ### Create a `aiohttp.ClientSession` to make requests ```python from aiohttp import ClientSession session = ClientSession() ``` ### Endpoints Default endpoints: ```python AUTH_URL = "https://rituals.sense-company.com/ocapi/login" # Account.authenticate() ACCOUNT_URL = "https://rituals.sense-company.com/api/account/hubs" # Account.get_devices() HUB_URL = "https://rituals.sense-company.com/api/account/hub" # Diffuser.update_data() UPDATE_URL = "https://rituals.sense-company.com/api/hub/update/attr" # Diffuser.turn_*(), Diffuser.set_*() ``` To change the used API endpoints add an `url` parameter to the function. Example: ```python LOGIN_URL = "https://rituals.sense-company.com/ocapi/login" account = Account("name@example.com", "passw0rd", session) await account.authenticate(url=LOGIN_URL) ``` ### Account #### Create an instance ```python email = "name@example.com" password = "passw0rd" account = Account(email, password, session) ``` #### Authenticate ```python try: await account.authenticate() except AuthenticationException as e: print("Could not authenticate:", e) ``` #### Account data The account data is only available after authentication. ```python account.data ``` #### Get linked devices `get_devices()` returns a list of `Diffuser`s. ```python devices = await account.get_devices() ``` ### Diffuser #### Diffuser data The initial data and format is different from the data after executing `update_data()`. Some properties require data that is only available after executing `update_data()`. Therefore, it's required to execute `update_data()` before using the diffuser properties. ```python diffuser.data diffuser.battery_percentage diffuser.charging diffuser.has_battery diffuser.has_cartridge diffuser.hash diffuser.hub_data diffuser.hublot diffuser.fill diffuser.perfume diffuser.perfume_amount diffuser.room_size diffuser.is_on diffuser.is_online diffuser.name diffuser.version diffuser.wifi_percentage diffuser.room_size_square_meter ``` #### Get updated data ```python await diffuser.update_data() ``` #### Turn the diffuser on ```python await diffuser.turn_on() ``` #### Turn the diffuser off ```python await diffuser.turn_off() ``` #### Set the diffuser perfume amount Amount must be an integer between 1 and 3, inclusive. ```python amount = 1 await diffuser.set_perfume_amount(amount) ``` #### Set the diffuser room size Size must be an integer between 1 and 4, inclusive. ```python size = 2 await diffuser.set_room_size(size) ``` #### Set the diffuser room size in square meters Size must be the integer 15, 30, 60 or 100. ```python size = 60 await diffuser.set_room_size_square_meter(size) ``` ## Example ```python from aiohttp import ClientSession from asyncio import run import pyrituals async def main(): async with ClientSession() as session: account = pyrituals.Account("name@example.com", "passw0rd", session) try: await account.authenticate() except pyrituals.AuthenticationException as ex: print("Could not authenticate:", ex) return print("Account data:", account.data) devices = await account.get_devices() for diffuser in devices: print("Diffuser data:", diffuser.data) await diffuser.turn_on() await diffuser.set_perfume_amount(1) await diffuser.set_room_size(4) await diffuser.update_data() print("Diffuser updated data:", diffuser.data) if diffuser.has_battery: print(f"Battery percentage: {diffuser.battery_percentage}%") run(main()) ``` %package help Summary: Development documents and examples for pyrituals Provides: python3-pyrituals-doc %description help # PyRituals package [![PyPI](https://img.shields.io/pypi/v/pyrituals)](https://pypi.org/project/pyrituals/) ![PyPI - Downloads](https://img.shields.io/pypi/dm/pyrituals) [![PyPI - License](https://img.shields.io/pypi/l/pyrituals?color=blue)](https://github.com/milanmeu/pyrituals/blob/main/LICENSE) An async Python wrapper for the Rituals Perfume Genie API. It allows you to control the diffuser and retrieve its state. The package supports the first and second version. ## Installation ```bash pip install pyrituals ``` ## Usage ### Import ```python from pyrituals import Account, Diffuser, AuthenticationException ``` ### Create a `aiohttp.ClientSession` to make requests ```python from aiohttp import ClientSession session = ClientSession() ``` ### Endpoints Default endpoints: ```python AUTH_URL = "https://rituals.sense-company.com/ocapi/login" # Account.authenticate() ACCOUNT_URL = "https://rituals.sense-company.com/api/account/hubs" # Account.get_devices() HUB_URL = "https://rituals.sense-company.com/api/account/hub" # Diffuser.update_data() UPDATE_URL = "https://rituals.sense-company.com/api/hub/update/attr" # Diffuser.turn_*(), Diffuser.set_*() ``` To change the used API endpoints add an `url` parameter to the function. Example: ```python LOGIN_URL = "https://rituals.sense-company.com/ocapi/login" account = Account("name@example.com", "passw0rd", session) await account.authenticate(url=LOGIN_URL) ``` ### Account #### Create an instance ```python email = "name@example.com" password = "passw0rd" account = Account(email, password, session) ``` #### Authenticate ```python try: await account.authenticate() except AuthenticationException as e: print("Could not authenticate:", e) ``` #### Account data The account data is only available after authentication. ```python account.data ``` #### Get linked devices `get_devices()` returns a list of `Diffuser`s. ```python devices = await account.get_devices() ``` ### Diffuser #### Diffuser data The initial data and format is different from the data after executing `update_data()`. Some properties require data that is only available after executing `update_data()`. Therefore, it's required to execute `update_data()` before using the diffuser properties. ```python diffuser.data diffuser.battery_percentage diffuser.charging diffuser.has_battery diffuser.has_cartridge diffuser.hash diffuser.hub_data diffuser.hublot diffuser.fill diffuser.perfume diffuser.perfume_amount diffuser.room_size diffuser.is_on diffuser.is_online diffuser.name diffuser.version diffuser.wifi_percentage diffuser.room_size_square_meter ``` #### Get updated data ```python await diffuser.update_data() ``` #### Turn the diffuser on ```python await diffuser.turn_on() ``` #### Turn the diffuser off ```python await diffuser.turn_off() ``` #### Set the diffuser perfume amount Amount must be an integer between 1 and 3, inclusive. ```python amount = 1 await diffuser.set_perfume_amount(amount) ``` #### Set the diffuser room size Size must be an integer between 1 and 4, inclusive. ```python size = 2 await diffuser.set_room_size(size) ``` #### Set the diffuser room size in square meters Size must be the integer 15, 30, 60 or 100. ```python size = 60 await diffuser.set_room_size_square_meter(size) ``` ## Example ```python from aiohttp import ClientSession from asyncio import run import pyrituals async def main(): async with ClientSession() as session: account = pyrituals.Account("name@example.com", "passw0rd", session) try: await account.authenticate() except pyrituals.AuthenticationException as ex: print("Could not authenticate:", ex) return print("Account data:", account.data) devices = await account.get_devices() for diffuser in devices: print("Diffuser data:", diffuser.data) await diffuser.turn_on() await diffuser.set_perfume_amount(1) await diffuser.set_room_size(4) await diffuser.update_data() print("Diffuser updated data:", diffuser.data) if diffuser.has_battery: print(f"Battery percentage: {diffuser.battery_percentage}%") run(main()) ``` %prep %autosetup -n pyrituals-0.0.6 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-pyrituals -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Thu Jun 08 2023 Python_Bot - 0.0.6-1 - Package Spec generated