Reading
=======

Dataset
-------

.. autoattribute:: pyplumio.devices.Device.data

You can use this property get a full device dataset.

.. code-block:: python

    ecomax = await conn.get("ecomax")
    print(ecomax.data)

In a pinch, you can also use this attribute to directly access the data,
but this is not recommended, please use getters instead.

Getters
-------

.. autofunction:: pyplumio.devices.Device.get

This method can be used to get a single item from the device dataset.

The following example will print out current feed water temperature
and close the connection.

.. code-block:: python

    import asyncio

    import pyplumio

    async def main():
        """Read the current heating temperature."""
        async with pyplumio.open_tcp_connection("localhost", 8899) as conn:
            # Get the ecoMAX device.
            ecomax = await conn.get("ecomax")

            # Get the heating temperature.
            heating_temp = await ecomax.get("heating_temp")
            print(heating_temp)
            ...
            

    asyncio.run(main())

.. autofunction:: pyplumio.devices.Device.get_nowait

This method can be used to get single item from device dataset without
waiting until it becomes available.

The following example will print out current feed water temperature if
it is available, otherwise it'll print ``60``.

.. code-block:: python

    # Print the heating temperature or 60, if property is not available.
    heating_temp = ecomax.get_nowait("heating_temp", default=60)
    print(heating_temp)

.. autofunction:: pyplumio.devices.Device.wait_for

You can use this method to wait until the value is available and
then directly access the attribute under the device object.

The following example will wait until current feed water temperature is
available and print it out.

.. code-block:: python

    # Wait until the 'heating_temp' property becomes available.
    await ecomax.wait_for("heating_temp")

    # Output the 'heating_temp' property.
    print(ecomax.heating_temp)

Regulator Data
--------------
Regulator Data message is broadcasted by the ecoMAX controller
once per second and allows access to some device-specific
information that isn't available elsewhere.

.. note::

    RegData is device-specific. Each ecoMAX controller has different
    keys and their associated meanings.

Regulator data is represented by a dictionary mapped with numerical
keys, and can be accessed via the **regdata** property.

.. code-block:: python

    ecomax = await conn.get("ecomax")
    regdata = await ecomax.get("regdata")

    # Get regulator data with the 1280 key.
    heating_target = regdata[1280]


Reading Examples
----------------

The following example makes use of all available methods to get
current and target heating temperatures and device state and outputs it
to the terminal.

.. code-block:: python

    import asyncio

    import pyplumio


    async def main():
        """Read current temp, target temp and device state from
        the regdata.
        """
        async with pyplumio.open_tcp_connection("localhost", 8899) as conn:
            # Get the ecoMAX device.
            ecomax = await conn.get("ecomax")

            # Get heating temperature, if it's available otherwise
            # return the default value (65).
            heating_temp = ecomax.get_nowait("heating_temp", default=65)

            # Wait for heating temperature and get it's value.
            heating_target_temp = await ecomax.get("heating_target_temp")

            # Wait until regulator data is available then grab key 1792.
            await ecomax.wait_for("regdata")
            status = ecomax.regdata[1792]

            print(
                f"Current temp: {heating_temp}, "
                f"target temp: {heating_target_temp}, "
                f"status: {status}."
            )


    asyncio.run(main())
