81 lines
1.9 KiB
Kotlin
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
|
|
} |