diff --git a/devices/generic/constants.json b/devices/generic/constants.json
index dbe320a635..6eeff4075f 100644
--- a/devices/generic/constants.json
+++ b/devices/generic/constants.json
@@ -19,6 +19,7 @@
"$TYPE_CARBONMONOXIDE_SENSOR": "ZHACarbonMonoxide",
"$TYPE_FORMALDEHYDE_SENSOR": "ZHAFormaldehyde",
"$TYPE_PARTICULATEMATTER_SENSOR": "ZHAParticulateMatter",
+ "$TYPE_CONTROL_SENSOR": "ZHAControl",
"$TYPE_ALARM_SENSOR": "ZHAAlarm",
"$TYPE_ANCILLARY_CONTROL": "ZHAAncillaryControl",
"$TYPE_BATTERY_SENSOR": "ZHABattery",
diff --git a/devices/generic/items/config_learnkey_item.json b/devices/generic/items/config_learnkey_item.json
new file mode 100644
index 0000000000..8783a870ea
--- /dev/null
+++ b/devices/generic/items/config_learnkey_item.json
@@ -0,0 +1,8 @@
+{
+ "schema": "resourceitem1.schema.json",
+ "id": "config/learnkey",
+ "datatype": "String",
+ "access": "RW",
+ "public": true,
+ "description": "Memorise code."
+}
diff --git a/devices/generic/items/config_sendkey_item.json b/devices/generic/items/config_sendkey_item.json
new file mode 100644
index 0000000000..e1036e2f7b
--- /dev/null
+++ b/devices/generic/items/config_sendkey_item.json
@@ -0,0 +1,8 @@
+{
+ "schema": "resourceitem1.schema.json",
+ "id": "config/sendkey",
+ "datatype": "String",
+ "access": "RW",
+ "public": true,
+ "description": "Send a code."
+}
diff --git a/devices/generic/subdevices/control_sensor.json b/devices/generic/subdevices/control_sensor.json
new file mode 100644
index 0000000000..7c3575a8a5
--- /dev/null
+++ b/devices/generic/subdevices/control_sensor.json
@@ -0,0 +1,17 @@
+{
+ "schema": "subdevice1.schema.json",
+ "type": "$TYPE_CONTROL_SENSOR",
+ "name": "ZHAControl",
+ "restapi": "/sensors",
+ "order": 20,
+ "uuid": [
+ "$address.ext",
+ "0x01",
+ "0xFC82"
+ ],
+ "items": [
+ "config/on",
+ "config/reachable",
+ "state/lastupdated"
+ ]
+}
diff --git a/devices/heiman/HS2IRC_IR_control.json b/devices/heiman/HS2IRC_IR_control.json
new file mode 100644
index 0000000000..42f6b8647e
--- /dev/null
+++ b/devices/heiman/HS2IRC_IR_control.json
@@ -0,0 +1,81 @@
+{
+ "schema": "devcap1.schema.json",
+ "manufacturername": "HEIMAN",
+ "modelid": "IRControl-EM",
+ "vendor": "HEIMAN",
+ "product": "HS2IRC",
+ "sleeper": false,
+ "status": "Gold",
+ "subdevices": [
+ {
+ "type": "$TYPE_CONTROL_SENSOR",
+ "restapi": "/sensors",
+ "uuid": [
+ "$address.ext",
+ "0x01",
+ "0xFC82"
+ ],
+ "items": [
+ {
+ "name": "attr/id"
+ },
+ {
+ "name": "attr/lastannounced"
+ },
+ {
+ "name": "attr/lastseen"
+ },
+ {
+ "name": "attr/manufacturername"
+ },
+ {
+ "name": "attr/modelid"
+ },
+ {
+ "name": "attr/name"
+ },
+ {
+ "name": "attr/swversion"
+ },
+ {
+ "name": "attr/type"
+ },
+ {
+ "name": "attr/uniqueid"
+ },
+ {
+ "name": "state/lastupdated"
+ },
+ {
+ "name": "config/sendkey",
+ "write": {
+ "fn": "zcl:cmd",
+ "ep": "0x01",
+ "cl": "0xfc82",
+ "cmd": "0xf0",
+ "eval": "('0'+parseInt(Item.val.split(',')[0]).toString(16)).slice(-2) + ('0'+parseInt(Item.val.split(',')[1]).toString(16)).slice(-2);"
+ }
+ },
+ {
+ "name": "config/learnkey",
+ "write": {
+ "fn": "zcl:cmd",
+ "ep": "0x01",
+ "cl": "0xfc82",
+ "cmd": "0xf1",
+ "eval": "('0'+parseInt(Item.val.split(',')[0]).toString(16)).slice(-2) + ('0'+parseInt(Item.val.split(',')[1]).toString(16)).slice(-2);"
+ }
+ },
+ {
+ "name": "config/reachable"
+ },
+ {
+ "name": "config/on"
+ },
+ {
+ "name": "config/reachable"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/general.xml b/general.xml
index 7690ccaa73..ddfb02bd5e 100644
--- a/general.xml
+++ b/general.xml
@@ -5253,6 +5253,68 @@ These devices can operate on either battery or mains power, and can have a wide
+
+
+ Heiman specific attributes for the device HS2IRC.
+
+
+ Create model ID
+
+
+
+
+
+ Learn new code
+
+
+
+
+
+
+ Send a key
+
+
+
+
+
+
+ Delete a key
+
+
+
+
+
+
+ Get list code
+
+
+
+
+ The Response to the learn key request.
+
+
+
+
+
+
+
+ The Response to the Get list request.
+
+
+
+
+
+
+
+ The Response to the Create model request.
+
+
+
+
+
+
+
+
Tuya Specific switch mode cluster.