forked from platypush/platypush
[#340] Added condition_type
field to alarm objects.
This commit is contained in:
parent
e6e4396e49
commit
b4be56ec2c
2 changed files with 45 additions and 5 deletions
|
@ -89,9 +89,9 @@ class AlarmPlugin(RunnablePlugin, EntityManager):
|
|||
:class:`platypush.plugins.media.MediaPlugin`) that will be used to
|
||||
play the alarm audio. It needs to be a supported local media
|
||||
plugin, e.g. ``media.mplayer``, ``media.vlc``, ``media.mpv``,
|
||||
``media.gstreamer`` etc. If not specified, the first available
|
||||
configured local media plugin will be used. This only applies to
|
||||
alarms that are configured to play an audio resource.
|
||||
``media.gstreamer``, ``sound``, etc. If not specified, the first
|
||||
available configured local media plugin will be used. This only
|
||||
applies to alarms that are configured to play an audio resource.
|
||||
:param poll_interval: Poll interval in seconds (default: 5).
|
||||
:param snooze_interval: Default snooze interval in seconds (default: 300).
|
||||
"""
|
||||
|
|
|
@ -36,6 +36,16 @@ class AlarmState(enum.IntEnum):
|
|||
UNKNOWN = -1
|
||||
|
||||
|
||||
class AlarmConditionType(enum.Enum):
|
||||
"""
|
||||
Alarm condition types.
|
||||
"""
|
||||
|
||||
CRON = 'cron'
|
||||
INTERVAL = 'interval'
|
||||
TIMESTAMP = 'timestamp'
|
||||
|
||||
|
||||
class Alarm:
|
||||
"""
|
||||
Alarm model and controller.
|
||||
|
@ -110,6 +120,36 @@ class Alarm:
|
|||
except (AttributeError, croniter.CroniterBadCronError):
|
||||
return False
|
||||
|
||||
@property
|
||||
def is_interval(self) -> bool:
|
||||
try:
|
||||
float(self.when)
|
||||
return True
|
||||
except (TypeError, ValueError):
|
||||
return False
|
||||
|
||||
@property
|
||||
def is_timestamp(self) -> bool:
|
||||
if not isinstance(self.when, str):
|
||||
return False
|
||||
|
||||
try:
|
||||
datetime.datetime.fromisoformat(self.when)
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@property
|
||||
def condition_type(self) -> AlarmConditionType:
|
||||
if self.is_cron:
|
||||
return AlarmConditionType.CRON
|
||||
if self.is_interval:
|
||||
return AlarmConditionType.INTERVAL
|
||||
if self.is_timestamp:
|
||||
return AlarmConditionType.TIMESTAMP
|
||||
|
||||
raise ValueError(f'Invalid alarm condition {self.when}')
|
||||
|
||||
def get_next(self) -> Optional[float]:
|
||||
now = time.time()
|
||||
t = 0
|
||||
|
@ -299,7 +339,7 @@ class Alarm:
|
|||
'snooze_interval': self.snooze_interval,
|
||||
'actions': self.actions.requests,
|
||||
'static': self.static,
|
||||
'is_cron': self.is_cron,
|
||||
'condition_type': self.condition_type.value,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
|
@ -335,7 +375,7 @@ class Alarm:
|
|||
snooze_interval=self.snooze_interval,
|
||||
enabled=self.is_enabled(),
|
||||
static=self.static,
|
||||
is_cron=self.is_cron,
|
||||
condition_type=self.condition_type.value,
|
||||
)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue