Search in sources :

Example 6 with LightValueDto

use of com.alliander.osgp.dto.valueobjects.LightValueDto 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 LightValueDto

use of com.alliander.osgp.dto.valueobjects.LightValueDto 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 LightValueDto

use of com.alliander.osgp.dto.valueobjects.LightValueDto 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 LightValueDto

use of com.alliander.osgp.dto.valueobjects.LightValueDto 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)

Aggregations

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