use of com.alliander.osgp.core.db.api.iec61850.entities.Ssld in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850GetConfigurationCommand method getConfigurationFromDevice.
public ConfigurationDto getConfigurationFromDevice(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final Ssld ssld, final Iec61850Mapper mapper) throws ProtocolAdapterException {
final Function<ConfigurationDto> function = new Function<ConfigurationDto>() {
@Override
public ConfigurationDto apply(final DeviceMessageLog deviceMessageLog) throws Exception {
// Keeping the hardcoded values and values that aren't fetched
// from the device out of the Function.
// Hardcoded (not supported)
final MeterTypeDto meterType = MeterTypeDto.AUX;
// Hardcoded (not supported)
final Integer shortTermHistoryIntervalMinutes = 15;
// Hardcoded (not supported)
final LinkTypeDto preferredLinkType = LinkTypeDto.ETHERNET;
// Hardcoded (not supported)
final Integer longTermHistoryInterval = 1;
// Hardcoded (not supported)
final LongTermIntervalTypeDto longTermHistoryIntervalType = LongTermIntervalTypeDto.DAYS;
final List<RelayMapDto> relayMaps = new ArrayList<>();
for (final DeviceOutputSetting deviceOutputSetting : ssld.getOutputSettings()) {
Iec61850GetConfigurationCommand.this.checkRelayType(iec61850Client, deviceConnection, deviceOutputSetting, deviceMessageLog);
relayMaps.add(mapper.map(deviceOutputSetting, RelayMapDto.class));
}
final RelayConfigurationDto relayConfiguration = new RelayConfigurationDto(relayMaps);
// PSLD specific => just sending null so it'll be ignored
final DaliConfigurationDto daliConfiguration = null;
// getting the software configuration values
LOGGER.info("Reading the software configuration values");
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";
}
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, SubDataAttribute.LIGHT_TYPE, lightTypeValue);
final LightTypeDto lightType = LightTypeDto.valueOf(lightTypeValue);
final short astroGateSunRiseOffset = softwareConfiguration.getShort(SubDataAttribute.ASTRONOMIC_SUNRISE_OFFSET).getValue();
final short astroGateSunSetOffset = softwareConfiguration.getShort(SubDataAttribute.ASTRONOMIC_SUNSET_OFFSET).getValue();
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, SubDataAttribute.ASTRONOMIC_SUNRISE_OFFSET, Short.toString(astroGateSunRiseOffset));
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, SubDataAttribute.ASTRONOMIC_SUNSET_OFFSET, Short.toString(astroGateSunSetOffset));
final ConfigurationDto configuration = new ConfigurationDto(lightType, daliConfiguration, relayConfiguration, shortTermHistoryIntervalMinutes, preferredLinkType, meterType, longTermHistoryInterval, longTermHistoryIntervalType);
// getting the registration configuration values
LOGGER.info("Reading the registration configuration values");
final NodeContainer registration = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.REGISTRATION, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), registration.getFcmodelNode());
final String serverAddress = registration.getString(SubDataAttribute.SERVER_ADDRESS);
final int serverPort = registration.getInteger(SubDataAttribute.SERVER_PORT).getValue();
configuration.setOsgpIpAddress(serverAddress);
configuration.setOsgpPortNumber(serverPort);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.REGISTRATION, Fc.CF, SubDataAttribute.SERVER_ADDRESS, serverAddress);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.REGISTRATION, Fc.CF, SubDataAttribute.SERVER_PORT, Integer.toString(serverPort));
// getting the IP configuration values
LOGGER.info("Reading the IP configuration values");
final NodeContainer ipConfiguration = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), ipConfiguration.getFcmodelNode());
final String deviceFixedIpAddress = ipConfiguration.getString(SubDataAttribute.IP_ADDRESS);
final String deviceFixedIpNetmask = ipConfiguration.getString(SubDataAttribute.NETMASK);
final String deviceFixedIpGateway = ipConfiguration.getString(SubDataAttribute.GATEWAY);
final boolean isDhcpEnabled = ipConfiguration.getBoolean(SubDataAttribute.ENABLE_DHCP).getValue();
final DeviceFixedIpDto deviceFixedIp = new DeviceFixedIpDto(deviceFixedIpAddress, deviceFixedIpNetmask, deviceFixedIpGateway);
configuration.setDeviceFixedIp(deviceFixedIp);
configuration.setDhcpEnabled(isDhcpEnabled);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.IP_ADDRESS, deviceFixedIpAddress);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.NETMASK, deviceFixedIpNetmask);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.GATEWAY, deviceFixedIpGateway);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.ENABLE_DHCP, Boolean.toString(isDhcpEnabled));
// setting the software configuration values
configuration.setAstroGateSunRiseOffset((int) astroGateSunRiseOffset);
configuration.setAstroGateSunSetOffset((int) astroGateSunSetOffset);
// getting the clock configuration values
LOGGER.info("Reading the clock configuration values");
final NodeContainer clock = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), clock.getFcmodelNode());
final int timeSyncFrequency = clock.getUnsignedShort(SubDataAttribute.TIME_SYNC_FREQUENCY).getValue();
final boolean automaticSummerTimingEnabled = clock.getBoolean(SubDataAttribute.AUTOMATIC_SUMMER_TIMING_ENABLED).getValue();
final String summerTimeDetails = clock.getString(SubDataAttribute.SUMMER_TIME_DETAILS);
final String winterTimeDetails = clock.getString(SubDataAttribute.WINTER_TIME_DETAILS);
configuration.setTimeSyncFrequency(timeSyncFrequency);
configuration.setAutomaticSummerTimingEnabled(automaticSummerTimingEnabled);
configuration.setSummerTimeDetails(new DaylightSavingTimeTransition(TIME_ZONE_AMSTERDAM, summerTimeDetails).getDateTimeForNextTransition().toDateTime(DateTimeZone.UTC));
configuration.setWinterTimeDetails(new DaylightSavingTimeTransition(TIME_ZONE_AMSTERDAM, winterTimeDetails).getDateTimeForNextTransition().toDateTime(DateTimeZone.UTC));
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.TIME_SYNC_FREQUENCY, Integer.toString(timeSyncFrequency));
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.AUTOMATIC_SUMMER_TIMING_ENABLED, Boolean.toString(automaticSummerTimingEnabled));
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.SUMMER_TIME_DETAILS, summerTimeDetails);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.WINTER_TIME_DETAILS, winterTimeDetails);
// getting the TLS configuration values
// LOGGER.info("Reading the TLS configuration values");
// final NodeContainer tls =
// deviceConnection.getFcModelNode(LogicalDevice.LIGHTING,
// LogicalNode.STREET_LIGHT_CONFIGURATION,
// DataAttribute.TLS_CONFIGURATION, Fc.CF);
//
// iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(),
// tls.getFcmodelNode());
//
// final int tlsPortNumber = (int)
// tls.getUnsignedInteger(SubDataAttribute.TLS_PORT_NUMBER).getValue();
// final boolean tlsEnabled =
// tls.getBoolean(SubDataAttribute.TLS_ENABLED).getValue();
// final String commonName =
// tls.getString(SubDataAttribute.TLS_COMMON_NAME);
//
// configuration.setTlsPortNumber(tlsPortNumber);
// configuration.setTlsEnabled(tlsEnabled);
// configuration.setCommonNameString(commonName);
DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
return configuration;
}
};
return iec61850Client.sendCommandWithRetry(function, "GetConfiguration", deviceConnection.getDeviceIdentification());
}
use of com.alliander.osgp.core.db.api.iec61850.entities.Ssld in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850SsldDeviceService method runSelfTest.
@Override
public void runSelfTest(final DeviceRequest deviceRequest, final DeviceResponseHandler deviceResponseHandler, final boolean startOfTest) throws JMSException {
// Assuming all goes well.
final DeviceMessageStatus status = DeviceMessageStatus.OK;
DeviceConnection deviceConnection = null;
try {
deviceConnection = this.connectToDevice(deviceRequest);
// Getting the SSLD for the device output-settings.
final Ssld ssld = this.ssldDataService.findDevice(deviceRequest.getDeviceIdentification());
// This list will contain the external indexes of all light relays.
// It's used to interpret the deviceStatus data later on.
final List<Integer> lightRelays = new ArrayList<>();
LOGGER.info("Turning all lights relays {}", startOfTest ? "on" : "off");
final Iec61850SetLightCommand iec61850SetLightCommand = new Iec61850SetLightCommand();
// startOfTest.
for (final DeviceOutputSetting deviceOutputSetting : this.ssldDataService.findByRelayType(ssld, RelayType.LIGHT)) {
lightRelays.add(deviceOutputSetting.getExternalId());
if (!iec61850SetLightCommand.switchLightRelay(this.iec61850Client, deviceConnection, deviceOutputSetting.getInternalId(), startOfTest)) {
throw new ProtocolAdapterException(String.format("Failed to switch light relay during self-test with internal index: %d for device: %s", deviceOutputSetting.getInternalId(), deviceRequest.getDeviceIdentification()));
}
}
// Sleep and wait.
this.selfTestSleep();
// Getting the status.
final DeviceStatusDto deviceStatus = new Iec61850GetStatusCommand().getStatusFromDevice(this.iec61850Client, deviceConnection, ssld);
LOGGER.info("Fetching and checking the devicestatus");
// Checking to see if all light relays have the correct state.
for (final LightValueDto lightValue : deviceStatus.getLightValues()) {
if (lightRelays.contains(lightValue.getIndex()) && lightValue.isOn() != startOfTest) {
// request failed.
throw new ProtocolAdapterException("not all relays are ".concat(startOfTest ? "on" : "off"));
}
}
LOGGER.info("All lights relays are {}, returning OK", startOfTest ? "on" : "off");
this.createSuccessfulDefaultResponse(deviceRequest, deviceResponseHandler, status);
} catch (final ConnectionFailureException se) {
LOGGER.info("Original ConnectionFailureException message: {}", se.getMessage());
final ConnectionFailureException seGeneric = new ConnectionFailureException("Connection failure", se);
this.handleConnectionFailureException(deviceRequest, deviceResponseHandler, seGeneric);
} catch (final Exception e) {
LOGGER.info("Selftest failure", e);
final TechnicalException te = new TechnicalException(ComponentType.PROTOCOL_IEC61850, "Selftest failure - " + e.getMessage());
this.handleException(deviceRequest, deviceResponseHandler, te);
}
this.iec61850DeviceConnectionService.disconnect(deviceConnection, deviceRequest);
}
use of com.alliander.osgp.core.db.api.iec61850.entities.Ssld in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850SsldDeviceService method getPowerUsageHistory.
@Override
public void getPowerUsageHistory(final GetPowerUsageHistoryDeviceRequest 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> deviceOutputSettingsLightRelays = this.ssldDataService.findByRelayType(ssld, RelayType.LIGHT);
final List<PowerUsageDataDto> powerUsageHistoryData = new Iec61850PowerUsageHistoryCommand().getPowerUsageHistoryDataFromDevice(this.iec61850Client, deviceConnection, deviceRequest.getPowerUsageHistoryContainer(), deviceOutputSettingsLightRelays);
final GetPowerUsageHistoryDeviceResponse deviceResponse = new GetPowerUsageHistoryDeviceResponse(deviceRequest.getOrganisationIdentification(), deviceRequest.getDeviceIdentification(), deviceRequest.getCorrelationUid(), DeviceMessageStatus.OK, powerUsageHistoryData);
deviceResponseHandler.handleResponse(deviceResponse);
} catch (final ConnectionFailureException se) {
this.handleConnectionFailureException(deviceRequest, deviceResponseHandler, se);
} catch (final Exception e) {
this.handleException(deviceRequest, deviceResponseHandler, e);
}
this.iec61850DeviceConnectionService.disconnect(deviceConnection, deviceRequest);
}
use of com.alliander.osgp.core.db.api.iec61850.entities.Ssld in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850SetScheduleCommand method createScheduleEntries.
/**
* Returns a map of schedule entries, grouped by the internal index.
*/
private Map<Integer, List<ScheduleEntry>> createScheduleEntries(final List<ScheduleDto> scheduleList, final Ssld ssld, final RelayTypeDto relayTypeDto, final SsldDataService ssldDataService) throws FunctionalException {
final Map<Integer, List<ScheduleEntry>> relaySchedulesEntries = new HashMap<>();
final RelayType relayType = RelayType.valueOf(relayTypeDto.name());
for (final ScheduleDto schedule : scheduleList) {
for (final LightValueDto lightValue : schedule.getLightValue()) {
final List<Integer> indexes = new ArrayList<>();
if (lightValue.getIndex() == 0 && (RelayType.TARIFF.equals(relayType) || RelayType.TARIFF_REVERSED.equals(relayType))) {
// Index 0 is not allowed for tariff switching.
throw new FunctionalException(FunctionalExceptionType.VALIDATION_ERROR, ComponentType.PROTOCOL_IEC61850);
} else if (lightValue.getIndex() == 0 && RelayType.LIGHT.equals(relayType)) {
// Index == 0, getting all light relays and adding their
// internal indexes to the indexes list.
final List<DeviceOutputSetting> settings = ssldDataService.findByRelayType(ssld, relayType);
for (final DeviceOutputSetting deviceOutputSetting : settings) {
indexes.add(deviceOutputSetting.getInternalId());
}
} else {
// Index != 0, adding just the one index to the list.
indexes.add(ssldDataService.convertToInternalIndex(ssld, lightValue.getIndex()));
}
ScheduleEntry scheduleEntry;
try {
scheduleEntry = this.convertToScheduleEntry(schedule, lightValue);
} catch (final ProtocolAdapterException e) {
throw new FunctionalException(FunctionalExceptionType.VALIDATION_ERROR, ComponentType.PROTOCOL_IEC61850, e);
}
for (final Integer internalIndex : indexes) {
if (relaySchedulesEntries.containsKey(internalIndex)) {
// Internal index already in the Map, adding to the List
relaySchedulesEntries.get(internalIndex).add(scheduleEntry);
} else {
// First time we come across this relay, checking its
// type.
this.checkRelayForSchedules(ssldDataService.getDeviceOutputSettingForInternalIndex(ssld, internalIndex).getRelayType(), relayType, internalIndex);
// Adding it to scheduleEntries.
final List<ScheduleEntry> scheduleEntries = new ArrayList<>();
scheduleEntries.add(scheduleEntry);
relaySchedulesEntries.put(internalIndex, scheduleEntries);
}
}
}
}
return relaySchedulesEntries;
}
use of com.alliander.osgp.core.db.api.iec61850.entities.Ssld in project Protocol-Adapter-IEC61850 by OSGP.
the class DeviceManagementService method addEventNotifications.
/**
* Send an event notification to OSGP Core.
*
* @param deviceIdentification
* The identification of the device.
* @param eventNotifications
* The event notifications.
*
* @throws ProtocolAdapterException
* In case the device can not be found in the database.
*/
public void addEventNotifications(final String deviceIdentification, final List<EventNotificationDto> eventNotifications) throws ProtocolAdapterException {
final Ssld ssldDevice = this.ssldDataRepository.findByDeviceIdentification(deviceIdentification);
if (ssldDevice == null) {
throw new ProtocolAdapterException("Unable to find device using deviceIdentification: " + deviceIdentification);
}
LOGGER.info("addEventNotifications called for device {}: {}", deviceIdentification, eventNotifications);
final RequestMessage requestMessage = new RequestMessage("no-correlationUid", "no-organisation", deviceIdentification, new ArrayList<>(eventNotifications));
this.osgpRequestMessageSender.send(requestMessage, DeviceFunctionDto.ADD_EVENT_NOTIFICATION.name());
}
Aggregations