use of io.openems.api.device.Device in project openems by OpenEMS.
the class ThingRepository method addThing.
/**
* Add a Thing to the Repository and cache its Channels and other information for later usage.
*
* @param thing
*/
public synchronized void addThing(Thing thing) {
if (thingIds.containsValue(thing)) {
// Thing was already added
return;
}
// Add to thingIds
thingIds.forcePut(thing.id(), thing);
// Add to thingClasses
thingClasses.put(thing.getClass(), thing);
// Add to bridges
if (thing instanceof Bridge) {
bridges.add((Bridge) thing);
}
// Add to schedulers
if (thing instanceof Scheduler) {
schedulers.add((Scheduler) thing);
}
// Add to persistences
if (thing instanceof Persistence) {
persistences.add((Persistence) thing);
}
// Add to queryablePersistences
if (thing instanceof QueryablePersistence) {
queryablePersistences.add((QueryablePersistence) thing);
}
// Add to device natures
if (thing instanceof DeviceNature) {
deviceNatures.add((DeviceNature) thing);
}
// Add Listener
thing.addListener(this);
// Apply channel annotation (this happens now and again after initializing the thing via init()
this.applyChannelAnnotation(thing);
// Add Channels thingConfigChannels
ThingDoc thingDoc = classRepository.getThingDoc(thing.getClass());
for (ChannelDoc channelDoc : thingDoc.getChannelDocs()) {
Member member = channelDoc.getMember();
try {
List<Channel> channels = new ArrayList<>();
java.util.function.Consumer<Channel> addToChannels = (c) -> {
if (c == null) {
// TODO this error is not handled properly
// log.error(
// "Channel is returning null! Thing [" + thing.id() + "], Member [" + member.getName() + "]");
} else {
channels.add(c);
}
};
if (member instanceof Method) {
if (((Method) member).getReturnType().isArray()) {
Channel[] ch = (Channel[]) ((Method) member).invoke(thing);
for (Channel c : ch) {
addToChannels.accept(c);
}
} else {
// It's a Method with ReturnType Channel
Channel c = (Channel) ((Method) member).invoke(thing);
addToChannels.accept(c);
if (c instanceof ThingStateChannels) {
ThingStateChannels tsc = (ThingStateChannels) c;
for (ThingStateChannel fc : tsc.getFaultChannels()) {
addToChannels.accept(fc);
}
for (ThingStateChannel wc : tsc.getWarningChannels()) {
addToChannels.accept(wc);
}
}
}
} else if (member instanceof Field) {
// It's a Field with Type Channel
Channel c = (Channel) ((Field) member).get(thing);
addToChannels.accept(c);
} else {
continue;
}
if (channels.isEmpty()) {
continue;
}
for (Channel channel : channels) {
// Add Channel to thingChannels
thingChannels.put(thing, channel.id(), channel);
if (channel instanceof ConfigChannel) {
// Add Channel to configChannels
thingConfigChannels.put(thing, (ConfigChannel<?>) channel);
}
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
log.warn("Unable to add Channel. Member [" + member.getName() + "]", e);
}
}
for (ThingsChangedListener listener : thingListeners) {
listener.thingChanged(thing, Action.ADD);
}
}
use of io.openems.api.device.Device in project openems by OpenEMS.
the class ThingRepository method createDevice.
public Device createDevice(JsonObject jDevice, Bridge parent) throws OpenemsException {
String deviceClass = JsonUtils.getAsString(jDevice, "class");
Device device = (Device) InjectionUtils.getThingInstance(deviceClass, parent);
log.info("Add Device[" + device.id() + "], Implementation[" + device.getClass().getSimpleName() + "]");
this.addThing(device);
// instantiate DeviceNatures with Device reference
ConfigUtils.injectConfigChannels(this.getConfigChannels(device), jDevice, device);
return device;
}
Aggregations