diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 43d3b7e..d5c9eea 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject import com.casic.br.R import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout import com.casic.br.utils.CommandManager import com.casic.br.utils.SliderCallback import com.casic.br.view.device.waterheater.GasConsumeActivity @@ -48,12 +50,15 @@ when (checkedId) { R.id.kitchenRadioButton -> { maxTemp = 60 + kitchenTimeLayout.enableLayout(timeSeekBar) } R.id.showerRadioButton -> { maxTemp = 60 + kitchenTimeLayout.disableLayout(timeSeekBar) } R.id.tempRadioButton -> { maxTemp = 48 + kitchenTimeLayout.disableLayout(timeSeekBar) } } setTemperatureScope() diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 43d3b7e..d5c9eea 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject import com.casic.br.R import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout import com.casic.br.utils.CommandManager import com.casic.br.utils.SliderCallback import com.casic.br.view.device.waterheater.GasConsumeActivity @@ -48,12 +50,15 @@ when (checkedId) { R.id.kitchenRadioButton -> { maxTemp = 60 + kitchenTimeLayout.enableLayout(timeSeekBar) } R.id.showerRadioButton -> { maxTemp = 60 + kitchenTimeLayout.disableLayout(timeSeekBar) } R.id.tempRadioButton -> { maxTemp = 48 + kitchenTimeLayout.disableLayout(timeSeekBar) } } setTemperatureScope() diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt index c2e436b..60ccad8 100644 --- a/app/src/main/java/com/casic/br/utils/CommandManager.kt +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -1,9 +1,13 @@ package com.casic.br.utils import android.util.Log +import com.tuya.smart.android.device.builder.TuyaTimerBuilder +import com.tuya.smart.android.device.enums.TimerDeviceTypeEnum +import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IResultCallback import com.tuya.smart.sdk.api.ITuyaDevice + object CommandManager { private const val kTag = "CommandManager" @@ -30,4 +34,30 @@ } }) } + + //TODO 待涂鸦确认 + fun addDeviceTimer( + taskName: String, deviceId: String, dps: String, loops: String, aliasName: String, + status: Int, appPush: Boolean + ) { + val builder = TuyaTimerBuilder.Builder() + .taskName(taskName) + .devId(deviceId) + .deviceType(TimerDeviceTypeEnum.DEVICE) + .actions(dps) + .loops(loops) + .aliasName(aliasName) + .status(status) + .appPush(appPush) + .build() + TuyaHomeSdk.getTimerInstance().addTimer(builder, object : IResultCallback { + override fun onError(code: String?, error: String?) { + + } + + override fun onSuccess() { + + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 43d3b7e..d5c9eea 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject import com.casic.br.R import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout import com.casic.br.utils.CommandManager import com.casic.br.utils.SliderCallback import com.casic.br.view.device.waterheater.GasConsumeActivity @@ -48,12 +50,15 @@ when (checkedId) { R.id.kitchenRadioButton -> { maxTemp = 60 + kitchenTimeLayout.enableLayout(timeSeekBar) } R.id.showerRadioButton -> { maxTemp = 60 + kitchenTimeLayout.disableLayout(timeSeekBar) } R.id.tempRadioButton -> { maxTemp = 48 + kitchenTimeLayout.disableLayout(timeSeekBar) } } setTemperatureScope() diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt index c2e436b..60ccad8 100644 --- a/app/src/main/java/com/casic/br/utils/CommandManager.kt +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -1,9 +1,13 @@ package com.casic.br.utils import android.util.Log +import com.tuya.smart.android.device.builder.TuyaTimerBuilder +import com.tuya.smart.android.device.enums.TimerDeviceTypeEnum +import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IResultCallback import com.tuya.smart.sdk.api.ITuyaDevice + object CommandManager { private const val kTag = "CommandManager" @@ -30,4 +34,30 @@ } }) } + + //TODO 待涂鸦确认 + fun addDeviceTimer( + taskName: String, deviceId: String, dps: String, loops: String, aliasName: String, + status: Int, appPush: Boolean + ) { + val builder = TuyaTimerBuilder.Builder() + .taskName(taskName) + .devId(deviceId) + .deviceType(TimerDeviceTypeEnum.DEVICE) + .actions(dps) + .loops(loops) + .aliasName(aliasName) + .status(status) + .appPush(appPush) + .build() + TuyaHomeSdk.getTimerInstance().addTimer(builder, object : IResultCallback { + override fun onError(code: String?, error: String?) { + + } + + override fun onSuccess() { + + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt index ffa9f8a..e3f99ac 100644 --- a/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt @@ -61,6 +61,7 @@ Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) parseObject.keys.forEach { + //TODO 需要把单次的数据存到后台 when (it) { "105" -> onceWaterUsedView.text = String.format("${parseObject[it] as Int}L") @@ -160,7 +161,7 @@ } /** - * 设置温度范围 + * 设置折线统计数据 * */ private fun setLineChartData() { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 43d3b7e..d5c9eea 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject import com.casic.br.R import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout import com.casic.br.utils.CommandManager import com.casic.br.utils.SliderCallback import com.casic.br.view.device.waterheater.GasConsumeActivity @@ -48,12 +50,15 @@ when (checkedId) { R.id.kitchenRadioButton -> { maxTemp = 60 + kitchenTimeLayout.enableLayout(timeSeekBar) } R.id.showerRadioButton -> { maxTemp = 60 + kitchenTimeLayout.disableLayout(timeSeekBar) } R.id.tempRadioButton -> { maxTemp = 48 + kitchenTimeLayout.disableLayout(timeSeekBar) } } setTemperatureScope() diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt index c2e436b..60ccad8 100644 --- a/app/src/main/java/com/casic/br/utils/CommandManager.kt +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -1,9 +1,13 @@ package com.casic.br.utils import android.util.Log +import com.tuya.smart.android.device.builder.TuyaTimerBuilder +import com.tuya.smart.android.device.enums.TimerDeviceTypeEnum +import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IResultCallback import com.tuya.smart.sdk.api.ITuyaDevice + object CommandManager { private const val kTag = "CommandManager" @@ -30,4 +34,30 @@ } }) } + + //TODO 待涂鸦确认 + fun addDeviceTimer( + taskName: String, deviceId: String, dps: String, loops: String, aliasName: String, + status: Int, appPush: Boolean + ) { + val builder = TuyaTimerBuilder.Builder() + .taskName(taskName) + .devId(deviceId) + .deviceType(TimerDeviceTypeEnum.DEVICE) + .actions(dps) + .loops(loops) + .aliasName(aliasName) + .status(status) + .appPush(appPush) + .build() + TuyaHomeSdk.getTimerInstance().addTimer(builder, object : IResultCallback { + override fun onError(code: String?, error: String?) { + + } + + override fun onSuccess() { + + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt index ffa9f8a..e3f99ac 100644 --- a/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt @@ -61,6 +61,7 @@ Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) parseObject.keys.forEach { + //TODO 需要把单次的数据存到后台 when (it) { "105" -> onceWaterUsedView.text = String.format("${parseObject[it] as Int}L") @@ -160,7 +161,7 @@ } /** - * 设置温度范围 + * 设置折线统计数据 * */ private fun setLineChartData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt index 25f89bc..36f3838 100644 --- a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -11,17 +11,27 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.tuya.smart.android.common.utils.Base64 +import com.tuya.smart.android.common.utils.HexUtil import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_time_config.* import kotlinx.android.synthetic.main.include_base_title.* +/** + * TODO 时间预约指令不对 + * */ class TimeConfigActivity : KotlinBaseActivity() { private val kTag = "TimeConfigActivity" + private lateinit var deviceId: String private lateinit var deviceInstance: ITuyaDevice + private var selectedTime: String? = null + private var selectedTemp: String? = null override fun initLayoutView(): Int = R.layout.activity_time_config @@ -38,18 +48,18 @@ } override fun initData() { - val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + CommandManager.getTuyaDp(deviceInstance, "16") deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) parseObject.keys.forEach { - when (it) { - "16" -> { + //{"16":"070009002400120014002400"} + if (it == "16") { - } } } } @@ -60,8 +70,8 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - val selectedTime = data.getStringExtra("selectedTime") - val selectedTemp = data.getStringExtra("selectedTemp") + selectedTime = data.getStringExtra("selectedTime") + selectedTemp = data.getStringExtra("selectedTemp") timeConfigView.text = selectedTime tempConfigView.text = String.format("水温:$selectedTemp") @@ -73,8 +83,51 @@ timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) } - timeConfigSwitch.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + timeConfigSwitch.setOnCheckedChangeListener { view, isChecked -> + val status = if (isChecked) { + 1 + } else { + 0 + } + + /** + * 循环次数,格式为 0000000,每一位数字的取值可以是 + * 0:关闭 + * 1:开启 + * 从左至右依次表示周日、周一、周二、周三、周四、周五、周六。 + * 如每个周一循环该任务,则取值为 0100000。 + * 0000000 表示只执行一次,1111111 表示每天执行。 + * + * 设备功能(dps)的操作任务的 JSON 格式表达方式,格式为 {"dps":{}, "time":""}, + * 其中 Raw 类型的 DP 需要转换格式, + * 转换方式为:new String(Base64.encodeBase64(HexUtil.hexStringToBytes(dps))) + * */ + + if (selectedTime.isNullOrBlank() || selectedTemp.isNullOrBlank()) { + "请先设置热水器参数".show(this) + view.isChecked = false + return@setOnCheckedChangeListener + } + val dps = "16".createCommand(selectedTemp!!) + Log.d(kTag, "dps: $dps") + val dpsRaw = String(Base64.encodeBase64(HexUtil.hexStringToBytes(dps))) + val map = HashMap() + map["dps"] = dpsRaw + map["time"] = selectedTime!! + val actions = map.toJson() + + //{"dps":{"16":"36°C"}, "time":"9:20"} + Log.d(kTag, "actions: $actions") + + CommandManager.addDeviceTimer( + "预约时间设定", + deviceId, + "{\"dps\":{\"16\":\"36°C\"}, \"time\":\"9:20\"}", + "0000000", + "热水器", + status, + true + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 43d3b7e..d5c9eea 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject import com.casic.br.R import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout import com.casic.br.utils.CommandManager import com.casic.br.utils.SliderCallback import com.casic.br.view.device.waterheater.GasConsumeActivity @@ -48,12 +50,15 @@ when (checkedId) { R.id.kitchenRadioButton -> { maxTemp = 60 + kitchenTimeLayout.enableLayout(timeSeekBar) } R.id.showerRadioButton -> { maxTemp = 60 + kitchenTimeLayout.disableLayout(timeSeekBar) } R.id.tempRadioButton -> { maxTemp = 48 + kitchenTimeLayout.disableLayout(timeSeekBar) } } setTemperatureScope() diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt index c2e436b..60ccad8 100644 --- a/app/src/main/java/com/casic/br/utils/CommandManager.kt +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -1,9 +1,13 @@ package com.casic.br.utils import android.util.Log +import com.tuya.smart.android.device.builder.TuyaTimerBuilder +import com.tuya.smart.android.device.enums.TimerDeviceTypeEnum +import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IResultCallback import com.tuya.smart.sdk.api.ITuyaDevice + object CommandManager { private const val kTag = "CommandManager" @@ -30,4 +34,30 @@ } }) } + + //TODO 待涂鸦确认 + fun addDeviceTimer( + taskName: String, deviceId: String, dps: String, loops: String, aliasName: String, + status: Int, appPush: Boolean + ) { + val builder = TuyaTimerBuilder.Builder() + .taskName(taskName) + .devId(deviceId) + .deviceType(TimerDeviceTypeEnum.DEVICE) + .actions(dps) + .loops(loops) + .aliasName(aliasName) + .status(status) + .appPush(appPush) + .build() + TuyaHomeSdk.getTimerInstance().addTimer(builder, object : IResultCallback { + override fun onError(code: String?, error: String?) { + + } + + override fun onSuccess() { + + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt index ffa9f8a..e3f99ac 100644 --- a/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/waterheater/GasConsumeActivity.kt @@ -61,6 +61,7 @@ Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) parseObject.keys.forEach { + //TODO 需要把单次的数据存到后台 when (it) { "105" -> onceWaterUsedView.text = String.format("${parseObject[it] as Int}L") @@ -160,7 +161,7 @@ } /** - * 设置温度范围 + * 设置折线统计数据 * */ private fun setLineChartData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt index 25f89bc..36f3838 100644 --- a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -11,17 +11,27 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.tuya.smart.android.common.utils.Base64 +import com.tuya.smart.android.common.utils.HexUtil import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_time_config.* import kotlinx.android.synthetic.main.include_base_title.* +/** + * TODO 时间预约指令不对 + * */ class TimeConfigActivity : KotlinBaseActivity() { private val kTag = "TimeConfigActivity" + private lateinit var deviceId: String private lateinit var deviceInstance: ITuyaDevice + private var selectedTime: String? = null + private var selectedTemp: String? = null override fun initLayoutView(): Int = R.layout.activity_time_config @@ -38,18 +48,18 @@ } override fun initData() { - val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + CommandManager.getTuyaDp(deviceInstance, "16") deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) parseObject.keys.forEach { - when (it) { - "16" -> { + //{"16":"070009002400120014002400"} + if (it == "16") { - } } } } @@ -60,8 +70,8 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - val selectedTime = data.getStringExtra("selectedTime") - val selectedTemp = data.getStringExtra("selectedTemp") + selectedTime = data.getStringExtra("selectedTime") + selectedTemp = data.getStringExtra("selectedTemp") timeConfigView.text = selectedTime tempConfigView.text = String.format("水温:$selectedTemp") @@ -73,8 +83,51 @@ timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) } - timeConfigSwitch.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + timeConfigSwitch.setOnCheckedChangeListener { view, isChecked -> + val status = if (isChecked) { + 1 + } else { + 0 + } + + /** + * 循环次数,格式为 0000000,每一位数字的取值可以是 + * 0:关闭 + * 1:开启 + * 从左至右依次表示周日、周一、周二、周三、周四、周五、周六。 + * 如每个周一循环该任务,则取值为 0100000。 + * 0000000 表示只执行一次,1111111 表示每天执行。 + * + * 设备功能(dps)的操作任务的 JSON 格式表达方式,格式为 {"dps":{}, "time":""}, + * 其中 Raw 类型的 DP 需要转换格式, + * 转换方式为:new String(Base64.encodeBase64(HexUtil.hexStringToBytes(dps))) + * */ + + if (selectedTime.isNullOrBlank() || selectedTemp.isNullOrBlank()) { + "请先设置热水器参数".show(this) + view.isChecked = false + return@setOnCheckedChangeListener + } + val dps = "16".createCommand(selectedTemp!!) + Log.d(kTag, "dps: $dps") + val dpsRaw = String(Base64.encodeBase64(HexUtil.hexStringToBytes(dps))) + val map = HashMap() + map["dps"] = dpsRaw + map["time"] = selectedTime!! + val actions = map.toJson() + + //{"dps":{"16":"36°C"}, "time":"9:20"} + Log.d(kTag, "actions: $actions") + + CommandManager.addDeviceTimer( + "预约时间设定", + deviceId, + "{\"dps\":{\"16\":\"36°C\"}, \"time\":\"9:20\"}", + "0000000", + "热水器", + status, + true + ) } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index fdc0ff8..fbca779 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -172,6 +172,7 @@