2022-05-16 15:45:18 +02:00

81 lines
1.9 KiB
Kotlin

import io.ktor.client.call.*
import io.ktor.client.request.*
@kotlinx.serialization.Serializable
data class Settings(
val shellys: HashMap<String, Shelly> = hashMapOf(),
val groups: ArrayList<ShellyGroup> = arrayListOf()
)
@kotlinx.serialization.Serializable
data class Shelly(
var ip: String,
var name: String,
var description: String,
@kotlinx.serialization.Transient
var state: ShellyState = ShellyState.Unknown
) {
private suspend inline fun <reified T> request(path: String, force: Boolean = false): T? {
try {
if (state == ShellyState.Unknown && !force) {
return null
}
return client.get("http://$ip$path").body<T>()
} catch (_: Exception) {
state = ShellyState.Unknown
}
return null
}
suspend fun sendCommand(shellyCommand: ShellyCommand) {
request<Relay>(
"/relay/0?turn=" + when (shellyCommand) {
ShellyCommand.Toggle -> "toggle"
ShellyCommand.On -> "on"
ShellyCommand.Off -> "off"
}
)?.let {
state = if (it.ison) {
ShellyState.On
} else {
ShellyState.Off
}
}
}
suspend fun fetchState(force: Boolean = false) {
request<Relay>(
"/relay/0",
force
)?.let {
state = if (it.ison) {
ShellyState.On
} else {
ShellyState.Off
}
}
}
suspend fun getMeter(): Meter? {
return request<Meter>("/meter/0")
}
}
@kotlinx.serialization.Serializable
data class ShellyGroup(
val name: String,
val members: ArrayList<String> = arrayListOf()
)
enum class ShellyState {
Unknown,
On,
Off
}
enum class ShellyCommand {
Toggle,
On,
Off
}