Search in sources :

Example 1 with Channel

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;
    }
}
Also used : ReflectionException(io.openems.api.exception.ReflectionException) HashMap(java.util.HashMap) WriteChannel(io.openems.api.channel.WriteChannel) ConfigChannel(io.openems.api.channel.ConfigChannel) Channel(io.openems.api.channel.Channel) ArrayList(java.util.ArrayList) OpenemsException(io.openems.common.exceptions.OpenemsException) JsonArray(com.google.gson.JsonArray) InvalidValueException(io.openems.api.exception.InvalidValueException) JsonElement(com.google.gson.JsonElement) WriteChannel(io.openems.api.channel.WriteChannel)

Example 2 with Channel

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());
            }
    }
}
Also used : ApiWorker(io.openems.core.utilities.api.ApiWorker) ConfigChannel(io.openems.api.channel.ConfigChannel) WriteChannel(io.openems.api.channel.WriteChannel) ConfigChannel(io.openems.api.channel.ConfigChannel) Channel(io.openems.api.channel.Channel) JsonObject(com.google.gson.JsonObject) WriteJsonObject(io.openems.core.utilities.api.WriteJsonObject) OpenemsException(io.openems.common.exceptions.OpenemsException) JsonElement(com.google.gson.JsonElement) WriteChannel(io.openems.api.channel.WriteChannel) JsonObject(com.google.gson.JsonObject) WriteObject(io.openems.core.utilities.api.WriteObject) WriteJsonObject(io.openems.core.utilities.api.WriteJsonObject) WriteJsonObject(io.openems.core.utilities.api.WriteJsonObject) NoSuchElementException(java.util.NoSuchElementException) WriteObject(io.openems.core.utilities.api.WriteObject)

Example 3 with Channel

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;
}
Also used : WriteChannel(io.openems.api.channel.WriteChannel) ConfigChannel(io.openems.api.channel.ConfigChannel) Channel(io.openems.api.channel.Channel) OpenemsException(io.openems.common.exceptions.OpenemsException)

Example 4 with 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);
    }
}
Also used : ConfigChannel(io.openems.api.channel.ConfigChannel) WriteChannel(io.openems.api.channel.WriteChannel) ConfigChannel(io.openems.api.channel.ConfigChannel) Channel(io.openems.api.channel.Channel) WriteChannel(io.openems.api.channel.WriteChannel) WritePOJO(io.openems.core.utilities.api.WritePOJO)

Example 5 with Channel

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());
        }
    }
}
Also used : ReadChannel(io.openems.api.channel.ReadChannel) WriteChannel(io.openems.api.channel.WriteChannel) ConfigChannel(io.openems.api.channel.ConfigChannel) ThingStateChannel(io.openems.api.channel.ThingStateChannel) Channel(io.openems.api.channel.Channel) OpenemsException(io.openems.common.exceptions.OpenemsException) ChannelDoc(io.openems.api.doc.ChannelDoc) ThingDoc(io.openems.api.doc.ThingDoc)

Aggregations

Channel (io.openems.api.channel.Channel)16 ConfigChannel (io.openems.api.channel.ConfigChannel)14 WriteChannel (io.openems.api.channel.WriteChannel)12 ReadChannel (io.openems.api.channel.ReadChannel)9 OpenemsException (io.openems.common.exceptions.OpenemsException)8 ChannelDoc (io.openems.api.doc.ChannelDoc)5 JsonObject (com.google.gson.JsonObject)4 ChannelChangeListener (io.openems.api.channel.ChannelChangeListener)4 StaticValueChannel (io.openems.api.channel.StaticValueChannel)4 ThingStateChannel (io.openems.api.channel.ThingStateChannel)4 ThingDoc (io.openems.api.doc.ThingDoc)4 PGreaterEqualLimitation (io.openems.core.utilities.power.symmetric.PGreaterEqualLimitation)4 PSmallerEqualLimitation (io.openems.core.utilities.power.symmetric.PSmallerEqualLimitation)4 SymmetricPowerImpl (io.openems.core.utilities.power.symmetric.SymmetricPowerImpl)4 ModbusReadLongChannel (io.openems.impl.protocol.modbus.ModbusReadLongChannel)4 ModbusWriteLongChannel (io.openems.impl.protocol.modbus.ModbusWriteLongChannel)4 DummyElement (io.openems.impl.protocol.modbus.internal.DummyElement)4 ModbusProtocol (io.openems.impl.protocol.modbus.internal.ModbusProtocol)4 ArrayList (java.util.ArrayList)4 StatusBitChannel (io.openems.api.channel.StatusBitChannel)3