All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.hassemble.extending.entities.sensors.Sensor.kt Maven / Gradle / Ivy

The newest version!
package hassemble.extending.entities.sensors

import hassemble.HomeAssistantApiClient
import hassemble.entities.Attributes
import hassemble.entities.State
import hassemble.entities.devices.Sensor
import hassemble.extending.entities.Sensor
import hassemble.extending.entities.SwitchableState
import hassemble.extending.entities.SwitchableValue
import hassemble.observability.Switchable
import hassemble.values.EntityId
import hassemble.values.ObjectId
import hassemble.values.domain

@Suppress("FunctionName")
internal inline fun , reified A : Attributes> HomeAssistantApiClient.Sensor(objectId: ObjectId): Sensor =
    Sensor(EntityId.fromPair("sensor".domain to objectId))

fun , A : Attributes, SV> Sensor.measurementValueChangedFrom(values: Pair) =
    history[1].state.value == values.first && measurement.value == values.second

fun , A : Attributes, SV> Sensor.measurementValueChangedFrom(values: Triple) =
    history[2].state.value == values.first && history[1].state.value == values.second && measurement.value == values.third

val Sensor.isOn
    get() = measurement.value == SwitchableValue.ON

val Sensor.isOff
    get() = measurement.value == SwitchableValue.OFF

inline fun , A : Attributes, SV> Sensor.onMeasurementValueChangedFrom(
    values: Pair,
    crossinline f: Sensor.(Switchable) -> Unit
) = attachObserver {
    if (measurementValueChangedFrom(values))
        f(this, it)
}

inline fun , A : Attributes, SV> Sensor.onMeasurementValueChangedFrom(
    values: Triple,
    crossinline f: Sensor.(Switchable) -> Unit
) = attachObserver {
    if (measurementValueChangedFrom(values))
        f(this, it)
}

inline fun  Sensor.onTurnedOn(
    crossinline f: Sensor.(Switchable) -> Unit
) = onMeasurementValueChangedFrom(SwitchableValue.OFF to SwitchableValue.ON, f)

inline fun  Sensor.onTurnedOff(
    crossinline f: Sensor.(Switchable) -> Unit
) = onMeasurementValueChangedFrom(SwitchableValue.ON to SwitchableValue.OFF, f)