use of io.openems.api.thing.Thing in project openems by OpenEMS.
the class ChannelExport method main.
public static void main(String[] args) throws OpenemsException {
String openemsPath = "C:\\Users\\matthias.rossmann\\Dev\\git\\openems-neu\\edge\\src";
Collection<ThingDoc> deviceNatures;
HashMap<Path, FileWriter> files = new HashMap<>();
try {
deviceNatures = ClassRepository.getInstance().getAvailableDeviceNatures();
FileWriter devices = new FileWriter(Paths.get(openemsPath, "\\io\\openems\\impl\\device\\Readme.md").toFile());
devices.write("# List of implemented Devices.\r\n\r\n");
for (ThingDoc thingDoc : deviceNatures) {
try {
System.out.println(thingDoc.getClazz().getName());
if (thingDoc.getClazz().equals(AsymmetricSymmetricCombinationEssNature.class) || thingDoc.getClazz().equals(EssClusterNature.class) || thingDoc.getClazz().isInterface() || Modifier.isAbstract(thingDoc.getClazz().getModifiers())) {
continue;
}
Path p = Paths.get(openemsPath, thingDoc.getClazz().getName().replaceAll("[^\\.]*$", "").replace(".", "/"), "Readme.md");
FileWriter fw;
if (files.containsKey(p)) {
fw = files.get(p);
} else {
fw = new FileWriter(p.toFile());
files.put(p, fw);
fw.write("");
}
fw.append("# " + thingDoc.getTitle() + "\r\n" + thingDoc.getText() + "\r\n\r\nFollowing Values are implemented:\r\n\r\n" + "|ChannelName|Unit|\r\n" + "|---|---|\r\n");
devices.append("* [" + thingDoc.getTitle() + "](" + Paths.get(thingDoc.getClazz().getName().replaceAll("io.openems.impl.device.", "").replaceAll("[^\\.]*$", "").replace(".", "/"), "Readme.md").toString().replace("\\", "/") + ")\r\n");
Thing thing = thingDoc.getClazz().getConstructor(String.class, Device.class).newInstance("", null);
if (thing instanceof ModbusDeviceNature) {
((ModbusDeviceNature) thing).init();
}
List<ChannelDoc> channelDocs = new LinkedList<>(thingDoc.getChannelDocs());
Collections.sort(channelDocs, new Comparator<ChannelDoc>() {
@Override
public int compare(ChannelDoc arg0, ChannelDoc arg1) {
return arg0.getName().compareTo(arg1.getName());
}
});
for (ChannelDoc channelDoc : channelDocs) {
Member member = channelDoc.getMember();
try {
List<Channel> channels = new ArrayList<>();
if (member instanceof Method) {
if (((Method) member).getReturnType().isArray()) {
Channel[] ch = (Channel[]) ((Method) member).invoke(thing);
for (Channel c : ch) {
channels.add(c);
}
} else {
// It's a Method with ReturnType Channel
channels.add((Channel) ((Method) member).invoke(thing));
}
} else if (member instanceof Field) {
// It's a Field with Type Channel
channels.add((Channel) ((Field) member).get(thing));
} else {
continue;
}
if (channels.isEmpty()) {
System.out.println("Channel is returning null! Thing [" + thing.id() + "], Member [" + member.getName() + "]");
continue;
}
for (Channel channel : channels) {
if (channel != null) {
StringBuilder unit = new StringBuilder();
if (channel instanceof ReadChannel) {
ReadChannel rchannel = ((ReadChannel) channel);
unit.append(rchannel.unitOptional());
rchannel.getLabels().forEach((key, value) -> {
unit.append(key + ": " + value + "<br/>");
});
}
fw.append("|" + channel.id() + "|" + unit + "|\r\n");
}
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
System.out.println("Unable to add Channel. Member [" + member.getName() + "]");
}
}
} catch (NoSuchMethodException e) {
}
}
for (FileWriter fw : files.values()) {
fw.close();
}
devices.close();
} catch (Exception e) {
e.printStackTrace();
}
}
use of io.openems.api.thing.Thing 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.thing.Thing in project openems by OpenEMS.
the class ThingRepository method getChannelDoc.
/**
* Returns the ChannelDoc for a given Channel
*
* @param channelAddress
* @return
*/
public synchronized Optional<ChannelDoc> getChannelDoc(ChannelAddress channelAddress) {
Thing thing = getThing(channelAddress.getThingId());
if (thing == null) {
return Optional.empty();
}
ThingDoc thingDoc = ClassRepository.getInstance().getThingDoc(thing.getClass());
Optional<ChannelDoc> channelDoc = thingDoc.getChannelDoc(channelAddress.getChannelId());
return channelDoc;
}
use of io.openems.api.thing.Thing in project openems by OpenEMS.
the class SimulatorSymmetricEss method getCharger.
private void getCharger() {
if (chargerList != null) {
for (ChargerNature charger : chargerList) {
soc.removeChannel(charger.getActualPower());
}
chargerList.clear();
if (charger.valueOptional().isPresent()) {
JsonArray ids = charger.valueOptional().get();
for (JsonElement e : ids) {
Optional<Thing> t = repo.getThingById(e.getAsString());
if (t.isPresent()) {
if (t.get() instanceof ChargerNature) {
ChargerNature charger = (ChargerNature) t.get();
chargerList.add(charger);
soc.addChannel(charger.getActualPower());
}
}
}
}
}
}
use of io.openems.api.thing.Thing in project openems by OpenEMS.
the class DeviceNatureRestlet method get.
/**
* handle HTTP GET request
*
* @param thingId
* @param channelId
* @return
*/
private Representation get() {
JsonObject j = new JsonObject();
for (Class<? extends Thing> clazz : thingRepository.getThingClasses()) {
if (DeviceNature.class.isAssignableFrom(clazz)) {
// clazz is a DeviceNature
Set<Thing> things = thingRepository.getThingsByClass(clazz);
JsonArray jThings = new JsonArray();
for (Thing thing : things) {
jThings.add(thing.id());
}
j.add(clazz.getCanonicalName(), jThings);
}
}
return new StringRepresentation(j.toString(), MediaType.APPLICATION_JSON);
}
Aggregations