[miio] additional vacuum channels for advanced rules (#10180)
* [miio] add feature channels * [miio] additional vacuum channels for advanced rules * [miio] update readme Signed-off-by: Marcel Verpaalen <marcel@verpaalen.com>
This commit is contained in:
parent
8928e8520c
commit
d1d42c4de9
@ -245,8 +245,20 @@ Image map "Cleaning Map" (gVacLast) {channel="miio:vacuum:034F0E45:cleaning#map"
|
|||||||
|
|
||||||
Note: cleaning map is only available with cloud access.
|
Note: cleaning map is only available with cloud access.
|
||||||
|
|
||||||
Additionally depending on the capabilities of your robot vacuum other channels may be enabled at runtime
|
There are several advanced channels, which may be useful in rules (e.g. for individual room cleaning etc)
|
||||||
|
In case your vacuum does not support one of these commands, it will show "unsupported_method" for string channels or no value for numeric channels.
|
||||||
|
|
||||||
|
| Type | Channel | Description |
|
||||||
|
|---------|-----------------------------------|----------------------------|
|
||||||
|
| Number | status#segment_status | Segment Status |
|
||||||
|
| Number | status#map_status | Map Box Status |
|
||||||
|
| Number | status#led_status | Led Box Status |
|
||||||
|
| String | info#carpet_mode | Carpet Mode details |
|
||||||
|
| String | info#fw_features | Firmware Features |
|
||||||
|
| String | info#room_mapping | Room Mapping details |
|
||||||
|
| String | info#multi_maps_list | Maps Listing details |
|
||||||
|
|
||||||
|
Additionally depending on the capabilities of your robot vacuum other channels may be enabled at runtime
|
||||||
|
|
||||||
| Type | Channel | Description |
|
| Type | Channel | Description |
|
||||||
|---------|-----------------------------------|----------------------------|
|
|---------|-----------------------------------|----------------------------|
|
||||||
|
|||||||
@ -2663,7 +2663,7 @@ e.g. `openhab:send actionCommand 'upd_timer["1498595904821", "on"]'` would enabl
|
|||||||
|----------------------|----------------------|------------------------------------------|------------|
|
|----------------------|----------------------|------------------------------------------|------------|
|
||||||
| power | Switch | Power | |
|
| power | Switch | Power | |
|
||||||
| brightness | Dimmer | Brightness | |
|
| brightness | Dimmer | Brightness | |
|
||||||
| ambientBrightness | Number | Ambient Brightness | |
|
| ambientBrightness | Dimmer | Ambient Brightness | |
|
||||||
| delayoff | Number:Time | Shutdown Timer | |
|
| delayoff | Number:Time | Shutdown Timer | |
|
||||||
| colorTemperature | Number | Color Temperature | |
|
| colorTemperature | Number | Color Temperature | |
|
||||||
| colorMode | Number | Color Mode | |
|
| colorMode | Number | Color Mode | |
|
||||||
@ -2759,7 +2759,7 @@ e.g. `openhab:send actionCommand 'upd_timer["1498595904821", "on"]'` would enabl
|
|||||||
|----------------------|----------------------|------------------------------------------|------------|
|
|----------------------|----------------------|------------------------------------------|------------|
|
||||||
| power | Switch | Power | |
|
| power | Switch | Power | |
|
||||||
| brightness | Dimmer | Brightness | |
|
| brightness | Dimmer | Brightness | |
|
||||||
| ambientBrightness | Number | Ambient Brightness | |
|
| ambientBrightness | Dimmer | Ambient Brightness | |
|
||||||
| delayoff | Number:Time | Shutdown Timer | |
|
| delayoff | Number:Time | Shutdown Timer | |
|
||||||
| colorTemperature | Number | Color Temperature | |
|
| colorTemperature | Number | Color Temperature | |
|
||||||
| colorMode | Number | Color Mode | |
|
| colorMode | Number | Color Mode | |
|
||||||
@ -4543,8 +4543,20 @@ Image map "Cleaning Map" (gVacLast) {channel="miio:vacuum:034F0E45:cleaning#map"
|
|||||||
|
|
||||||
Note: cleaning map is only available with cloud access.
|
Note: cleaning map is only available with cloud access.
|
||||||
|
|
||||||
Additionally depending on the capabilities of your robot vacuum other channels may be enabled at runtime
|
There are several advanced channels, which may be useful in rules (e.g. for individual room cleaning etc)
|
||||||
|
In case your vacuum does not support one of these commands, it will show "unsupported_method" for string channels or no value for numeric channels.
|
||||||
|
|
||||||
|
| Type | Channel | Description |
|
||||||
|
|---------|-----------------------------------|----------------------------|
|
||||||
|
| Number | status#segment_status | Segment Status |
|
||||||
|
| Number | status#map_status | Map Box Status |
|
||||||
|
| Number | status#led_status | Led Box Status |
|
||||||
|
| String | info#carpet_mode | Carpet Mode details |
|
||||||
|
| String | info#fw_features | Firmware Features |
|
||||||
|
| String | info#room_mapping | Room Mapping details |
|
||||||
|
| String | info#multi_maps_list | Maps Listing details |
|
||||||
|
|
||||||
|
Additionally depending on the capabilities of your robot vacuum other channels may be enabled at runtime
|
||||||
|
|
||||||
| Type | Channel | Description |
|
| Type | Channel | Description |
|
||||||
|---------|-----------------------------------|----------------------------|
|
|---------|-----------------------------------|----------------------------|
|
||||||
@ -7155,7 +7167,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
|
|||||||
Group G_light "Yeelight LED Ceiling Light" <status>
|
Group G_light "Yeelight LED Ceiling Light" <status>
|
||||||
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
|
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
|
||||||
Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
|
Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
|
||||||
Number ambientBrightness "Ambient Brightness" (G_light) {channel="miio:basic:light:ambientBrightness"}
|
Dimmer ambientBrightness "Ambient Brightness" (G_light) {channel="miio:basic:light:ambientBrightness"}
|
||||||
Number:Time delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
|
Number:Time delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
|
||||||
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
|
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
|
||||||
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
|
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
|
||||||
@ -7272,7 +7284,7 @@ note: Autogenerated example. Replace the id (light) in the channel with your own
|
|||||||
Group G_light "Yeelight Crystal Pendant Lamp" <status>
|
Group G_light "Yeelight Crystal Pendant Lamp" <status>
|
||||||
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
|
Switch power "Power" (G_light) {channel="miio:basic:light:power"}
|
||||||
Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
|
Dimmer brightness "Brightness" (G_light) {channel="miio:basic:light:brightness"}
|
||||||
Number ambientBrightness "Ambient Brightness" (G_light) {channel="miio:basic:light:ambientBrightness"}
|
Dimmer ambientBrightness "Ambient Brightness" (G_light) {channel="miio:basic:light:ambientBrightness"}
|
||||||
Number:Time delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
|
Number:Time delayoff "Shutdown Timer" (G_light) {channel="miio:basic:light:delayoff"}
|
||||||
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
|
Number colorTemperature "Color Temperature" (G_light) {channel="miio:basic:light:colorTemperature"}
|
||||||
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
|
Number colorMode "Color Mode" (G_light) {channel="miio:basic:light:colorMode"}
|
||||||
|
|||||||
@ -86,6 +86,15 @@ public enum MiIoCommand {
|
|||||||
REMOTE_END("app_rc_end"),
|
REMOTE_END("app_rc_end"),
|
||||||
REMOTE_MOVE("app_rc_move"),
|
REMOTE_MOVE("app_rc_move"),
|
||||||
|
|
||||||
|
GET_MAP_STATUS("get_map_status"),
|
||||||
|
GET_SEGMENT_STATUS("get_segment_status"),
|
||||||
|
GET_LED_STATUS("get_led_status"),
|
||||||
|
GET_CARPET_MODE("get_carpet_mode"),
|
||||||
|
GET_FW_FEATURES("get_fw_features"),
|
||||||
|
GET_CUSTOMIZED_CLEAN_MODE("get_customize_clean_mode"),
|
||||||
|
GET_MULTI_MAP_LIST("get_multi_maps_list"),
|
||||||
|
GET_ROOM_MAPPING("get_room_mapping"),
|
||||||
|
|
||||||
UNKNOWN("");
|
UNKNOWN("");
|
||||||
|
|
||||||
private final String command;
|
private final String command;
|
||||||
|
|||||||
@ -22,10 +22,14 @@ import java.text.SimpleDateFormat;
|
|||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
@ -89,6 +93,12 @@ public class MiIoVacuumHandler extends MiIoAbstractHandler {
|
|||||||
private static final Gson GSON = new GsonBuilder().serializeNulls().create();
|
private static final Gson GSON = new GsonBuilder().serializeNulls().create();
|
||||||
private final ChannelUID mapChannelUid;
|
private final ChannelUID mapChannelUid;
|
||||||
|
|
||||||
|
private static final Set<RobotCababilities> FEATURES_CHANNELS = Collections.unmodifiableSet(Stream
|
||||||
|
.of(RobotCababilities.SEGMENT_STATUS, RobotCababilities.MAP_STATUS, RobotCababilities.LED_STATUS,
|
||||||
|
RobotCababilities.CARPET_MODE, RobotCababilities.FW_FEATURES, RobotCababilities.ROOM_MAPPING,
|
||||||
|
RobotCababilities.MULTI_MAP_LIST, RobotCababilities.CUSTOMIZE_CLEAN_MODE)
|
||||||
|
.collect(Collectors.toSet()));
|
||||||
|
|
||||||
private ExpiringCache<String> status;
|
private ExpiringCache<String> status;
|
||||||
private ExpiringCache<String> consumables;
|
private ExpiringCache<String> consumables;
|
||||||
private ExpiringCache<String> dnd;
|
private ExpiringCache<String> dnd;
|
||||||
@ -289,6 +299,7 @@ public class MiIoVacuumHandler extends MiIoAbstractHandler {
|
|||||||
safeUpdateState(CHANNEL_IN_CLEANING, statusInfo.getInCleaning());
|
safeUpdateState(CHANNEL_IN_CLEANING, statusInfo.getInCleaning());
|
||||||
safeUpdateState(CHANNEL_MAP_PRESENT, statusInfo.getMapPresent());
|
safeUpdateState(CHANNEL_MAP_PRESENT, statusInfo.getMapPresent());
|
||||||
if (statusInfo.getState() != null) {
|
if (statusInfo.getState() != null) {
|
||||||
|
stateId = statusInfo.getState();
|
||||||
StatusType state = StatusType.getType(statusInfo.getState());
|
StatusType state = StatusType.getType(statusInfo.getState());
|
||||||
updateState(CHANNEL_STATE, new StringType(state.getDescription()));
|
updateState(CHANNEL_STATE, new StringType(state.getDescription()));
|
||||||
updateState(CHANNEL_STATE_ID, new DecimalType(statusInfo.getState()));
|
updateState(CHANNEL_STATE_ID, new DecimalType(statusInfo.getState()));
|
||||||
@ -464,6 +475,11 @@ public class MiIoVacuumHandler extends MiIoAbstractHandler {
|
|||||||
map.getValue();
|
map.getValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (RobotCababilities cmd : FEATURES_CHANNELS) {
|
||||||
|
if (isLinked(cmd.getChannel())) {
|
||||||
|
sendCommand(cmd.getCommand());
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.debug("Error while updating '{}': '{}", getThing().getUID().toString(), e.getLocalizedMessage());
|
logger.debug("Error while updating '{}': '{}", getThing().getUID().toString(), e.getLocalizedMessage());
|
||||||
}
|
}
|
||||||
@ -530,11 +546,54 @@ public class MiIoVacuumHandler extends MiIoAbstractHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case GET_MAP_STATUS:
|
||||||
|
case GET_SEGMENT_STATUS:
|
||||||
|
case GET_LED_STATUS:
|
||||||
|
updateNumericChannel(response);
|
||||||
|
break;
|
||||||
|
case GET_CARPET_MODE:
|
||||||
|
case GET_FW_FEATURES:
|
||||||
|
case GET_CUSTOMIZED_CLEAN_MODE:
|
||||||
|
case GET_MULTI_MAP_LIST:
|
||||||
|
case GET_ROOM_MAPPING:
|
||||||
|
for (RobotCababilities cmd : FEATURES_CHANNELS) {
|
||||||
|
if (response.getCommand().getCommand().contentEquals(cmd.getCommand())) {
|
||||||
|
updateState(cmd.getChannel(), new StringType(response.getResult().toString()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateNumericChannel(MiIoSendCommand response) {
|
||||||
|
RobotCababilities capabilityChannel = null;
|
||||||
|
for (RobotCababilities cmd : FEATURES_CHANNELS) {
|
||||||
|
if (response.getCommand().getCommand().contentEquals(cmd.getCommand())) {
|
||||||
|
capabilityChannel = cmd;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (capabilityChannel != null) {
|
||||||
|
if (response.getResult().isJsonArray() && response.getResult().getAsJsonArray().get(0).isJsonPrimitive()) {
|
||||||
|
try {
|
||||||
|
Integer stat = response.getResult().getAsJsonArray().get(0).getAsInt();
|
||||||
|
updateState(capabilityChannel.getChannel(), new DecimalType(stat));
|
||||||
|
return;
|
||||||
|
} catch (ClassCastException | IllegalStateException e) {
|
||||||
|
logger.debug("Could not update numeric channel {} with '{}': {}", capabilityChannel.getChannel(),
|
||||||
|
response.getResult(), e.getMessage());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.debug("Could not update numeric channel {} with '{}': Not in expected format",
|
||||||
|
capabilityChannel.getChannel(), response.getResult());
|
||||||
|
}
|
||||||
|
updateState(capabilityChannel.getChannel(), UnDefType.UNDEF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setCapabilities(JsonObject statusResponse) {
|
private void setCapabilities(JsonObject statusResponse) {
|
||||||
for (RobotCababilities capability : RobotCababilities.values()) {
|
for (RobotCababilities capability : RobotCababilities.values()) {
|
||||||
if (statusResponse.has(capability.getStatusFieldName())) {
|
if (statusResponse.has(capability.getStatusFieldName())) {
|
||||||
|
|||||||
@ -23,23 +23,33 @@ import org.openhab.core.thing.type.ChannelTypeUID;
|
|||||||
@NonNullByDefault
|
@NonNullByDefault
|
||||||
public enum RobotCababilities {
|
public enum RobotCababilities {
|
||||||
|
|
||||||
WATERBOX_STATUS("water_box_status", "status#water_box_status", "miio:water_box_status"),
|
WATERBOX_STATUS("water_box_status", "status#water_box_status", "miio:water_box_status", ""),
|
||||||
LOCKSTATUS("lock_status", "status#lock_status", "miio:lock_status"),
|
LOCKSTATUS("lock_status", "status#lock_status", "miio:lock_status", ""),
|
||||||
WATERBOX_MODE("water_box_mode", "status#water_box_mode", "miio:water_box_mode"),
|
WATERBOX_MODE("water_box_mode", "status#water_box_mode", "miio:water_box_mode", ""),
|
||||||
WATERBOX_CARRIAGE("water_box_carriage_status", "status#water_box_carriage_status",
|
WATERBOX_CARRIAGE("water_box_carriage_status", "status#water_box_carriage_status", "miio:water_box_carriage_status",
|
||||||
"miio:water_box_carriage_status"),
|
""),
|
||||||
MOP_FORBIDDEN("mop_forbidden_enable", "status#mop_forbidden_enable", "miio:mop_forbidden_enable"),
|
MOP_FORBIDDEN("mop_forbidden_enable", "status#mop_forbidden_enable", "miio:mop_forbidden_enable", ""),
|
||||||
LOCATING("is_locating", "status#is_locating", "miio:is_locating"),
|
LOCATING("is_locating", "status#is_locating", "miio:is_locating", ""),
|
||||||
SEGMENT_CLEAN("", "actions#segment", "miio:segment");
|
SEGMENT_STATUS("", "status#segment_status", "miio:segment_status", "get_segment_status"),
|
||||||
|
MAP_STATUS("", "status#map_status", "miio:map_status", "get_map_status"),
|
||||||
|
LED_STATUS("", "status#led_status", "miio:led_status", "get_led_status"),
|
||||||
|
CARPET_MODE("", "info#carpet_mode", "miio:carpet_mode", "get_carpet_mode"),
|
||||||
|
FW_FEATURES("", "info#fw_features", "miio:fw_features", "get_fw_features"),
|
||||||
|
ROOM_MAPPING("", "info#room_mapping", "miio:room_mapping", "get_room_mapping"),
|
||||||
|
MULTI_MAP_LIST("", "info#multi_maps_list", "miio:multi_maps_list", "get_multi_maps_list"),
|
||||||
|
CUSTOMIZE_CLEAN_MODE("", "info#customize_clean_mode", "miio:customize_clean_mode", "get_customize_clean_mode"),
|
||||||
|
SEGMENT_CLEAN("", "actions#segment", "miio:segment", "");
|
||||||
|
|
||||||
private final String statusFieldName;
|
private final String statusFieldName;
|
||||||
private final String channel;
|
private final String channel;
|
||||||
private final String channelType;
|
private final String channelType;
|
||||||
|
private final String command;
|
||||||
|
|
||||||
RobotCababilities(String statusKey, String channel, String channelType) {
|
RobotCababilities(String statusKey, String channel, String channelType, String command) {
|
||||||
this.statusFieldName = statusKey;
|
this.statusFieldName = statusKey;
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
this.channelType = channelType;
|
this.channelType = channelType;
|
||||||
|
this.command = command;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getStatusFieldName() {
|
public String getStatusFieldName() {
|
||||||
@ -54,9 +64,14 @@ public enum RobotCababilities {
|
|||||||
return new ChannelTypeUID(channelType);
|
return new ChannelTypeUID(channelType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCommand() {
|
||||||
|
return command;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.format("Capability %s: status field name: '%s', channel: '%s', channeltype: '%s'.", this.name(),
|
return String.format("Capability %s: status field name: '%s', channel: '%s', channeltype: '%s'%s%s.",
|
||||||
statusFieldName, channel, channelType);
|
this.name(), statusFieldName, channel, channelType, command.isBlank() ? "" : ", custom command: ",
|
||||||
|
command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
<channel-group id="history" typeId="history"/>
|
<channel-group id="history" typeId="history"/>
|
||||||
<channel-group id="cleaning" typeId="cleaning"/>
|
<channel-group id="cleaning" typeId="cleaning"/>
|
||||||
<channel-group id="network" typeId="network"/>
|
<channel-group id="network" typeId="network"/>
|
||||||
|
<channel-group id="info" typeId="info"/>
|
||||||
</channel-groups>
|
</channel-groups>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@ -50,6 +51,9 @@
|
|||||||
<channel id="map_present" typeId="map_present"/>
|
<channel id="map_present" typeId="map_present"/>
|
||||||
<channel id="state" typeId="state"/>
|
<channel id="state" typeId="state"/>
|
||||||
<channel id="state_id" typeId="state_id"/>
|
<channel id="state_id" typeId="state_id"/>
|
||||||
|
<channel id="segment_status" typeId="segment_status"/>
|
||||||
|
<channel id="map_status" typeId="map_status"/>
|
||||||
|
<channel id="led_status" typeId="led_status"/>
|
||||||
</channels>
|
</channels>
|
||||||
</channel-group-type>
|
</channel-group-type>
|
||||||
<channel-group-type id="consumables">
|
<channel-group-type id="consumables">
|
||||||
@ -95,6 +99,16 @@
|
|||||||
<channel id="total_clean_count" typeId="total_clean_count"/>
|
<channel id="total_clean_count" typeId="total_clean_count"/>
|
||||||
</channels>
|
</channels>
|
||||||
</channel-group-type>
|
</channel-group-type>
|
||||||
|
<channel-group-type id="info">
|
||||||
|
<label>Info</label>
|
||||||
|
<channels>
|
||||||
|
<channel id="multi_maps_list" typeId="multi_maps_list"/>
|
||||||
|
<channel id="room_mapping" typeId="room_mapping"/>
|
||||||
|
<channel id="fw_features" typeId="fw_features"/>
|
||||||
|
<channel id="customize_clean_mode" typeId="customize_clean_mode"/>
|
||||||
|
<channel id="carpet_mode" typeId="carpet_mode"/>
|
||||||
|
</channels>
|
||||||
|
</channel-group-type>
|
||||||
|
|
||||||
<!-- Status channels -->
|
<!-- Status channels -->
|
||||||
<channel-type id="clean_area">
|
<channel-type id="clean_area">
|
||||||
@ -152,6 +166,21 @@
|
|||||||
<label>State ID</label>
|
<label>State ID</label>
|
||||||
<state readOnly="true"/>
|
<state readOnly="true"/>
|
||||||
</channel-type>
|
</channel-type>
|
||||||
|
<channel-type id="segment_status" advanced="true">
|
||||||
|
<item-type>Number</item-type>
|
||||||
|
<label>Segment Status</label>
|
||||||
|
<state pattern="%.0f" readOnly="true"/>
|
||||||
|
</channel-type>
|
||||||
|
<channel-type id="map_status" advanced="true">
|
||||||
|
<item-type>Number</item-type>
|
||||||
|
<label>Map Status</label>
|
||||||
|
<state pattern="%.0f" readOnly="true"/>
|
||||||
|
</channel-type>
|
||||||
|
<channel-type id="led_status" advanced="true">
|
||||||
|
<item-type>Number</item-type>
|
||||||
|
<label>Led Status</label>
|
||||||
|
<state pattern="%.0f" readOnly="true"/>
|
||||||
|
</channel-type>
|
||||||
|
|
||||||
<!-- Dynamic Status Channels -->
|
<!-- Dynamic Status Channels -->
|
||||||
<channel-type id="water_box_mode">
|
<channel-type id="water_box_mode">
|
||||||
@ -358,4 +387,29 @@
|
|||||||
<label>Cleaning Map</label>
|
<label>Cleaning Map</label>
|
||||||
<state readOnly="true"/>
|
<state readOnly="true"/>
|
||||||
</channel-type>
|
</channel-type>
|
||||||
|
|
||||||
|
<!-- Info channels -->
|
||||||
|
<channel-type id="fw_features" advanced="true">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>Firmware Features</label>
|
||||||
|
<state readOnly="true"/>
|
||||||
|
</channel-type>
|
||||||
|
<channel-type id="room_mapping" advanced="true">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>Room Mapping</label>
|
||||||
|
<state readOnly="true"/>
|
||||||
|
</channel-type>
|
||||||
|
<channel-type id="multi_maps_list" advanced="true">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>Multi Map List</label>
|
||||||
|
<state readOnly="true"/>
|
||||||
|
</channel-type>
|
||||||
|
<channel-type id="carpet_mode" advanced="true">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>Carpet Mode</label>
|
||||||
|
</channel-type>
|
||||||
|
<channel-type id="customize_clean_mode" advanced="true">
|
||||||
|
<item-type>String</item-type>
|
||||||
|
<label>Customized Clean Mode</label>
|
||||||
|
</channel-type>
|
||||||
</thing:thing-descriptions>
|
</thing:thing-descriptions>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user