Search in sources :

Example 6 with DeviceOutputSetting

use of com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850SsldDeviceService method createListOfInternalIndicesToSwitch.

private List<LightValueDto> createListOfInternalIndicesToSwitch(final List<DeviceOutputSetting> deviceOutputSettings, final List<LightValueDto> lightValues) throws FunctionalException {
    final List<LightValueDto> relaysWithInternalIdToSwitch = new ArrayList<>();
    LOGGER.info("creating list of internal indices using device output settings and external indices from light values");
    for (final LightValueDto lightValue : lightValues) {
        if (lightValue == null) {
            break;
        }
        DeviceOutputSetting deviceOutputSettingForExternalId = null;
        for (final DeviceOutputSetting deviceOutputSetting : deviceOutputSettings) {
            if (deviceOutputSetting.getExternalId() == lightValue.getIndex()) {
                // You can only switch LIGHT relays that are used.
                this.checkRelay(deviceOutputSetting.getRelayType(), RelayType.LIGHT, deviceOutputSetting.getInternalId());
                deviceOutputSettingForExternalId = deviceOutputSetting;
            }
        }
        if (deviceOutputSettingForExternalId != null) {
            final LightValueDto relayWithInternalIdToSwitch = new LightValueDto(deviceOutputSettingForExternalId.getInternalId(), lightValue.isOn(), lightValue.getDimValue());
            relaysWithInternalIdToSwitch.add(relayWithInternalIdToSwitch);
        }
    }
    return relaysWithInternalIdToSwitch;
}
Also used : ArrayList(java.util.ArrayList) DeviceOutputSetting(com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting) LightValueDto(com.alliander.osgp.dto.valueobjects.LightValueDto)

Example 7 with DeviceOutputSetting

use of com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850GetStatusCommand method getStatusFromDevice.

public DeviceStatusDto getStatusFromDevice(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final Ssld ssld) throws ProtocolAdapterException {
    final Function<DeviceStatusDto> function = new Function<DeviceStatusDto>() {

        @Override
        public DeviceStatusDto apply(final DeviceMessageLog deviceMessageLog) throws Exception {
            // getting the light relay values
            final List<LightValueDto> lightValues = new ArrayList<>();
            for (final DeviceOutputSetting deviceOutputSetting : ssld.getOutputSettings()) {
                final LogicalNode logicalNode = LogicalNode.getSwitchComponentByIndex(deviceOutputSetting.getInternalId());
                final NodeContainer position = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, logicalNode, DataAttribute.POSITION, Fc.ST);
                iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), position.getFcmodelNode());
                final BdaBoolean state = position.getBoolean(SubDataAttribute.STATE);
                final boolean on = state.getValue();
                lightValues.add(new LightValueDto(deviceOutputSetting.getExternalId(), on, null));
                LOGGER.info(String.format("Got status of relay %d => %s", deviceOutputSetting.getInternalId(), on ? "on" : "off"));
                deviceMessageLog.addVariable(logicalNode, DataAttribute.POSITION, Fc.ST, Boolean.toString(on));
            }
            final NodeContainer eventBuffer = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.EVENT_BUFFER, Fc.CF);
            iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), eventBuffer.getFcmodelNode());
            final String filter = eventBuffer.getString(SubDataAttribute.EVENT_BUFFER_FILTER);
            LOGGER.info("Got EvnBuf.enbEvnType filter {}", filter);
            deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.EVENT_BUFFER, Fc.CF, filter);
            final Set<EventNotificationTypeDto> notificationTypes = EventType.getNotificationTypesForFilter(filter);
            int eventNotificationsMask = 0;
            for (final EventNotificationTypeDto notificationType : notificationTypes) {
                eventNotificationsMask |= notificationType.getValue();
            }
            final NodeContainer softwareConfiguration = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF);
            iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), softwareConfiguration.getFcmodelNode());
            String lightTypeValue = softwareConfiguration.getString(SubDataAttribute.LIGHT_TYPE);
            // Fix for Kaifa bug KI-31
            if (lightTypeValue == null || lightTypeValue.isEmpty()) {
                lightTypeValue = "RELAY";
            }
            final LightTypeDto lightType = LightTypeDto.valueOf(lightTypeValue);
            deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, lightTypeValue);
            DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
            /*
                 * The preferredLinkType and actualLinkType are hard-coded to
                 * LinkTypeDto.ETHERNET, other link types do not apply to the
                 * device type in use.
                 */
            return new DeviceStatusDto(lightValues, LinkTypeDto.ETHERNET, LinkTypeDto.ETHERNET, lightType, eventNotificationsMask);
        }
    };
    return iec61850Client.sendCommandWithRetry(function, "GetStatus", deviceConnection.getDeviceIdentification());
}
Also used : LightTypeDto(com.alliander.osgp.dto.valueobjects.LightTypeDto) ArrayList(java.util.ArrayList) DeviceOutputSetting(com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting) NodeContainer(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.NodeContainer) LogicalNode(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.LogicalNode) LightValueDto(com.alliander.osgp.dto.valueobjects.LightValueDto) Function(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.Function) DeviceMessageLog(com.alliander.osgp.adapter.protocol.iec61850.domain.valueobjects.DeviceMessageLog) DeviceStatusDto(com.alliander.osgp.dto.valueobjects.DeviceStatusDto) BdaBoolean(org.openmuc.openiec61850.BdaBoolean) EventNotificationTypeDto(com.alliander.osgp.dto.valueobjects.EventNotificationTypeDto)

Example 8 with DeviceOutputSetting

use of com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850SsldDeviceService method setLight.

@Override
public void setLight(final SetLightDeviceRequest deviceRequest, final DeviceResponseHandler deviceResponseHandler) throws JMSException {
    DeviceConnection deviceConnection = null;
    try {
        deviceConnection = this.connectToDevice(deviceRequest);
        // Getting the SSLD for the device output-settings.
        final Ssld ssld = this.ssldDataService.findDevice(deviceRequest.getDeviceIdentification());
        final List<DeviceOutputSetting> deviceOutputSettings = this.ssldDataService.findByRelayType(ssld, RelayType.LIGHT);
        final List<LightValueDto> lightValues = deviceRequest.getLightValuesContainer().getLightValues();
        List<LightValueDto> relaysWithInternalIdToSwitch;
        // Check if external index 0 is used.
        final LightValueDto index0LightValue = this.checkForIndex0(lightValues);
        if (index0LightValue != null) {
            // If external index 0 is used, create a list of all light
            // relays according to the device output settings.
            relaysWithInternalIdToSwitch = this.createListOfInternalIndicesToSwitch(deviceOutputSettings, index0LightValue.isOn());
        } else {
            // Else, create a list of internal indices based on the given
            // external indices in the light values list.
            relaysWithInternalIdToSwitch = this.createListOfInternalIndicesToSwitch(deviceOutputSettings, lightValues);
        }
        // Switch light relays based on internal indices.
        final Iec61850SetLightCommand iec61850SetLightCommand = new Iec61850SetLightCommand();
        for (final LightValueDto relayWithInternalIdToSwitch : relaysWithInternalIdToSwitch) {
            LOGGER.info("Trying to switch light relay with internal index: {} for device: {}", relayWithInternalIdToSwitch.getIndex(), deviceRequest.getDeviceIdentification());
            if (!iec61850SetLightCommand.switchLightRelay(this.iec61850Client, deviceConnection, relayWithInternalIdToSwitch.getIndex(), relayWithInternalIdToSwitch.isOn())) {
                throw new ProtocolAdapterException(String.format("Failed to switch light relay with internal index: %d for device: %s", relayWithInternalIdToSwitch.getIndex(), deviceRequest.getDeviceIdentification()));
            }
        }
        this.createSuccessfulDefaultResponse(deviceRequest, deviceResponseHandler);
    } catch (final ConnectionFailureException se) {
        this.handleConnectionFailureException(deviceRequest, deviceResponseHandler, se);
    } catch (final Exception e) {
        this.handleException(deviceRequest, deviceResponseHandler, e);
    }
    this.iec61850DeviceConnectionService.disconnect(deviceConnection, deviceRequest);
}
Also used : ConnectionFailureException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ConnectionFailureException) DeviceConnection(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.DeviceConnection) DeviceOutputSetting(com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting) ProtocolAdapterException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ProtocolAdapterException) NodeWriteException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.NodeWriteException) FunctionalException(com.alliander.osgp.shared.exceptionhandling.FunctionalException) JMSException(javax.jms.JMSException) ProtocolAdapterException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ProtocolAdapterException) ConnectionFailureException(com.alliander.osgp.adapter.protocol.iec61850.exceptions.ConnectionFailureException) TechnicalException(com.alliander.osgp.shared.exceptionhandling.TechnicalException) Ssld(com.alliander.osgp.core.db.api.iec61850.entities.Ssld) LightValueDto(com.alliander.osgp.dto.valueobjects.LightValueDto) Iec61850SetLightCommand(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.services.commands.Iec61850SetLightCommand)

Example 9 with DeviceOutputSetting

use of com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850SsldDeviceService method createListOfInternalIndicesToSwitch.

private List<LightValueDto> createListOfInternalIndicesToSwitch(final List<DeviceOutputSetting> deviceOutputSettings, final boolean on) {
    LOGGER.info("creating list of internal indices using device output settings");
    final List<LightValueDto> relaysWithInternalIdToSwitch = new ArrayList<>();
    for (final DeviceOutputSetting deviceOutputSetting : deviceOutputSettings) {
        if (RelayType.LIGHT.equals(deviceOutputSetting.getRelayType())) {
            final LightValueDto relayWithInternalIdToSwitch = new LightValueDto(deviceOutputSetting.getInternalId(), on, null);
            relaysWithInternalIdToSwitch.add(relayWithInternalIdToSwitch);
        }
    }
    return relaysWithInternalIdToSwitch;
}
Also used : ArrayList(java.util.ArrayList) DeviceOutputSetting(com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting) LightValueDto(com.alliander.osgp.dto.valueobjects.LightValueDto)

Example 10 with DeviceOutputSetting

use of com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting in project Protocol-Adapter-IEC61850 by OSGP.

the class Iec61850PowerUsageHistoryCommand method getPowerUsageHistoryDataFromDevice.

public List<PowerUsageDataDto> getPowerUsageHistoryDataFromDevice(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final PowerUsageHistoryMessageDataContainerDto powerUsageHistoryContainer, final List<DeviceOutputSetting> deviceOutputSettingsLightRelays) throws ProtocolAdapterException {
    final Function<List<PowerUsageDataDto>> function = new Function<List<PowerUsageDataDto>>() {

        @Override
        public List<PowerUsageDataDto> apply(final DeviceMessageLog deviceMessageLog) throws Exception {
            final HistoryTermTypeDto historyTermType = powerUsageHistoryContainer.getHistoryTermType();
            if (historyTermType != null) {
                LOGGER.info("device: {}, ignoring HistoryTermType ({}) determining power usage history", deviceConnection.getDeviceIdentification(), historyTermType);
            }
            final TimePeriodDto timePeriod = powerUsageHistoryContainer.getTimePeriod();
            final List<PowerUsageDataDto> powerUsageHistoryData = new ArrayList<>();
            for (final DeviceOutputSetting deviceOutputSetting : deviceOutputSettingsLightRelays) {
                final List<PowerUsageDataDto> powerUsageData = Iec61850PowerUsageHistoryCommand.this.getPowerUsageHistoryDataFromRelay(iec61850Client, deviceConnection, timePeriod, deviceOutputSetting, deviceMessageLog);
                powerUsageHistoryData.addAll(powerUsageData);
            }
            DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
            /*
                 * This way of gathering leads to PowerUsageData elements per
                 * relay. If it is necessary to only include one PowerUsageData
                 * element for the device, where data for the different relays
                 * is combined in the SsldData.relayData some sort of merge
                 * needs to be performed.
                 * 
                 * This can either be a rework of the list currently returned,
                 * or it can be a list constructed based on an altered return
                 * type from getPowerUsageHistoryDataFromRelay (for instance a
                 * Map of Date to a Map of Relay Index to Total Lighting
                 * Minutes).
                 */
            return powerUsageHistoryData;
        }
    };
    return iec61850Client.sendCommandWithRetry(function, "GetPowerUsageHistory", deviceConnection.getDeviceIdentification());
}
Also used : Function(com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.Function) DeviceMessageLog(com.alliander.osgp.adapter.protocol.iec61850.domain.valueobjects.DeviceMessageLog) HistoryTermTypeDto(com.alliander.osgp.dto.valueobjects.HistoryTermTypeDto) ArrayList(java.util.ArrayList) DeviceOutputSetting(com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting) ArrayList(java.util.ArrayList) List(java.util.List) PowerUsageDataDto(com.alliander.osgp.dto.valueobjects.PowerUsageDataDto) TimePeriodDto(com.alliander.osgp.dto.valueobjects.TimePeriodDto)

Aggregations

DeviceOutputSetting (com.alliander.osgp.core.db.api.iec61850.entities.DeviceOutputSetting)10 ArrayList (java.util.ArrayList)7 LightValueDto (com.alliander.osgp.dto.valueobjects.LightValueDto)6 ProtocolAdapterException (com.alliander.osgp.adapter.protocol.iec61850.exceptions.ProtocolAdapterException)4 FunctionalException (com.alliander.osgp.shared.exceptionhandling.FunctionalException)4 DeviceMessageLog (com.alliander.osgp.adapter.protocol.iec61850.domain.valueobjects.DeviceMessageLog)3 ConnectionFailureException (com.alliander.osgp.adapter.protocol.iec61850.exceptions.ConnectionFailureException)3 NodeWriteException (com.alliander.osgp.adapter.protocol.iec61850.exceptions.NodeWriteException)3 DeviceConnection (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.DeviceConnection)3 Function (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.Function)3 Ssld (com.alliander.osgp.core.db.api.iec61850.entities.Ssld)3 TechnicalException (com.alliander.osgp.shared.exceptionhandling.TechnicalException)3 JMSException (javax.jms.JMSException)3 NodeContainer (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.NodeContainer)2 Iec61850SetLightCommand (com.alliander.osgp.adapter.protocol.iec61850.infra.networking.services.commands.Iec61850SetLightCommand)2 DeviceStatusDto (com.alliander.osgp.dto.valueobjects.DeviceStatusDto)2 LightTypeDto (com.alliander.osgp.dto.valueobjects.LightTypeDto)2 PowerUsageDataDto (com.alliander.osgp.dto.valueobjects.PowerUsageDataDto)2 List (java.util.List)2 DeviceMessageStatus (com.alliander.osgp.adapter.protocol.iec61850.device.DeviceMessageStatus)1