use of org.eclipse.smarthome.binding.mqtt.generic.internal.generic.ChannelState in project smarthome by eclipse.
the class GenericThingHandler method initialize.
@Override
public void initialize() {
List<ChannelUID> configErrors = new ArrayList<>();
for (Channel channel : thing.getChannels()) {
final ChannelTypeUID channelTypeUID = channel.getChannelTypeUID();
if (channelTypeUID == null) {
logger.warn("Channel {} has no type", channel.getLabel());
continue;
}
final ChannelConfig channelConfig = channel.getConfiguration().as(ChannelConfig.class);
try {
Value value = ValueFactory.createValueState(channelConfig, channelTypeUID.getId());
ChannelState channelState = createChannelState(channelConfig, channel.getUID(), value);
channelStateByChannelUID.put(channel.getUID(), channelState);
StateDescription description = value.createStateDescription(channelConfig.unit, StringUtils.isBlank(channelConfig.commandTopic));
stateDescProvider.setDescription(channel.getUID(), description);
} catch (IllegalArgumentException e) {
logger.warn("Channel configuration error", e);
configErrors.add(channel.getUID());
}
}
// in question to the user.
if (configErrors.isEmpty()) {
super.initialize();
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "Remove and recreate: " + configErrors.stream().map(e -> e.getAsString()).collect(Collectors.joining(",")));
}
}
use of org.eclipse.smarthome.binding.mqtt.generic.internal.generic.ChannelState in project smarthome by eclipse.
the class Property method createChannelFromAttribute.
public void createChannelFromAttribute() {
final String commandTopic = topic + "/set";
final String stateTopic = topic;
Value value;
Boolean isDecimal = null;
switch(attributes.datatype) {
case boolean_:
value = new OnOffValue("true", "false");
break;
case color_:
value = new ColorValue(attributes.format.contains("rgb"), null, null, 100);
break;
case enum_:
String[] enumValues = attributes.format.split(",");
value = new TextValue(enumValues);
break;
case float_:
case integer_:
isDecimal = attributes.datatype == DataTypeEnum.float_;
String[] s = attributes.format.split("\\:");
BigDecimal min = s.length == 2 ? convertFromString(s[0]) : null;
BigDecimal max = s.length == 2 ? convertFromString(s[1]) : null;
BigDecimal step = (min != null && max != null) ? max.subtract(min).divide(new BigDecimal(100.0), new MathContext(isDecimal ? 2 : 0)) : null;
if (step != null && !isDecimal && step.intValue() <= 0) {
step = new BigDecimal(1);
}
value = new NumberValue(min, max, step);
break;
case string_:
case unknown:
default:
value = new TextValue();
break;
}
ChannelConfigBuilder b = ChannelConfigBuilder.create().makeTrigger(!attributes.retained).withStateTopic(stateTopic);
if (isDecimal != null && !isDecimal) {
// Apply formatter to only publish integers
b = b.withFormatter("%d");
}
if (attributes.settable) {
b = b.withCommandTopic(commandTopic);
}
final ChannelState channelState = new ChannelState(b.build(), channelUID, value, callback);
this.channelState = channelState;
final ChannelType type = createChannelType(attributes, channelState);
this.type = type;
this.channel = ChannelBuilder.create(channelUID, type.getItemType()).withType(type.getUID()).withKind(type.getKind()).withLabel(attributes.name).withConfiguration(new Configuration(attributes.asMap())).build();
}
Aggregations