use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.LogicalNode in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850SetLightCommand method switchLightRelay.
public Boolean switchLightRelay(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final int index, final boolean on) throws ProtocolAdapterException {
// Commands don't return anything, so returnType is Void.
final Function<Boolean> function = new Function<Boolean>() {
@Override
public Boolean apply(final DeviceMessageLog deviceMessageLog) throws Exception {
try {
final LogicalNode logicalNode = LogicalNode.getSwitchComponentByIndex(index);
// Check if CfSt.enbOper [CF] is set to true. If it is not
// set to true, the relay can not be operated.
final NodeContainer masterControl = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, logicalNode, DataAttribute.MASTER_CONTROL, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), masterControl.getFcmodelNode());
final BdaBoolean enbOper = masterControl.getBoolean(SubDataAttribute.ENABLE_OPERATION);
if (enbOper.getValue()) {
LOGGER.info("masterControl.enbOper is true, switching of relay {} is enabled", index);
} else {
LOGGER.info("masterControl.enbOper is false, switching of relay {} is disabled", index);
// Set the value to true.
masterControl.writeBoolean(SubDataAttribute.ENABLE_OPERATION, true);
LOGGER.info("set masterControl.enbOper to true to enable switching of relay {}", index);
deviceMessageLog.addVariable(logicalNode, DataAttribute.MASTER_CONTROL, Fc.CF, SubDataAttribute.ENABLE_OPERATION, Boolean.toString(true));
}
// Switch the relay using Pos.Oper.ctlVal [CO].
final NodeContainer position = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, logicalNode, DataAttribute.POSITION, Fc.CO);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), position.getFcmodelNode());
final NodeContainer operation = position.getChild(SubDataAttribute.OPERATION);
final BdaBoolean controlValue = operation.getBoolean(SubDataAttribute.CONTROL_VALUE);
LOGGER.info(String.format("Switching relay %d %s", index, on ? "on" : "off"));
controlValue.setValue(on);
operation.write();
deviceMessageLog.addVariable(logicalNode, DataAttribute.POSITION, Fc.CO, SubDataAttribute.OPERATION, SubDataAttribute.CONTROL_VALUE, Boolean.toString(on));
DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
return true;
} catch (final Exception e) {
LOGGER.error("Exception during switchLightRelay()", e);
return false;
}
}
};
return iec61850Client.sendCommandWithRetry(function, "SetLight", deviceConnection.getDeviceIdentification());
}
use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.LogicalNode in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850SetScheduleCommand method setScheduleOnDevice.
public void setScheduleOnDevice(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final RelayTypeDto relayType, final List<ScheduleDto> scheduleList, final Ssld ssld, final SsldDataService ssldDataService) throws ProtocolAdapterException {
final String tariffOrLight = relayType.equals(RelayTypeDto.LIGHT) ? "light" : "tariff";
try {
// Creating a list of all Schedule entries, grouped by relay index.
final Map<Integer, List<ScheduleEntry>> relaySchedulesEntries = this.createScheduleEntries(scheduleList, ssld, relayType, ssldDataService);
final Function<Void> function = new Function<Void>() {
@Override
public Void apply(final DeviceMessageLog deviceMessageLog) throws Exception {
for (final Integer relayIndex : relaySchedulesEntries.keySet()) {
final List<ScheduleEntry> scheduleEntries = relaySchedulesEntries.get(relayIndex);
final int numberOfScheduleEntries = scheduleEntries.size();
if (numberOfScheduleEntries > MAX_NUMBER_OF_SCHEDULE_ENTRIES) {
throw new ProtocolAdapterException("Received " + numberOfScheduleEntries + " " + tariffOrLight + " schedule entries for relay " + relayIndex + " for device " + ssld.getDeviceIdentification() + ". Setting more than " + MAX_NUMBER_OF_SCHEDULE_ENTRIES + " is not possible.");
}
final LogicalNode logicalNode = LogicalNode.getSwitchComponentByIndex(relayIndex);
final NodeContainer schedule = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, logicalNode, DataAttribute.SCHEDULE, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), schedule.getFcmodelNode());
// entries.
for (int i = 0; i < MAX_NUMBER_OF_SCHEDULE_ENTRIES; i++) {
final String scheduleEntryName = SubDataAttribute.SCHEDULE_ENTRY.getDescription() + (i + 1);
final NodeContainer scheduleNode = schedule.getChild(scheduleEntryName);
final boolean enabled = scheduleNode.getBoolean(SubDataAttribute.SCHEDULE_ENABLE).getValue();
LOGGER.info("Checking if schedule entry {} is enabled: {}", i + 1, enabled);
if (enabled) {
LOGGER.info("Disabling schedule entry {} of {} for relay {} before setting new {} schedule", i + 1, MAX_NUMBER_OF_SCHEDULE_ENTRIES, relayIndex, tariffOrLight);
scheduleNode.writeBoolean(SubDataAttribute.SCHEDULE_ENABLE, false);
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_ENABLE, Boolean.toString(false));
}
}
for (int i = 0; i < numberOfScheduleEntries; i++) {
LOGGER.info("Writing {} schedule entry {} for relay {}", tariffOrLight, i + 1, relayIndex);
final ScheduleEntry scheduleEntry = scheduleEntries.get(i);
final String scheduleEntryName = SubDataAttribute.SCHEDULE_ENTRY.getDescription() + (i + 1);
final NodeContainer scheduleNode = schedule.getChild(scheduleEntryName);
final BdaBoolean enabled = scheduleNode.getBoolean(SubDataAttribute.SCHEDULE_ENABLE);
if (enabled.getValue() != scheduleEntry.isEnabled()) {
scheduleNode.writeBoolean(SubDataAttribute.SCHEDULE_ENABLE, scheduleEntry.isEnabled());
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_ENABLE, Boolean.toString(scheduleEntry.isEnabled()));
}
final Integer day = scheduleNode.getInteger(SubDataAttribute.SCHEDULE_DAY).getValue();
if (day != scheduleEntry.getDay()) {
scheduleNode.writeInteger(SubDataAttribute.SCHEDULE_DAY, scheduleEntry.getDay());
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_DAY, Integer.toString(scheduleEntry.getDay()));
}
/*
* A schedule entry on the platform is about
* switching on a certain time, or on a certain
* trigger. The schedule entries on the device are
* about a period with a time on and a time off. To
* bridge these different approaches, either the on
* or the off values on the device are set to a
* certain default to indicate they are not relevant
* to the schedule entry.
*/
int timeOnValue = DEFAULT_SCHEDULE_VALUE;
byte timeOnTypeValue = DEFAULT_SCHEDULE_VALUE;
int timeOffValue = DEFAULT_SCHEDULE_VALUE;
byte timeOffTypeValue = DEFAULT_SCHEDULE_VALUE;
if (scheduleEntry.isOn()) {
timeOnValue = scheduleEntry.getTime();
timeOnTypeValue = (byte) scheduleEntry.getTriggerType().getIndex();
} else {
timeOffValue = scheduleEntry.getTime();
timeOffTypeValue = (byte) scheduleEntry.getTriggerType().getIndex();
}
final Integer timeOn = scheduleNode.getInteger(SubDataAttribute.SCHEDULE_TIME_ON).getValue();
if (timeOn != timeOnValue) {
scheduleNode.writeInteger(SubDataAttribute.SCHEDULE_TIME_ON, timeOnValue);
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_TIME_ON, Integer.toString(timeOnValue));
}
final Byte timeOnActionTime = scheduleNode.getByte(SubDataAttribute.SCHEDULE_TIME_ON_TYPE).getValue();
if (timeOnActionTime != timeOnTypeValue) {
scheduleNode.writeByte(SubDataAttribute.SCHEDULE_TIME_ON_TYPE, timeOnTypeValue);
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_TIME_ON_TYPE, Byte.toString(timeOnTypeValue));
}
final Integer timeOff = scheduleNode.getInteger(SubDataAttribute.SCHEDULE_TIME_OFF).getValue();
if (timeOff != timeOffValue) {
scheduleNode.writeInteger(SubDataAttribute.SCHEDULE_TIME_OFF, timeOffValue);
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_TIME_OFF, Integer.toString(timeOffValue));
}
final Byte timeOffActionTime = scheduleNode.getByte(SubDataAttribute.SCHEDULE_TIME_OFF_TYPE).getValue();
if (timeOffActionTime != timeOffTypeValue) {
scheduleNode.writeByte(SubDataAttribute.SCHEDULE_TIME_OFF_TYPE, timeOffTypeValue);
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_TIME_OFF_TYPE, Byte.toString(timeOffTypeValue));
}
final Integer minimumTimeOn = scheduleNode.getUnsignedShort(SubDataAttribute.MINIMUM_TIME_ON).getValue();
final Integer newMinimumTimeOn = scheduleEntry.getMinimumLightsOn() / 60;
if (minimumTimeOn != newMinimumTimeOn) {
scheduleNode.writeUnsignedShort(SubDataAttribute.MINIMUM_TIME_ON, newMinimumTimeOn);
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.MINIMUM_TIME_ON, Integer.toString(newMinimumTimeOn));
}
final Integer triggerMinutesBefore = scheduleNode.getUnsignedShort(SubDataAttribute.SCHEDULE_TRIGGER_MINUTES_BEFORE).getValue();
if (triggerMinutesBefore != scheduleEntry.getTriggerWindowMinutesBefore()) {
scheduleNode.writeUnsignedShort(SubDataAttribute.SCHEDULE_TRIGGER_MINUTES_BEFORE, scheduleEntry.getTriggerWindowMinutesBefore());
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_TRIGGER_MINUTES_BEFORE, Integer.toString(scheduleEntry.getTriggerWindowMinutesBefore()));
}
final Integer triggerMinutesAfter = scheduleNode.getUnsignedShort(SubDataAttribute.SCHEDULE_TRIGGER_MINUTES_AFTER).getValue();
if (triggerMinutesAfter != scheduleEntry.getTriggerWindowMinutesAfter()) {
scheduleNode.writeUnsignedShort(SubDataAttribute.SCHEDULE_TRIGGER_MINUTES_AFTER, scheduleEntry.getTriggerWindowMinutesAfter());
deviceMessageLog.addVariable(logicalNode, DataAttribute.SCHEDULE, Fc.CF, scheduleEntryName, SubDataAttribute.SCHEDULE_TRIGGER_MINUTES_AFTER, Integer.toString(scheduleEntry.getTriggerWindowMinutesAfter()));
}
}
}
DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
return null;
}
};
iec61850Client.sendCommandWithRetry(function, "SetSchedule", deviceConnection.getDeviceIdentification());
} catch (final FunctionalException e) {
throw new ProtocolAdapterException(e.getMessage(), e);
}
}
use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.LogicalNode in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850SetConfigurationCommand method setConfigurationOnDevice.
public void setConfigurationOnDevice(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final ConfigurationDto configuration) throws ProtocolAdapterException {
final Function<Void> function = new Function<Void>() {
@Override
public Void apply(final DeviceMessageLog deviceMessageLog) throws Exception {
if (configuration.getRelayConfiguration() != null && configuration.getRelayConfiguration().getRelayMap() != null) {
final List<RelayMapDto> relayMaps = configuration.getRelayConfiguration().getRelayMap();
for (final RelayMapDto relayMap : relayMaps) {
final Integer internalIndex = relayMap.getAddress();
final RelayTypeDto relayType = relayMap.getRelayType();
final LogicalNode logicalNode = LogicalNode.getSwitchComponentByIndex(internalIndex);
final NodeContainer switchType = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, logicalNode, DataAttribute.SWITCH_TYPE, Fc.CO);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), switchType.getFcmodelNode());
final NodeContainer operation = switchType.getChild(SubDataAttribute.OPERATION);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), operation.getFcmodelNode());
final BdaInt8 ctlVal = operation.getByte(SubDataAttribute.CONTROL_VALUE);
final byte switchTypeValue = (byte) (RelayTypeDto.LIGHT.equals(relayType) ? SWITCH_TYPE_LIGHT : SWITCH_TYPE_TARIFF);
LOGGER.info("Updating Switch for internal index {} to {} ({})", internalIndex, switchTypeValue, relayType);
ctlVal.setValue(switchTypeValue);
operation.write();
deviceMessageLog.addVariable(logicalNode, DataAttribute.SWITCH_TYPE, Fc.CO, SubDataAttribute.OPERATION, SubDataAttribute.CONTROL_VALUE, Byte.toString(switchTypeValue));
}
}
// don't read the values for no reason.
if (!(configuration.getOsgpIpAddres() == null && configuration.getOsgpPortNumber() == null)) {
final NodeContainer registration = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.REGISTRATION, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), registration.getFcmodelNode());
if (configuration.getOsgpIpAddres() != null) {
LOGGER.info("Updating OspgIpAddress to {}", configuration.getOsgpIpAddres());
registration.writeString(SubDataAttribute.SERVER_ADDRESS, configuration.getOsgpIpAddres());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.REGISTRATION, Fc.CF, SubDataAttribute.SERVER_ADDRESS, configuration.getOsgpIpAddres());
}
if (configuration.getOsgpPortNumber() != null) {
LOGGER.info("Updating OsgpPortNumber to {}", configuration.getOsgpPortNumber());
registration.writeInteger(SubDataAttribute.SERVER_PORT, configuration.getOsgpPortNumber());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.REGISTRATION, Fc.CF, SubDataAttribute.SERVER_PORT, configuration.getOsgpPortNumber().toString());
}
}
// that we don't read the values for no reason.
if (!(configuration.getAstroGateSunRiseOffset() == null && configuration.getAstroGateSunSetOffset() == null && configuration.getLightType() == null)) {
final NodeContainer softwareConfiguration = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), softwareConfiguration.getFcmodelNode());
if (configuration.getAstroGateSunRiseOffset() != null) {
LOGGER.info("Updating AstroGateSunRiseOffset to {}", configuration.getAstroGateSunRiseOffset());
softwareConfiguration.writeShort(SubDataAttribute.ASTRONOMIC_SUNRISE_OFFSET, configuration.getAstroGateSunRiseOffset().shortValue());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, SubDataAttribute.ASTRONOMIC_SUNRISE_OFFSET, Short.toString(configuration.getAstroGateSunRiseOffset().shortValue()));
}
if (configuration.getAstroGateSunSetOffset() != null) {
LOGGER.info("Updating AstroGateSunSetOffset to {}", configuration.getAstroGateSunSetOffset());
softwareConfiguration.writeShort(SubDataAttribute.ASTRONOMIC_SUNSET_OFFSET, configuration.getAstroGateSunSetOffset().shortValue());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, SubDataAttribute.ASTRONOMIC_SUNSET_OFFSET, Short.toString(configuration.getAstroGateSunSetOffset().shortValue()));
}
if (configuration.getLightType() != null) {
LOGGER.info("Updating LightType to {}", configuration.getLightType());
softwareConfiguration.writeString(SubDataAttribute.LIGHT_TYPE, configuration.getLightType().name());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SOFTWARE_CONFIGURATION, Fc.CF, SubDataAttribute.LIGHT_TYPE, configuration.getLightType().name());
}
}
// don't read the values for no reason.
if (!(configuration.getTimeSyncFrequency() == null && configuration.isAutomaticSummerTimingEnabled() == null && configuration.getSummerTimeDetails() == null && configuration.getWinterTimeDetails() == null)) {
final NodeContainer clock = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), clock.getFcmodelNode());
if (configuration.getTimeSyncFrequency() != null) {
LOGGER.info("Updating TimeSyncFrequency to {}", configuration.getTimeSyncFrequency());
clock.writeUnsignedShort(SubDataAttribute.TIME_SYNC_FREQUENCY, configuration.getTimeSyncFrequency());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.TIME_SYNC_FREQUENCY, Integer.toString(configuration.getTimeSyncFrequency()));
}
if (configuration.isAutomaticSummerTimingEnabled() != null) {
LOGGER.info("Updating AutomaticSummerTimingEnabled to {}", configuration.isAutomaticSummerTimingEnabled());
clock.writeBoolean(SubDataAttribute.AUTOMATIC_SUMMER_TIMING_ENABLED, configuration.isAutomaticSummerTimingEnabled());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.AUTOMATIC_SUMMER_TIMING_ENABLED, Boolean.toString(configuration.isAutomaticSummerTimingEnabled()));
}
/*
* Perform some effort to create dstBegT/dstEndt information
* based on provided DateTime values. This will work in a
* number of cases, but to be able to do this accurately in
* an international context, DST transition times will
* probably have to be based on information about the
* time-zone the device is operating in, instead of a
* particular DateTime provided by the caller without
* further information.
*/
final DaylightSavingTimeTransition.DstTransitionFormat dstFormatMwd = DaylightSavingTimeTransition.DstTransitionFormat.DAY_OF_WEEK_OF_MONTH;
final DateTime summerTimeDetails = configuration.getSummerTimeDetails();
final DateTime winterTimeDetails = configuration.getWinterTimeDetails();
if (summerTimeDetails != null) {
final String mwdValueForBeginOfDst = DaylightSavingTimeTransition.forDateTimeAccordingToFormat(summerTimeDetails, dstFormatMwd).getTransition();
LOGGER.info("Updating DstBeginTime to {} based on SummerTimeDetails {}", mwdValueForBeginOfDst, summerTimeDetails);
clock.writeString(SubDataAttribute.SUMMER_TIME_DETAILS, mwdValueForBeginOfDst);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.SUMMER_TIME_DETAILS, mwdValueForBeginOfDst);
}
if (winterTimeDetails != null) {
final String mwdValueForEndOfDst = DaylightSavingTimeTransition.forDateTimeAccordingToFormat(winterTimeDetails, dstFormatMwd).getTransition();
LOGGER.info("Updating DstEndTime to {} based on WinterTimeDetails {}", mwdValueForEndOfDst, winterTimeDetails);
clock.writeString(SubDataAttribute.WINTER_TIME_DETAILS, mwdValueForEndOfDst);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.WINTER_TIME_DETAILS, mwdValueForEndOfDst);
}
}
// don't read the values for no reason.
if (!(configuration.isDhcpEnabled() == null && configuration.getDeviceFixedIp() == null)) {
final NodeContainer ipConfiguration = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), ipConfiguration.getFcmodelNode());
if (configuration.isDhcpEnabled() != null) {
LOGGER.info("Updating DhcpEnabled to {}", configuration.isDhcpEnabled());
ipConfiguration.writeBoolean(SubDataAttribute.ENABLE_DHCP, configuration.isDhcpEnabled());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.ENABLE_DHCP, Boolean.toString(configuration.isDhcpEnabled()));
}
// All values in DeviceFixedIpDto are non-nullable, so no
// null-checks are needed.
final DeviceFixedIpDto deviceFixedIp = configuration.getDeviceFixedIp();
LOGGER.info("Updating deviceFixedIpAddress to {}", configuration.getDeviceFixedIp().getIpAddress());
ipConfiguration.writeString(SubDataAttribute.IP_ADDRESS, deviceFixedIp.getIpAddress());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.IP_ADDRESS, deviceFixedIp.getIpAddress());
LOGGER.info("Updating deviceFixedIpNetmask to {}", configuration.getDeviceFixedIp().getNetMask());
ipConfiguration.writeString(SubDataAttribute.NETMASK, deviceFixedIp.getNetMask());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.NETMASK, deviceFixedIp.getNetMask());
LOGGER.info("Updating deviceFixIpGateway to {}", configuration.getDeviceFixedIp().getGateWay());
ipConfiguration.writeString(SubDataAttribute.GATEWAY, deviceFixedIp.getGateWay());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.IP_CONFIGURATION, Fc.CF, SubDataAttribute.GATEWAY, deviceFixedIp.getGateWay());
}
// Checking to see if all TLS values are null, so that we
// don't read the values for no reason.
// if (!(configuration.getCommonNameString() == null &&
// configuration.isTlsEnabled() == null && configuration
// .getTlsPortNumber() == null)) {
//
// final NodeContainer tls =
// deviceConnection.getFcModelNode(LogicalDevice.LIGHTING,
// LogicalNode.STREET_LIGHT_CONFIGURATION,
// DataAttribute.TLS_CONFIGURATION, Fc.CF);
// iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(),
// tls.getFcmodelNode());
//
// if (configuration.getTlsPortNumber() != null) {
// LOGGER.info("Updating tlsPortNumber to {}",
// configuration.getTlsPortNumber());
// tls.writeUnsignedInteger(SubDataAttribute.TLS_PORT_NUMBER,
// configuration.getTlsPortNumber());
// }
//
// if (configuration.isTlsEnabled() != null) {
// LOGGER.info("Updating tlsEnabled to {}",
// configuration.isTlsEnabled());
// tls.writeBoolean(SubDataAttribute.TLS_ENABLED,
// configuration.isTlsEnabled());
// }
//
// if (configuration.getCommonNameString() != null) {
// LOGGER.info("Updating commonNameString to {}",
// configuration.getCommonNameString());
// tls.writeString(SubDataAttribute.TLS_COMMON_NAME,
// configuration.getCommonNameString());
// }
// }
DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
return null;
}
};
iec61850Client.sendCommandWithRetry(function, "SetConfiguration", deviceConnection.getDeviceIdentification());
}
use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.LogicalNode in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850PowerUsageHistoryCommand method getPowerUsageHistoryDataFromRelay.
private List<PowerUsageDataDto> getPowerUsageHistoryDataFromRelay(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final TimePeriodDto timePeriod, final DeviceOutputSetting deviceOutputSetting, final DeviceMessageLog deviceMessageLog) throws NodeReadException {
final List<PowerUsageDataDto> powerUsageHistoryDataFromRelay = new ArrayList<>();
final int relayIndex = deviceOutputSetting.getExternalId();
final LogicalNode logicalNode = LogicalNode.getSwitchComponentByIndex(deviceOutputSetting.getInternalId());
final NodeContainer onIntervalBuffer = deviceConnection.getFcModelNode(LogicalDevice.LIGHTING, logicalNode, DataAttribute.SWITCH_ON_INTERVAL_BUFFER, Fc.ST);
iec61850Client.readNodeDataValues(deviceConnection.getConnection().getClientAssociation(), onIntervalBuffer.getFcmodelNode());
final Short lastIndex = onIntervalBuffer.getUnsignedByte(SubDataAttribute.LAST_INDEX).getValue();
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SWITCH_ON_INTERVAL_BUFFER, Fc.ST, SubDataAttribute.LAST_INDEX, lastIndex.toString());
/*
* Last index is the last index written in the 60-entry buffer. When the
* last buffer entry is written, the next entry will be placed at the
* first position in the buffer (cyclically). To preserve the order of
* entries written in the response, iteration starts with the next index
* (oldest entry) and loops from there.
*/
final int numberOfEntries = 60;
final int idxOldest = (lastIndex + 1) % numberOfEntries;
for (int i = 0; i < numberOfEntries; i++) {
final int bufferIndex = (idxOldest + i) % numberOfEntries;
final NodeContainer indexedItvNode = onIntervalBuffer.getChild(SubDataAttribute.INTERVAL.getDescription() + (bufferIndex + 1));
LOGGER.info("device: {}, itv{}: {}", deviceConnection.getDeviceIdentification(), bufferIndex + 1, indexedItvNode);
final Integer itvNode = indexedItvNode.getInteger(SubDataAttribute.INTERVAL).getValue();
LOGGER.info("device: {}, itv{}.itv: {}", deviceConnection.getDeviceIdentification(), bufferIndex + 1, itvNode);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SWITCH_ON_INTERVAL_BUFFER, Fc.ST, SubDataAttribute.INTERVAL, SubDataAttribute.INTERVAL, itvNode + "");
final DateTime date = new DateTime(indexedItvNode.getDate(SubDataAttribute.DAY));
LOGGER.info("device: {}, itv{}.day: {}", deviceConnection.getDeviceIdentification(), bufferIndex + 1, date);
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.SWITCH_ON_INTERVAL_BUFFER, Fc.ST, SubDataAttribute.INTERVAL, SubDataAttribute.DAY, itvNode + "");
final int totalMinutesOnForDate = itvNode;
final boolean includeEntryInResponse = this.timePeriodContainsDateTime(timePeriod, date, deviceConnection.getDeviceIdentification(), relayIndex, bufferIndex);
if (!includeEntryInResponse) {
continue;
}
// MeterType.AUX hard-coded (not supported).
final PowerUsageDataDto powerUsageData = new PowerUsageDataDto(date, MeterTypeDto.AUX, 0, 0);
final List<RelayDataDto> relayDataList = new ArrayList<>();
final RelayDataDto relayData = new RelayDataDto(relayIndex, totalMinutesOnForDate);
relayDataList.add(relayData);
final SsldDataDto ssldData = new SsldDataDto(0, 0, 0, 0, 0, 0, 0, 0, 0, relayDataList);
powerUsageData.setSsldData(ssldData);
powerUsageHistoryDataFromRelay.add(powerUsageData);
}
DeviceMessageLoggingService.logMessage(deviceMessageLog, deviceConnection.getDeviceIdentification(), deviceConnection.getOrganisationIdentification(), false);
return powerUsageHistoryDataFromRelay;
}
use of com.alliander.osgp.adapter.protocol.iec61850.infra.networking.helper.LogicalNode 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());
}
Aggregations