
Schedules
=========

About Schedules
---------------

You can set different device schedules, enable or disable them and
change their associated parameters.

Enabling/Disabling Schedule
---------------------------

To disable the schedule, set **schedule_{schedule_name}_switch** parameter
parameter to `off`, to enable it set the parameter to `on`.

The following example illustrates how you can turn heating schedule
on or off.

.. code-block:: python

    # Turn on the heating schedule.
    await ecomax.set("schedule_heating_switch", "on")

    # Turn off the heating schedule.
    await ecomax.set("schedule_heating_switch", "off")

Changing Schedule Parameter
---------------------------

To change associated parameter value, change
**schedule_{schedule_name}_parameter** property.

Use following example to lower night time heating
temperature by 10 degrees Celsius.

.. code-block:: python

    # Lower heating temperature by 10 C at night time.
    await ecomax.set("schedule_heating_parameter", 10)

Setting Schedule
----------------

To set the schedule, you can use ``set_state(state)``, ``set_on()`` or
``set_off()`` methods and call ``commit()`` to send changes to the
device.

This example sets nighttime mode for Monday from 00:00 to 07:00 and
switches back to daytime mode from 07:00 to 00:00.

.. code-block:: python

    schedules = await ecomax.get("schedules")
    heating_schedule = schedules["heating"]
    heating_schedule.monday.set_off(start="00:00", end="07:00")
    heating_schedule.monday.set_on(start="07:00", end="00:00")
    await heating_schedule.commit()

For clarity sake, you might want to use ``STATE_NIGHT`` and
``STATE_DAY`` constants from ``pyplumio.helpers.schedule`` module.

.. code-block:: python

    from pyplumio.helpers.schedule import STATE_NIGHT

    heating_schedule.monday.set_state(STATE_NIGHT, "00:00", "07:00")

You may also omit one of the boundaries.
The other boundary is then set to the end or start of the day.

.. code-block:: python

    heating_schedule.monday.set_on(start="07:00")
    # is equivalent to
    heating_schedule.monday.set_on(start="07:00", end="00:00")

.. code-block:: python

    heating_schedule.monday.set_off(end="07:00")
    # is equivalent to
    heating_schedule.monday.set_off(start="00:00", end="07:00")

This can be used to set state for a whole day with
``heating_schedule.monday.set_on()``.

To set schedule for all days you can iterate through the
Schedule object:

.. code-block:: python

    schedules = await ecomax.get("schedules")
    heating_schedule = schedules["heating"]

    for weekday in heating_schedule:
        # Set a nighttime mode from 00:00 to 07:00
        weekday.set_on("00:00", "07:00")
        # Set a daytime mode from 07:00 to 00:00
        weekday.set_off("07:00", "00:00")

    # Commit changes to the device.
    await heating_schedule.commit()

Schedule Examples
-----------------

.. code-block:: python

    import pyplumio
    from pyplumio.helpers.schedule import STATE_DAY, STATE_NIGHT


    async def main():
        """Set a device schedule."""
        async with pyplumio.open_tcp_connection("localhost", 8899) as connection:
            ecomax = await connection.get("ecomax")
            schedules = await ecomax.get("schedules")
            heating_schedule = schedules["heating"]

            # Turn the heating schedule on.
            await ecomax.set("schedule_heating_switch", "on")

            # Drop the heating temperature by 10 degrees in the nighttime mode.
            await ecomax.set("schedule_heating_parameter", 10)

            for weekday in heating_schedule:
                weekday.set_state(STATE_DAY, "00:00", "00:30")
                weekday.set_state(STATE_NIGHT, "00:30", "09:00")
                weekday.set_state(STATE_DAY, "09:00", "00:00")

            # There will be no nighttime mode on sunday.
            heating_schedule.sunday.set_state(STATE_DAY)
            
            await heating_schedule.commit()


    asyncio.run(main())
