Skip to content

Commit 5a8bdcc

Browse files
Merge branch 'lightlevels-module'
2 parents 4f21e4b + 16ecc40 commit 5a8bdcc

File tree

19 files changed

+572
-0
lines changed

19 files changed

+572
-0
lines changed

core/api/core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public final class inkapplications/shade/core/Shade {
1212
public final fun getDevices ()Linkapplications/shade/devices/DeviceControls;
1313
public final fun getGroupedLights ()Linkapplications/shade/groupedlights/GroupedLightControls;
1414
public final fun getHomekit ()Linkapplications/shade/homekit/HomekitControls;
15+
public final fun getLightLevels ()Linkapplications/shade/lightlevel/LightLevelControls;
1516
public final fun getLights ()Linkapplications/shade/lights/LightControls;
1617
public final fun getOnlineDiscovery ()Linkapplications/shade/discover/BridgeDiscovery;
1718
public final fun getResources ()Linkapplications/shade/resources/ResourceControls;

core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ kotlin {
1414
api(projects.events)
1515
api(projects.groupedLights)
1616
api(projects.lights)
17+
api(projects.lightlevel)
1718
api(projects.resources)
1819
api(projects.rooms)
1920
api(projects.scenes)

core/src/commonMain/kotlin/inkapplications/shade/core/Shade.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import inkapplications.shade.events.EventsModule
77
import inkapplications.shade.groupedlights.ShadeGroupedLightsModule
88
import inkapplications.shade.homekit.ShadeHomekitModule
99
import inkapplications.shade.internals.InternalsModule
10+
import inkapplications.shade.lightlevel.ShadeLightLevelModule
1011
import inkapplications.shade.lights.ShadeLightsModule
1112
import inkapplications.shade.resources.ShadeResourcesModule
1213
import inkapplications.shade.rooms.ShadeRoomsModule
@@ -53,6 +54,7 @@ class Shade(
5354
).bridgeAuth
5455
val devices = ShadeDevicesModule(internalsModule).devices
5556
val lights = ShadeLightsModule(internalsModule, eventsModule).lights
57+
val lightLevels = ShadeLightLevelModule(internalsModule).lightLevels
5658
val rooms = ShadeRoomsModule(internalsModule).rooms
5759
val zones = ShadeZonesModule(internalsModule).zones
5860
val groupedLights = ShadeGroupedLightsModule(internalsModule, eventsModule).groupedLights

lightlevel/api/lightlevel.api

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
public abstract interface class inkapplications/shade/lightlevel/LightLevelControls {
2+
public abstract fun getLightLevel-klA6Vuc (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3+
public abstract fun listLightLevels (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
4+
public abstract fun updateLightLevel-bKh5c1I (Ljava/lang/String;Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
5+
}
6+
7+
public final class inkapplications/shade/lightlevel/ShadeLightLevelModule {
8+
public fun <init> (Linkapplications/shade/internals/InternalsModule;)V
9+
public final fun getLightLevels ()Linkapplications/shade/lightlevel/LightLevelControls;
10+
}
11+
12+
public final class inkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters {
13+
public static final field Companion Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters$Companion;
14+
public fun <init> ()V
15+
public fun <init> (Ljava/lang/Boolean;)V
16+
public synthetic fun <init> (Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
17+
public final fun component1 ()Ljava/lang/Boolean;
18+
public final fun copy (Ljava/lang/Boolean;)Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters;
19+
public static synthetic fun copy$default (Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters;Ljava/lang/Boolean;ILjava/lang/Object;)Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters;
20+
public fun equals (Ljava/lang/Object;)Z
21+
public final fun getEnabled ()Ljava/lang/Boolean;
22+
public fun hashCode ()I
23+
public fun toString ()Ljava/lang/String;
24+
}
25+
26+
public final synthetic class inkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
27+
public static final field INSTANCE Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters$$serializer;
28+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
29+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters;
30+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
31+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
32+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Linkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters;)V
33+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
34+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
35+
}
36+
37+
public final class inkapplications/shade/lightlevel/parameters/LightLevelUpdateParameters$Companion {
38+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
39+
}
40+
41+
public final class inkapplications/shade/lightlevel/structures/LightLevel {
42+
public static final field Companion Linkapplications/shade/lightlevel/structures/LightLevel$Companion;
43+
public synthetic fun <init> (Ljava/lang/String;Linkapplications/shade/structures/ResourceReference;ZLinkapplications/shade/lightlevel/structures/LightLevelValue;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
44+
public synthetic fun <init> (Ljava/lang/String;Linkapplications/shade/structures/ResourceReference;ZLinkapplications/shade/lightlevel/structures/LightLevelValue;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
45+
public final fun component1-XbiYvy0 ()Ljava/lang/String;
46+
public final fun component2 ()Linkapplications/shade/structures/ResourceReference;
47+
public final fun component3 ()Z
48+
public final fun component4 ()Linkapplications/shade/lightlevel/structures/LightLevelValue;
49+
public final fun component5-1y3a6N0 ()Ljava/lang/String;
50+
public final fun copy-qm0Ps9A (Ljava/lang/String;Linkapplications/shade/structures/ResourceReference;ZLinkapplications/shade/lightlevel/structures/LightLevelValue;Ljava/lang/String;)Linkapplications/shade/lightlevel/structures/LightLevel;
51+
public static synthetic fun copy-qm0Ps9A$default (Linkapplications/shade/lightlevel/structures/LightLevel;Ljava/lang/String;Linkapplications/shade/structures/ResourceReference;ZLinkapplications/shade/lightlevel/structures/LightLevelValue;Ljava/lang/String;ILjava/lang/Object;)Linkapplications/shade/lightlevel/structures/LightLevel;
52+
public fun equals (Ljava/lang/Object;)Z
53+
public final fun getEnabled ()Z
54+
public final fun getId-XbiYvy0 ()Ljava/lang/String;
55+
public final fun getLight ()Linkapplications/shade/lightlevel/structures/LightLevelValue;
56+
public final fun getOwner ()Linkapplications/shade/structures/ResourceReference;
57+
public final fun getType-1y3a6N0 ()Ljava/lang/String;
58+
public fun hashCode ()I
59+
public fun toString ()Ljava/lang/String;
60+
}
61+
62+
public final synthetic class inkapplications/shade/lightlevel/structures/LightLevel$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
63+
public static final field INSTANCE Linkapplications/shade/lightlevel/structures/LightLevel$$serializer;
64+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
65+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Linkapplications/shade/lightlevel/structures/LightLevel;
66+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
67+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
68+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Linkapplications/shade/lightlevel/structures/LightLevel;)V
69+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
70+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
71+
}
72+
73+
public final class inkapplications/shade/lightlevel/structures/LightLevel$Companion {
74+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
75+
}
76+
77+
public final class inkapplications/shade/lightlevel/structures/LightLevelReport {
78+
public static final field Companion Linkapplications/shade/lightlevel/structures/LightLevelReport$Companion;
79+
public fun <init> (Lkotlin/time/Instant;Linkapplications/shade/structures/Illuminance;)V
80+
public final fun component1 ()Lkotlin/time/Instant;
81+
public final fun component2 ()Linkapplications/shade/structures/Illuminance;
82+
public final fun copy (Lkotlin/time/Instant;Linkapplications/shade/structures/Illuminance;)Linkapplications/shade/lightlevel/structures/LightLevelReport;
83+
public static synthetic fun copy$default (Linkapplications/shade/lightlevel/structures/LightLevelReport;Lkotlin/time/Instant;Linkapplications/shade/structures/Illuminance;ILjava/lang/Object;)Linkapplications/shade/lightlevel/structures/LightLevelReport;
84+
public fun equals (Ljava/lang/Object;)Z
85+
public final fun getChanged ()Lkotlin/time/Instant;
86+
public final fun getLightLevel ()Linkapplications/shade/structures/Illuminance;
87+
public fun hashCode ()I
88+
public fun toString ()Ljava/lang/String;
89+
}
90+
91+
public final synthetic class inkapplications/shade/lightlevel/structures/LightLevelReport$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
92+
public static final field INSTANCE Linkapplications/shade/lightlevel/structures/LightLevelReport$$serializer;
93+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
94+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Linkapplications/shade/lightlevel/structures/LightLevelReport;
95+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
96+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
97+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Linkapplications/shade/lightlevel/structures/LightLevelReport;)V
98+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
99+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
100+
}
101+
102+
public final class inkapplications/shade/lightlevel/structures/LightLevelReport$Companion {
103+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
104+
}
105+
106+
public final class inkapplications/shade/lightlevel/structures/LightLevelValue {
107+
public static final field Companion Linkapplications/shade/lightlevel/structures/LightLevelValue$Companion;
108+
public fun <init> ()V
109+
public fun <init> (Linkapplications/shade/lightlevel/structures/LightLevelReport;)V
110+
public synthetic fun <init> (Linkapplications/shade/lightlevel/structures/LightLevelReport;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
111+
public final fun component1 ()Linkapplications/shade/lightlevel/structures/LightLevelReport;
112+
public final fun copy (Linkapplications/shade/lightlevel/structures/LightLevelReport;)Linkapplications/shade/lightlevel/structures/LightLevelValue;
113+
public static synthetic fun copy$default (Linkapplications/shade/lightlevel/structures/LightLevelValue;Linkapplications/shade/lightlevel/structures/LightLevelReport;ILjava/lang/Object;)Linkapplications/shade/lightlevel/structures/LightLevelValue;
114+
public fun equals (Ljava/lang/Object;)Z
115+
public final fun getLightLevelReport ()Linkapplications/shade/lightlevel/structures/LightLevelReport;
116+
public fun hashCode ()I
117+
public fun toString ()Ljava/lang/String;
118+
}
119+
120+
public final synthetic class inkapplications/shade/lightlevel/structures/LightLevelValue$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
121+
public static final field INSTANCE Linkapplications/shade/lightlevel/structures/LightLevelValue$$serializer;
122+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
123+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Linkapplications/shade/lightlevel/structures/LightLevelValue;
124+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
125+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
126+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Linkapplications/shade/lightlevel/structures/LightLevelValue;)V
127+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
128+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
129+
}
130+
131+
public final class inkapplications/shade/lightlevel/structures/LightLevelValue$Companion {
132+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
133+
}
134+

lightlevel/build.gradle.kts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
plugins {
2+
id("library")
3+
kotlin("plugin.serialization")
4+
id("ink.publishing")
5+
}
6+
7+
kotlin {
8+
sourceSets {
9+
val commonMain by getting {
10+
dependencies {
11+
implementation(libs.serialization.json)
12+
implementation(projects.internals)
13+
implementation(projects.serialization)
14+
api(projects.structures)
15+
16+
api(libs.coroutines.core)
17+
}
18+
}
19+
20+
val commonTest by getting {
21+
dependencies {
22+
implementation(libs.test.core)
23+
implementation(libs.test.annotations)
24+
}
25+
}
26+
}
27+
}
28+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package inkapplications.shade.lightlevel
2+
3+
import inkapplications.shade.lightlevel.parameters.LightLevelUpdateParameters
4+
import inkapplications.shade.lightlevel.structures.LightLevel
5+
import inkapplications.shade.structures.ResourceId
6+
import inkapplications.shade.structures.ResourceReference
7+
8+
/**
9+
* Actions to get light level sensor data from the hue system.
10+
*/
11+
interface LightLevelControls {
12+
/**
13+
* Get a list of light level sensors configured on the hue service.
14+
*
15+
* @return A list of all light level sensors configured on the bridge.
16+
*/
17+
suspend fun listLightLevels(): List<LightLevel>
18+
19+
/**
20+
* Get the state of a single light level sensor.
21+
*
22+
* @param id The resource ID of the light level sensor to fetch data about.
23+
* @return State and capability information about the light level sensor.
24+
*/
25+
suspend fun getLightLevel(id: ResourceId): LightLevel
26+
27+
/**
28+
* Update a light level sensor on the hue bridge.
29+
*
30+
* @param id The resource ID of the light level sensor to be updated.
31+
* @param parameters Data about the light level sensor to be updated.
32+
* @return A reference to the updated resource.
33+
*/
34+
suspend fun updateLightLevel(id: ResourceId, parameters: LightLevelUpdateParameters): ResourceReference
35+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package inkapplications.shade.lightlevel
2+
3+
import inkapplications.shade.internals.HueHttpClient
4+
import inkapplications.shade.internals.getData
5+
import inkapplications.shade.internals.putData
6+
import inkapplications.shade.lightlevel.parameters.LightLevelUpdateParameters
7+
import inkapplications.shade.lightlevel.structures.LightLevel
8+
import inkapplications.shade.structures.ResourceId
9+
import inkapplications.shade.structures.ResourceReference
10+
11+
/**
12+
* Implements light level sensor controls via the hue client.
13+
*/
14+
internal class ShadeLightLevel(
15+
private val hueHttpClient: HueHttpClient,
16+
): LightLevelControls {
17+
override suspend fun listLightLevels(): List<LightLevel> {
18+
return hueHttpClient.getData("resource", "light_level")
19+
}
20+
21+
override suspend fun getLightLevel(id: ResourceId): LightLevel {
22+
return hueHttpClient.getData<List<LightLevel>>("resource", "light_level", id.value).single()
23+
}
24+
25+
override suspend fun updateLightLevel(
26+
id: ResourceId,
27+
parameters: LightLevelUpdateParameters
28+
): ResourceReference {
29+
val response: List<ResourceReference> = hueHttpClient.putData(
30+
body = parameters,
31+
pathSegments = arrayOf("resource", "light_level", id.value),
32+
)
33+
34+
return response.single()
35+
}
36+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package inkapplications.shade.lightlevel
2+
3+
import inkapplications.shade.internals.InternalsModule
4+
5+
/**
6+
* Provides access to light level sensor services.
7+
*
8+
* These are offered by devices with light level sensing capabilities.
9+
*/
10+
class ShadeLightLevelModule(
11+
internalsModule: InternalsModule,
12+
) {
13+
val lightLevels: LightLevelControls = ShadeLightLevel(internalsModule.hueHttpClient)
14+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package inkapplications.shade.lightlevel.parameters
2+
3+
import kotlinx.serialization.Serializable
4+
5+
/**
6+
* Parameters that can be specified when updating a light level sensor.
7+
*/
8+
@Serializable
9+
data class LightLevelUpdateParameters(
10+
/**
11+
* Whether the sensor is activated.
12+
*
13+
* true when sensor is activated, false when deactivated.
14+
*/
15+
val enabled: Boolean? = null,
16+
)
17+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package inkapplications.shade.lightlevel.structures
2+
3+
import inkapplications.shade.structures.ResourceId
4+
import inkapplications.shade.structures.ResourceReference
5+
import inkapplications.shade.structures.ResourceType
6+
import kotlinx.serialization.Serializable
7+
8+
/**
9+
* State and capabilities of a light level sensor resource.
10+
*/
11+
@Serializable
12+
data class LightLevel(
13+
/**
14+
* Unique identifier representing a specific light level sensor instance.
15+
*/
16+
val id: ResourceId,
17+
18+
/**
19+
* Owner of the service.
20+
*
21+
* In case the owner service is deleted, the service also gets deleted.
22+
*/
23+
val owner: ResourceReference,
24+
25+
/**
26+
* Whether the sensor is activated.
27+
*
28+
* true when sensor is activated, false when deactivated.
29+
*/
30+
val enabled: Boolean,
31+
32+
/**
33+
* Light level sensor data.
34+
*/
35+
val light: LightLevelValue,
36+
37+
/**
38+
* Type of the supported resource.
39+
*/
40+
val type: ResourceType = ResourceType.LightLevel,
41+
)

0 commit comments

Comments
 (0)