use of io.openems.api.channel.Channel in project openems by OpenEMS.
the class SupplyBusSwitchController method generateSupplybuses.
private List<Supplybus> generateSupplybuses() {
if (esss.valueOptional().isPresent() && supplyBusConfig.valueOptional().isPresent() && switchDelay.valueOptional().isPresent()) {
List<Supplybus> buses = new ArrayList<>();
for (JsonElement bus : supplyBusConfig.valueOptional().get()) {
try {
String name = JsonUtils.getAsString(bus, "bus");
String primaryEssName = JsonUtils.getAsString(bus, "primaryEss");
JsonElement supplybusOnIndicationElement = bus.getAsJsonObject().get("supplybusOnIndication");
JsonElement loads = bus.getAsJsonObject().get("loads");
Optional<Channel> supplybusOnIndication = Optional.empty();
if (supplybusOnIndicationElement != null) {
supplybusOnIndication = repo.getChannelByAddress(supplybusOnIndicationElement.getAsString());
}
List<WriteChannel<Long>> loadChannels = new ArrayList<>();
if (loads != null) {
for (JsonElement load : loads.getAsJsonArray()) {
Optional<Channel> loadChannel = repo.getChannelByAddress(load.getAsString());
if (loadChannel.isPresent() && loadChannel.get() instanceof WriteChannel<?>) {
@SuppressWarnings("unchecked") WriteChannel<Long> writeChannel = (WriteChannel<Long>) loadChannel.get();
loadChannels.add(writeChannel);
}
}
}
Ess primaryEss = getEss(primaryEssName);
HashMap<Ess, WriteChannel<Boolean>> switchEssMapping = new HashMap<>();
JsonArray switches = JsonUtils.getAsJsonArray(bus, "switches");
for (JsonElement e : switches) {
try {
String essName = JsonUtils.getAsString(e, "ess");
try {
Ess ess = getEss(essName);
String channelAddress = JsonUtils.getAsString(e, "switchAddress");
Optional<Channel> outputChannel = repo.getChannelByAddress(channelAddress);
if (ess != null) {
if (outputChannel.isPresent() && outputChannel.get() instanceof WriteChannel<?>) {
@SuppressWarnings("unchecked") WriteChannel<Boolean> channel = (WriteChannel<Boolean>) outputChannel.get();
channel.required();
switchEssMapping.put(ess, channel);
} else {
log.error(channelAddress + " not found!");
}
} else {
log.error(essName + "not found!");
}
} catch (InvalidValueException e1) {
log.error(essName + " is missing in the 'esss' config parameter", e1);
}
} catch (ReflectionException e2) {
log.error("can't find JsonElement 'ess' or 'switchAddress'!", e2);
}
}
WriteChannel<Long> supplybusOnIndicationChannel = null;
if (supplybusOnIndication.isPresent()) {
if (supplybusOnIndication.get() instanceof WriteChannel<?>) {
@SuppressWarnings("unchecked") WriteChannel<Long> writeChannel = (WriteChannel<Long>) supplybusOnIndication.get();
supplybusOnIndicationChannel = writeChannel;
}
}
Supplybus sb = new Supplybus(switchEssMapping, name, primaryEss, switchDelay.value(), supplybusOnIndicationChannel, loadChannels);
buses.add(sb);
} catch (ReflectionException e) {
log.error("can't find JsonElement 'bus' or 'switches' in config parameter 'supplyBuses'!", e);
} catch (InvalidValueException e3) {
log.error("primaryEss not found", e3);
} catch (OpenemsException e4) {
log.error(e4.getMessage());
}
}
return buses;
} else {
return null;
}
}
use of io.openems.api.channel.Channel in project openems by OpenEMS.
the class EdgeWebsocketHandler method config.
/**
* Handle "config" messages
*
* @param jConfig
* @return
*/
private synchronized void config(Role role, JsonObject jMessageId, Optional<ApiWorker> apiWorkerOpt, JsonObject jConfig) {
Optional<String> modeOpt = JsonUtils.getAsOptionalString(jConfig, "mode");
switch(modeOpt.orElse("")) {
case "query":
/*
* Query current config
*/
try {
String language = JsonUtils.getAsString(jConfig, "language");
JsonObject jReplyConfig = Config.getInstance().getJson(ConfigFormat.OPENEMS_UI, role, language);
WebSocketUtils.send(this.websocket, DefaultMessages.configQueryReply(jMessageId, jReplyConfig));
return;
} catch (OpenemsException e) {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.UNABLE_TO_READ_CURRENT_CONFIG, e.getMessage());
}
case "update":
/*
* Update thing/channel config
*/
Optional<String> thingIdOpt = JsonUtils.getAsOptionalString(jConfig, "thing");
Optional<String> channelIdOpt = JsonUtils.getAsOptionalString(jConfig, "channel");
try {
String thingId = thingIdOpt.get();
String channelId = channelIdOpt.get();
JsonElement jValue = JsonUtils.getSubElement(jConfig, "value");
Optional<Channel> channelOpt = ThingRepository.getInstance().getChannel(thingId, channelId);
if (channelOpt.isPresent()) {
Channel channel = channelOpt.get();
// check write permissions
channel.assertWriteAllowed(role);
if (channel instanceof ConfigChannel<?>) {
/*
* ConfigChannel
*/
ConfigChannel<?> configChannel = (ConfigChannel<?>) channel;
Object value = ConfigUtils.getConfigObject(configChannel, jValue);
configChannel.updateValue(value, true);
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.EDGE_CHANNEL_UPDATE_SUCCESS, channel.address() + " => " + jValue);
} else if (channel instanceof WriteChannel<?>) {
/*
* WriteChannel
*/
WriteChannel<?> writeChannel = (WriteChannel<?>) channel;
if (!apiWorkerOpt.isPresent()) {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.BACKEND_NOT_ALLOWED, "set " + channel.address() + " => " + jValue);
} else {
ApiWorker apiWorker = apiWorkerOpt.get();
WriteObject writeObject = new WriteJsonObject(jValue).onFirstSuccess(() -> {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.EDGE_CHANNEL_UPDATE_SUCCESS, "set " + channel.address() + " => " + jValue);
}).onFirstError((e) -> {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.EDGE_CHANNEL_UPDATE_FAILED, "set " + channel.address() + " => " + jValue, e.getMessage());
}).onTimeout(() -> {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.EDGE_CHANNEL_UPDATE_TIMEOUT, "set " + channel.address() + " => " + jValue);
});
apiWorker.addValue(writeChannel, writeObject);
}
}
} else {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.CHANNEL_NOT_FOUND, thingId + "/" + channelId);
}
} catch (NoSuchElementException | OpenemsException e) {
WebSocketUtils.sendNotificationOrLogError(this.websocket, jMessageId, LogBehaviour.WRITE_TO_LOG, Notification.EDGE_CHANNEL_UPDATE_FAILED, thingIdOpt.orElse("UNDEFINED") + "/" + channelIdOpt.orElse("UNDEFINED"), e.getMessage());
}
}
}
use of io.openems.api.channel.Channel in project openems by OpenEMS.
the class ChannelRegisterMap method getChannel.
/**
* Returns the channel for the set ChannelAddress
*
* @return
* @throws OpenemsException
*/
protected Channel getChannel() throws OpenemsException {
Optional<Channel> channelOpt = ThingRepository.getInstance().getChannel(this.channelAddress);
if (!channelOpt.isPresent()) {
throw new OpenemsException("Channel does not exist [" + this.channelAddress + "]");
}
Channel channel = channelOpt.get();
return channel;
}
use of io.openems.api.channel.Channel in project openems by OpenEMS.
the class ChannelRegisterMap method setValue.
protected void setValue(MyRegister register, byte b1, byte b2) throws OpenemsException {
int registerNo = register.getRegisterNo();
this.setBuffer[registerNo * 2] = b1;
this.setBuffer[registerNo * 2 + 1] = b2;
// is the buffer full?
for (int i = 0; i < this.setBuffer.length; i++) {
if (this.setBuffer[i] == null) {
// no, it is not full
return;
}
}
// yes, it is full -> parse value to Object
byte[] value = new byte[this.setBuffer.length];
boolean isPositive = true;
for (int i = this.setBuffer.length - 1; i > 0; i -= 2) {
if (((this.setBuffer[i - 1] >>> 8) & 1) != 0) {
// test if the 'negative-bit' is set
isPositive = false;
}
value[i] = this.setBuffer[i];
value[i - 1] = this.setBuffer[i - 1];
}
if (!isPositive) {
// fill leading bytes with 0xFF if the value is negative
for (int i = 0; i < value.length; i++) {
if (value[i] != 0) {
break;
}
value[i] = (byte) 0xff;
}
}
// int bitLength = getBitLength(type);
// System.out.println(bitLength + " - " + bytesToHex(value));
Object valueObj = BitUtils.toObject(this.channelDoc.getTypeOpt().get(), value);
Channel channel = this.getChannel();
if (channel instanceof ConfigChannel<?>) {
// it is a ConfigChannel -> write directly
ConfigChannel<?> configChannel = (ConfigChannel<?>) channel;
configChannel.updateValue(valueObj, true);
log.info("Updated [" + this.channelAddress + "] to [" + valueObj + "] via Modbus/TCP.");
} else if (channel instanceof WriteChannel<?>) {
// it is a WriteChannel -> handle by ApiWorker
WriteChannel<?> writeChannel = (WriteChannel<?>) channel;
WritePOJO writeObject = new WritePOJO(valueObj);
apiWorker.addValue(writeChannel, writeObject);
}
}
use of io.openems.api.channel.Channel in project openems by OpenEMS.
the class ThingRepository method applyChannelAnnotation.
public void applyChannelAnnotation(Thing thing) {
ThingDoc thingDoc = classRepository.getThingDoc(thing.getClass());
for (ChannelDoc channelDoc : thingDoc.getChannelDocs()) {
try {
Channel channel = getChannel(thing, channelDoc.getMember());
channel.setChannelDoc(channelDoc);
} catch (OpenemsException e) {
log.debug(e.getMessage());
}
}
}
Aggregations