use of io.openems.api.channel.ThingStateChannel 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.channel.ThingStateChannel in project openems by OpenEMS.
the class ThingStateChannels method updateState.
private void updateState() {
ThingState currentState = ThingState.RUN;
for (ThingStateChannel faultChannel : faultChannels) {
if (faultChannel.isValuePresent() && faultChannel.getValue()) {
currentState = ThingState.FAULT;
}
}
for (ThingStateChannel warningChannel : warningChannels) {
if (warningChannel.isValuePresent() && warningChannel.getValue() && currentState != ThingState.FAULT) {
currentState = ThingState.WARNING;
}
}
updateValue(currentState);
}
use of io.openems.api.channel.ThingStateChannel in project openems by OpenEMS.
the class Ess method toString.
@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append(//
ess.id() + " [" + "SOC:" + ess.soc().format() + "|");
if (ess instanceof SymmetricEssNature) {
SymmetricEssNature e = (SymmetricEssNature) ess;
b.append("L:" + e.activePower().format() + ";" + e.reactivePower().format());
}
if (ess instanceof AsymmetricEssNature && ess instanceof SymmetricEssNature) {
b.append("|");
}
if (ess instanceof AsymmetricEssNature) {
AsymmetricEssNature e = (AsymmetricEssNature) ess;
b.append(//
"L1:" + e.activePowerL1().format() + ";" + e.reactivePowerL1().format() + "|" + "L2:" + e.activePowerL2().format() + ";" + e.reactivePowerL2().format() + //
"|" + "L3:" + e.activePowerL3().format() + ";" + e.reactivePowerL3().format());
}
b.append(//
"|" + "Allowed:" + ess.allowedCharge().format() + ";" + ess.allowedDischarge().format());
b.append(//
"|" + "GridMode:" + ess.gridMode().labelOptional().orElse("unknown"));
List<ThingStateChannel> warningChannels = ess.getStateChannel().getWarningChannels().stream().filter(c -> c.isValuePresent() && c.getValue()).collect(Collectors.toList());
List<ThingStateChannel> faultChannels = ess.getStateChannel().getFaultChannels().stream().filter(c -> c.isValuePresent() && c.getValue()).collect(Collectors.toList());
if (warningChannels.size() > 0) {
b.append("|Warn:");
b.append(warningChannels.stream().map(c -> c.name()).collect(Collectors.joining(",")));
}
if (faultChannels.size() > 0) {
b.append("|Fault:");
b.append(faultChannels.stream().map(c -> c.name()).collect(Collectors.joining(",")));
}
b.append("]");
return b.toString();
}
Aggregations