use of org.opensmartgridplatform.adapter.protocol.iec61850.exceptions.NodeWriteException in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850Client method sendCommandWithRetry.
/**
* Executes the apply method of the given {@link Function} with retries and
* message logging.
*
* @return The given T.
*/
public <T> T sendCommandWithRetry(final Function<T> function, final String functionName, final String deviceIdentification) throws ProtocolAdapterException {
T output = null;
final DeviceMessageLog deviceMessageLog = new DeviceMessageLog(IED.FLEX_OVL, LogicalDevice.LIGHTING, functionName);
try {
output = function.apply(deviceMessageLog);
} catch (final NodeWriteException | NodeReadException e) {
if (ConnectionState.OK.equals(e.getConnectionState())) {
// ServiceError means we have to retry.
LOGGER.error("Caught ServiceError, retrying", e);
this.sendCommandWithRetry(function, deviceIdentification, 1, deviceMessageLog);
} else {
LOGGER.error("Caught IOException, connection with device is broken.", e);
}
} catch (final ConnectionFailureException e) {
throw e;
} catch (final Exception e) {
throw new ProtocolAdapterException(e == null ? "Could not execute command" : e.getMessage(), e);
}
return output;
}
use of org.opensmartgridplatform.adapter.protocol.iec61850.exceptions.NodeWriteException in project Protocol-Adapter-IEC61850 by OSGP.
the class Iec61850RtuDeviceReportingService method enableMeasurementReportingOnDevice.
private void enableMeasurementReportingOnDevice(final DeviceConnection deviceConnection, final String deviceIdentification, final LogicalDevice logicalDevice, final int logicalDeviceIndex, final DataAttribute reportName) {
LOGGER.info("Allowing device {} to send events", deviceIdentification);
try {
final NodeContainer reportingNode = deviceConnection.getFcModelNode(logicalDevice, logicalDeviceIndex, LogicalNode.LOGICAL_NODE_ZERO, reportName, Fc.BR);
reportingNode.writeBoolean(SubDataAttribute.ENABLE_REPORTING, true);
} catch (final NullPointerException e) {
LOGGER.debug("NullPointerException", e);
LOGGER.warn("Skip enable reporting for device {}{}, report {}.", logicalDevice, logicalDeviceIndex, reportName.getDescription());
} catch (final NodeWriteException e) {
LOGGER.debug("NodeWriteException", e);
LOGGER.error("Enable reporting for device {}{}, report {}, failed with exception: {}", logicalDevice, logicalDeviceIndex, reportName.getDescription(), e.getMessage());
}
}
use of org.opensmartgridplatform.adapter.protocol.iec61850.exceptions.NodeWriteException in project Protocol-Adapter-IEC61850 by OSGP.
the class DeviceRegistrationService method enableReporting.
protected void enableReporting(final DeviceConnection deviceConnection) {
try {
new Iec61850EnableReportingCommand().enableReportingOnDeviceWithoutUsingSequenceNumber(DeviceRegistrationService.this.iec61850DeviceConnectionService.getIec61850Client(), deviceConnection);
// Don't disconnect now! The device should be able to send
// reports.
this.waitClearReportAndDisconnect(deviceConnection);
} catch (final NodeWriteException e) {
LOGGER.error("Unable to enabele reporting for device: " + deviceConnection.getDeviceIdentification(), e);
DeviceRegistrationService.this.iec61850DeviceConnectionService.disconnect(deviceConnection, null);
}
}
use of org.opensmartgridplatform.adapter.protocol.iec61850.exceptions.NodeWriteException in project open-smart-grid-platform by OSGP.
the class Iec61850SetConfigurationFunction method setClockConfiguration.
private void setClockConfiguration(final Iec61850Client iec61850Client, final DeviceConnection deviceConnection, final ConfigurationDto configuration, final DeviceMessageLog deviceMessageLog) throws NodeNotFoundException, NodeReadException, NodeWriteException {
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);
}
if (configuration.getNtpEnabled() != null) {
LOGGER.info("Updating ntpEnabled to {}", configuration.getNtpEnabled());
clock.writeBoolean(SubDataAttribute.NTP_ENABLED, configuration.getNtpEnabled());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.NTP_ENABLED, Boolean.toString(configuration.getNtpEnabled()));
}
if (configuration.getNtpHost() != null) {
LOGGER.info("Updating ntpHost to {}", configuration.getNtpHost());
clock.writeString(SubDataAttribute.NTP_HOST, configuration.getNtpHost());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.NTP_HOST, configuration.getNtpHost());
}
if (configuration.getNtpSyncInterval() != null) {
LOGGER.info("Updating ntpSyncInterval to {}", configuration.getNtpSyncInterval());
clock.writeUnsignedShort(SubDataAttribute.NTP_SYNC_INTERVAL, configuration.getNtpSyncInterval());
deviceMessageLog.addVariable(LogicalNode.STREET_LIGHT_CONFIGURATION, DataAttribute.CLOCK, Fc.CF, SubDataAttribute.NTP_SYNC_INTERVAL, configuration.getNtpSyncInterval().toString());
}
}
use of org.opensmartgridplatform.adapter.protocol.iec61850.exceptions.NodeWriteException in project open-smart-grid-platform by OSGP.
the class Iec61850RtuDeviceReportingService method enableReports.
private void enableReports(final DeviceConnection connection, final String deviceIdentification, final Collection<? extends Rcb> reports) {
for (final Rcb report : reports) {
final String reportReference = report.getReference().toString();
try {
LOGGER.info("Enable reporting for report {} on device {}.", reportReference, deviceIdentification);
if (report instanceof Brcb) {
this.resyncBufferedReport(connection, deviceIdentification, (Brcb) report);
}
final NodeContainer node = new NodeContainer(connection, report);
node.writeBoolean(SubDataAttribute.ENABLE_REPORTING, true);
} catch (final NullPointerException e) {
LOGGER.debug("NullPointerException", e);
LOGGER.warn("Skip enable reporting for report {} on device {}.", reportReference, deviceIdentification);
} catch (final NodeWriteException e) {
LOGGER.debug("NodeWriteException", e);
LOGGER.error("Enable reporting for report {} on device {} failed with exception: {}", reportReference, deviceIdentification, e.getMessage());
}
}
}
Aggregations