From 2de77bde26ccae5b4ff904294d477d14ddeaa5ae Mon Sep 17 00:00:00 2001 From: dominiquekleeven <10584854+dominiquekleeven@users.noreply.github.com> Date: Wed, 20 May 2026 10:34:30 +0200 Subject: [PATCH 1/2] Add properties field to ORConfigChannelProtocol --- .../orlib/service/espprovision/DeviceConnection.kt | 6 ++++-- .../orlib/service/espprovision/ORConfigChannel.kt | 4 +++- protobuf/src/main/proto/ORConfigChannelProtocol.proto | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceConnection.kt b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceConnection.kt index d137a4f..48a1bc3 100644 --- a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceConnection.kt +++ b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceConnection.kt @@ -101,7 +101,8 @@ class DeviceConnection(val deviceRegistry: DeviceRegistry, var callbackChannel: mqttBrokerUrl: String, mqttUser: String, mqttPassword: String, - assetId: String + assetId: String, + properties: Map = emptyMap() ) { if (!isConnected) { throw ESPProviderException( @@ -114,7 +115,8 @@ class DeviceConnection(val deviceRegistry: DeviceRegistry, var callbackChannel: mqttBrokerUrl = mqttBrokerUrl, mqttUser = mqttUser, mqttPassword = mqttPassword, - assetId = assetId + assetId = assetId, + properties = properties ) } catch (e: Exception) { throw ESPProviderException( diff --git a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/ORConfigChannel.kt b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/ORConfigChannel.kt index 3938fd2..47f4817 100644 --- a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/ORConfigChannel.kt +++ b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/ORConfigChannel.kt @@ -47,7 +47,8 @@ class ORConfigChannel(private val device: ESPDevice) { mqttUser: String, mqttPassword: String, realm: String = "master", - assetId: String + assetId: String, + properties: Map = emptyMap() ) { val config = Request.OpenRemoteConfig.newBuilder() .setMqttBrokerUrl(mqttBrokerUrl) @@ -55,6 +56,7 @@ class ORConfigChannel(private val device: ESPDevice) { .setMqttPassword(mqttPassword) .setAssetId(assetId) .setRealm(realm) + .putAllProperties(properties) .build() val request = Request.newBuilder() diff --git a/protobuf/src/main/proto/ORConfigChannelProtocol.proto b/protobuf/src/main/proto/ORConfigChannelProtocol.proto index f2168a5..9718210 100644 --- a/protobuf/src/main/proto/ORConfigChannelProtocol.proto +++ b/protobuf/src/main/proto/ORConfigChannelProtocol.proto @@ -72,6 +72,7 @@ message Request { string mqtt_password = 3; string realm = 4; string asset_id = 5; + map properties = 6; } message ExitProvisioning {}; string id = 1; From 5c5f64b124a3ac4afd2fcb3f5e4243dce7649e46 Mon Sep 17 00:00:00 2001 From: dominiquekleeven <10584854+dominiquekleeven@users.noreply.github.com> Date: Mon, 25 May 2026 12:45:44 +0200 Subject: [PATCH 2/2] Add support for optional `properties` field from `/rest/device` --- .../service/espprovision/DeviceProvision.kt | 5 +++-- .../espprovision/DeviceProvisionAPI.kt | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvision.kt b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvision.kt index 53cea38..deac584 100644 --- a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvision.kt +++ b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvision.kt @@ -34,14 +34,15 @@ class DeviceProvision(var deviceConnection: DeviceConnection?, var callbackChann val password = generatePassword() - val assetId = deviceProvisionAPI.provision(deviceInfo.modelName, deviceInfo.deviceId, password, userToken) + val result = deviceProvisionAPI.provision(deviceInfo.modelName, deviceInfo.deviceId, password, userToken) val userName = deviceInfo.deviceId.lowercase(Locale("en")) deviceConnection?.sendOpenRemoteConfig( mqttBrokerUrl = mqttURL, mqttUser = userName, mqttPassword = password, - assetId = assetId + assetId = result.assetId, + properties = result.properties ) var status = BackendConnectionStatus.CONNECTING diff --git a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvisionAPI.kt b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvisionAPI.kt index 6815339..a0674fd 100644 --- a/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvisionAPI.kt +++ b/ORLib/src/main/java/io/openremote/orlib/service/espprovision/DeviceProvisionAPI.kt @@ -13,16 +13,21 @@ import java.net.HttpURLConnection import java.net.URL interface DeviceProvisionAPI { - suspend fun provision(modelName: String, deviceId: String, password: String, token: String): String + suspend fun provision(modelName: String, deviceId: String, password: String, token: String): ProvisionResult } +data class ProvisionResult( + val assetId: String, + val properties: Map +) + class DeviceProvisionAPIREST(private val apiURL: URL) : DeviceProvisionAPI { companion object { private const val TAG = "DeviceProvisionAPIREST" } - override suspend fun provision(modelName: String, deviceId: String, password: String, token: String): String = withContext(Dispatchers.IO) { + override suspend fun provision(modelName: String, deviceId: String, password: String, token: String): ProvisionResult = withContext(Dispatchers.IO) { Log.d(ESPProvisionProvider.TAG, "apiURL $apiURL") val uri = Uri.parse(apiURL.toString()).buildUpon() .appendPath("rest") @@ -65,7 +70,15 @@ class DeviceProvisionAPIREST(private val apiURL: URL) : DeviceProvisionAPI { } val json = JSONObject(responseText) - return@withContext json.getString("assetId") + val assetId = json.getString("assetId") + val properties = mutableMapOf() + if (json.has("properties") && !json.isNull("properties")) { + val propertiesJson = json.getJSONObject("properties") + propertiesJson.keys().forEach { key -> + properties[key] = propertiesJson.getString(key) + } + } + return@withContext ProvisionResult(assetId = assetId, properties = properties) } catch (e: DeviceProvisionAPIError) { throw e } catch (e: Exception) {