import io.ktor.client.call.* import io.ktor.client.request.* @kotlinx.serialization.Serializable data class Settings( val shellys: HashMap = hashMapOf(), val groups: ArrayList = 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 request(path: String, force: Boolean = false): T? { try { if (state == ShellyState.Unknown && !force) { return null } return client.get("http://$ip$path").body() } catch (_: Exception) { state = ShellyState.Unknown } return null } suspend fun sendCommand(shellyCommand: ShellyCommand) { request( "/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/0", force )?.let { state = if (it.ison) { ShellyState.On } else { ShellyState.Off } } } suspend fun getMeter(): Meter? { return request("/meter/0") } } @kotlinx.serialization.Serializable data class ShellyGroup( val name: String, val members: ArrayList = arrayListOf() ) enum class ShellyState { Unknown, On, Off } enum class ShellyCommand { Toggle, On, Off }