use of io.openems.api.persistence.Persistence in project openems by OpenEMS.
the class ThingRepository method removeThing.
/**
* Remove a Thing from the Repository.
*
* @param thing
*/
public synchronized void removeThing(Thing thing) {
// Remove from thingIds
thingIds.remove(thing.id());
// Remove from thingClasses
thingClasses.remove(thing.getClass(), thing);
// Remove from bridges
if (thing instanceof Bridge) {
bridges.remove(thing);
}
// Remove from schedulers
if (thing instanceof Scheduler) {
schedulers.remove(thing);
}
// Remove from persistences
if (thing instanceof Persistence) {
persistences.remove(thing);
}
// Remove from queryablePersistences
if (thing instanceof QueryablePersistence) {
queryablePersistences.remove(thing);
}
// Remove from deviceNatures
if (thing instanceof DeviceNature) {
deviceNatures.remove(thing);
}
// Remove controller
if (thing instanceof Controller) {
Controller controller = (Controller) thing;
for (Scheduler scheduler : getSchedulers()) {
scheduler.removeController(controller);
}
}
// Remove device
if (thing instanceof Device) {
for (Bridge bridge : bridges) {
bridge.removeDevice((Device) thing);
}
}
// Remove Listener
thing.removeListener(this);
for (ThingsChangedListener listener : thingListeners) {
listener.thingChanged(thing, Action.REMOVE);
}
}
use of io.openems.api.persistence.Persistence in project openems by OpenEMS.
the class Config method parseJsonConfig.
public synchronized void parseJsonConfig(JsonObject jConfig) throws OpenemsException {
/*
* read Users
*/
if (jConfig.has("users")) {
JsonObject jUsers = JsonUtils.getAsJsonObject(jConfig, "users");
for (Entry<String, JsonElement> jUsersElement : jUsers.entrySet()) {
JsonObject jUser = JsonUtils.getAsJsonObject(jUsersElement.getValue());
String username = jUsersElement.getKey();
String passwordBase64 = JsonUtils.getAsString(jUser, "password");
String saltBase64 = JsonUtils.getAsString(jUser, "salt");
try {
User.getUserByName(username).initialize(passwordBase64, saltBase64);
} catch (OpenemsException e) {
log.error("Error parsing config: " + e.getMessage());
}
}
}
// important! no more setting of users allowed!
User.initializeFinished();
/*
* read each Bridge in "things" array
*/
JsonArray jThings = JsonUtils.getAsJsonArray(jConfig, "things");
for (JsonElement jBridgeElement : jThings) {
JsonObject jBridge = JsonUtils.getAsJsonObject(jBridgeElement);
String bridgeClass = JsonUtils.getAsString(jBridge, "class");
Bridge bridge = (Bridge) InjectionUtils.getThingInstance(bridgeClass);
thingRepository.addThing(bridge);
log.info("Add Bridge[" + bridge.id() + "], Implementation[" + bridge.getClass().getSimpleName() + "]");
ConfigUtils.injectConfigChannels(thingRepository.getConfigChannels(bridge), jBridge);
/*
* read each Device in "things" array
*/
List<Device> devices = new ArrayList<>();
JsonArray jDevices = JsonUtils.getAsJsonArray(jBridge, "devices");
for (JsonElement jDeviceElement : jDevices) {
JsonObject jDevice = JsonUtils.getAsJsonObject(jDeviceElement);
Device device = thingRepository.createDevice(jDevice, bridge);
devices.add(device);
bridge.addDevice(device);
}
}
/*
* Init bridge
*/
for (Bridge b : thingRepository.getBridges()) {
for (Device d : b.getDevices()) {
d.init();
}
b.init();
}
for (BridgeInitializedEventListener listener : bridgeInitEventListeners) {
listener.onBridgeInitialized();
}
/*
* read Scheduler
*/
if (jConfig.has("scheduler")) {
JsonObject jScheduler = JsonUtils.getAsJsonObject(jConfig, "scheduler");
String schedulerClass = JsonUtils.getAsString(jScheduler, "class");
Scheduler scheduler = (Scheduler) InjectionUtils.getThingInstance(schedulerClass);
thingRepository.addThing(scheduler);
log.debug("Add Scheduler[" + scheduler.id() + "], Implementation[" + scheduler.getClass().getSimpleName() + "]");
ConfigUtils.injectConfigChannels(thingRepository.getConfigChannels(scheduler), jScheduler);
/*
* read each Controller in "controllers" array
*/
JsonArray jControllers = JsonUtils.getAsJsonArray(jScheduler, "controllers");
for (JsonElement jControllerElement : jControllers) {
JsonObject jController = JsonUtils.getAsJsonObject(jControllerElement);
Controller controller = thingRepository.createController(jController);
scheduler.addController(controller);
controller.init();
}
scheduler.init();
}
for (SchedulerInitializedEventListener listener : schedulerInitEventListeners) {
listener.onSchedulerInitialized();
}
/*
* read Persistence
*/
if (jConfig.has("persistence")) {
JsonArray jPersistences = JsonUtils.getAsJsonArray(jConfig, "persistence");
for (JsonElement jPersistenceElement : jPersistences) {
JsonObject jPersistence = JsonUtils.getAsJsonObject(jPersistenceElement);
String persistenceClass = JsonUtils.getAsString(jPersistence, "class");
Persistence persistence = (Persistence) InjectionUtils.getThingInstance(persistenceClass);
thingRepository.addThing(persistence);
log.info("Add Persistence[" + persistence.id() + "], Implementation[" + persistence.getClass().getSimpleName() + "]");
ConfigUtils.injectConfigChannels(thingRepository.getConfigChannels(persistence), jPersistence);
persistence.init();
}
}
/*
* Configuration is finished -> apply again channel annotation to all of them because many channels are only
* defined during init()
*/
thingRepository.getThings().forEach(thing -> {
thingRepository.applyChannelAnnotation(thing);
});
/*
* Start all worker threads
*/
thingRepository.getThings().forEach(thing -> {
// TODO use executor
if (thing instanceof Thread) {
((Thread) thing).start();
}
});
/*
* Register myself as onChangeListener on all ConfigChannels
*/
for (ConfigChannel<?> channel : thingRepository.getConfigChannels()) {
channel.addChangeListener(this);
}
/*
* After 10 seconds: build the ClassRepository cache to speed up future calls
* (this speeds up the first opening of the UI, as the cache does not need to be built)
*/
Executors.newScheduledThreadPool(1).schedule(() -> {
try {
ClassRepository.getInstance().getAvailableThings();
} catch (ReflectionException e) {
/* ignore */
}
}, 10, TimeUnit.SECONDS);
}
use of io.openems.api.persistence.Persistence in project openems by OpenEMS.
the class Config method getPersistenceJson.
public JsonArray getPersistenceJson(ConfigFormat format, Role role) throws NotImplementedException {
JsonArray jPersistences = new JsonArray();
for (Persistence persistence : thingRepository.getPersistences()) {
JsonObject jPersistence = (JsonObject) ConfigUtils.getAsJsonElement(persistence, format, role);
jPersistences.add(jPersistence);
}
return jPersistences;
}
use of io.openems.api.persistence.Persistence 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);
}
}
Aggregations