Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat-support-repeating-start-times #86

Merged
merged 1 commit into from
Nov 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion pyopensprinkler/program.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,12 @@ async def set_start_time_type(self, value):
if value == 1:
bits[6] = 1

dlist[0] = self._bits_to_int(bits)
# If changing type, data in start1-3 becomes meaningless, so zero out.
if dlist[0] != self._bits_to_int(bits):
dlist[3][1] = 0
dlist[3][2] = 0
dlist[3][3] = 0
dlist[0] = self._bits_to_int(bits)
params = self._format_program_data(dlist)
return await self._set_variables(params)

Expand Down Expand Up @@ -287,6 +292,30 @@ async def set_program_start_time_offset_type(
params = self._format_program_data(dlist)
return await self._set_variables(params)

async def set_program_start_repeat_count(self, repeat_count):
"""Set program start repeat count"""
if self.start_time_type == 1:
raise RuntimeError(
"cannot update repeat count when start time type is 'fixed'"
)

dlist = self._get_program_data().copy()
dlist[3][1] = repeat_count
params = self._format_program_data(dlist)
return await self._set_variables(params)

async def set_program_start_repeat_interval(self, repeat_minutes):
"""Set program start repeat interval in minutes"""
if self.start_time_type == 1:
raise RuntimeError(
"cannot update repeat count when start time type is 'fixed'"
)

dlist = self._get_program_data().copy()
dlist[3][2] = repeat_minutes
params = self._format_program_data(dlist)
return await self._set_variables(params)

async def set_station_duration(self, station_index, duration):
dlist = self._get_program_data().copy()
dlist[4][station_index] = duration
Expand Down Expand Up @@ -461,6 +490,16 @@ def program_start_time_offset_types(self):
self.get_program_start_time_offset_type(3),
]

@property
def program_start_repeat_count(self):
"""Retrieve program start repeat count"""
return self._get_variable(3)[1]

@property
def program_start_repeat_interval(self):
"""Retrieve program start repeat interval in minutes"""
return self._get_variable(3)[2]

@property
def station_durations(self):
"""Retrieve station durations"""
Expand Down
12 changes: 12 additions & 0 deletions tests/test_program.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,18 @@ async def test_set_program_start_time_offset(self, controller, program):
assert program.get_program_start_time_offset_type(1) == "midnight"
assert program.get_program_start_time_offset(1) == 30

@pytest.mark.asyncio
async def test_set_program_start_repeat_count(self, controller, program):
await program.set_start_time_type(0)
await program.set_program_start_repeat_count(2)
assert program.program_start_repeat_count == 2

@pytest.mark.asyncio
async def test_set_program_start_repeat_interval(self, controller, program):
await program.set_start_time_type(0)
await program.set_program_start_repeat_interval(60)
assert program.program_start_repeat_interval == 60

@pytest.mark.asyncio
async def test_set_station_duration(self, controller, program):
await program.set_station_duration(0, 1800)
Expand Down