fix(scene): address automation review findings
This commit is contained in:
@@ -65,12 +65,16 @@ class SceneTriggerEvaluator {
|
||||
private fun evaluateOne(trigger: SceneTrigger, snapshot: AutomationSnapshot, now: LocalDateTime): TriggerEvaluation? = when (trigger) {
|
||||
is SceneTrigger.Time -> {
|
||||
val time = parseTime(trigger.timeOfDay) ?: return TriggerEvaluation.Unavailable(DomainError.InvalidRequest(detail = "Invalid trigger time"))
|
||||
val dayMatches = trigger.daysOfWeek.isEmpty() || now.dayOfWeek.value in trigger.daysOfWeek
|
||||
val scheduled = LocalDateTime.of(now.toLocalDate(), time)
|
||||
val lateness = Duration.between(scheduled, now).toMinutes()
|
||||
if (dayMatches && lateness in 0..20) {
|
||||
TriggerEvaluation.Matched("${now.toLocalDate()}:${trigger.timeOfDay}:${trigger.id.value}")
|
||||
} else null
|
||||
val scheduled = listOf(now.toLocalDate(), now.toLocalDate().minusDays(1))
|
||||
.map { date -> LocalDateTime.of(date, time) }
|
||||
.firstOrNull { candidate ->
|
||||
val dayMatches = trigger.daysOfWeek.isEmpty() || candidate.dayOfWeek.value in trigger.daysOfWeek
|
||||
val lateness = Duration.between(candidate, now).toMinutes()
|
||||
dayMatches && lateness in 0..TIME_TRIGGER_GRACE_MINUTES
|
||||
}
|
||||
scheduled?.let { occurrence ->
|
||||
TriggerEvaluation.Matched("${occurrence.toLocalDate()}:${trigger.timeOfDay}:${trigger.id.value}")
|
||||
}
|
||||
}
|
||||
is SceneTrigger.Temperature -> threshold(snapshot.readings[trigger.deviceName], trigger.operator, trigger.thresholdCelsius) {
|
||||
it.temperature
|
||||
@@ -134,6 +138,7 @@ class SceneTriggerEvaluator {
|
||||
private companion object {
|
||||
const val TEMPERATURE_HYSTERESIS = 0.5
|
||||
const val HUMIDITY_HYSTERESIS = 2.0
|
||||
const val TIME_TRIGGER_GRACE_MINUTES = 20L
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user