Moving Power values to Double

Change-Id: I3529dffe017784487df31b56430e7b9fb9db0454
diff --git a/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java b/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java
index ecae8dd..f9207d3 100644
--- a/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java
+++ b/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java
@@ -213,12 +213,12 @@
                     componentName = component.toString();
                 }
                 ObjectNode powerConfigNode = mapper.createObjectNode()
-                        .put(CURRENT_POWER, powerConfig.currentPower(port, component).orElse(0L))
-                        .put(TARGET_POWER, powerConfig.getTargetPower(port, component).orElse(0L))
+                        .put(CURRENT_POWER, powerConfig.currentPower(port, component).orElse(0.0))
+                        .put(TARGET_POWER, powerConfig.getTargetPower(port, component).orElse(0.0))
                         .put(INPUT_POWER_RANGE, powerConfig.getInputPowerRange(port,
-                                component).orElse(Range.closed(0L, 0L)).toString())
+                                component).orElse(Range.closed(0.0, 0.0)).toString())
                         .put(TARGET_POWER_RANGE, powerConfig.getTargetPowerRange(port,
-                                component).orElse(Range.closed(0L, 0L)).toString());
+                                component).orElse(Range.closed(0.0, 0.0)).toString());
                 powerConfigComponents.set(componentName, powerConfigNode);
             }
             powerConfigPorts.set(port.toString(), powerConfigComponents);
@@ -268,7 +268,7 @@
                     if (!powerNode.isObject()) {
                         throw new IllegalArgumentException(JSON_INVALID);
                     }
-                    Long targetPower = powerNode.get(TARGET_POWER).asLong();
+                    Double targetPower = powerNode.get(TARGET_POWER).asDouble();
                     if (direction != null) {
                         powerConfig.setTargetPower(portNumber, direction, targetPower);
                     }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
index e13b2c7..cbe2927 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
@@ -39,15 +39,15 @@
 public class DistributedRoadmStore implements RoadmStore {
     private static Logger log = LoggerFactory.getLogger(DistributedRoadmStore.class);
 
-    private ConsistentMap<DeviceId, Map<PortNumber, Long>> distPowerMap;
-    private Map<DeviceId, Map<PortNumber, Long>> powerMap;
+    private ConsistentMap<DeviceId, Map<PortNumber, Double>> distPowerMap;
+    private Map<DeviceId, Map<PortNumber, Double>> powerMap;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
     public void activate() {
-        distPowerMap = storageService.<DeviceId, Map<PortNumber, Long>>consistentMapBuilder()
+        distPowerMap = storageService.<DeviceId, Map<PortNumber, Double>>consistentMapBuilder()
                 .withName("onos-roadm-distributed-store")
                 .withSerializer(Serializer.using(KryoNamespaces.API))
                 .build();
@@ -77,8 +77,8 @@
 
 
     @Override
-    public void setTargetPower(DeviceId deviceId, PortNumber portNumber, long targetPower) {
-        Map<PortNumber, Long> portMap = powerMap.get(deviceId);
+    public void setTargetPower(DeviceId deviceId, PortNumber portNumber, double targetPower) {
+        Map<PortNumber, Double> portMap = powerMap.get(deviceId);
         if (portMap != null) {
             portMap.put(portNumber, targetPower);
             powerMap.put(deviceId, portMap);
@@ -88,8 +88,8 @@
     }
 
     @Override
-    public Long getTargetPower(DeviceId deviceId, PortNumber portNumber) {
-        Map<PortNumber, Long> portMap = powerMap.get(deviceId);
+    public Double getTargetPower(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, Double> portMap = powerMap.get(deviceId);
         if (portMap != null) {
             return portMap.get(portNumber);
         }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java
index c21841c..d53bb63 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java
@@ -183,14 +183,14 @@
         private String getCurrentPower(DeviceId deviceId, ChannelData channelData) {
             if (hasAttenuation(deviceId, channelData)) {
                 // report channel power if channel exists
-                Long currentPower = roadmService.getCurrentChannelPower(deviceId,
+                Double currentPower = roadmService.getCurrentChannelPower(deviceId,
                         channelData.outPort(), channelData.ochSignal());
                 return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
             }
             // otherwise, report port power
             Type devType = deviceService.getDevice(deviceId).type();
             PortNumber port = devType == Type.FIBER_SWITCH ? channelData.inPort() : channelData.outPort();
-            Long currentPower = roadmService.getCurrentPortPower(deviceId, port);
+            Double currentPower = roadmService.getCurrentPortPower(deviceId, port);
             return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
         }
 
@@ -199,7 +199,7 @@
             if (signal == null) {
                 return RoadmUtil.NA;
             }
-            Long attenuation = roadmService.getAttenuation(deviceId, channelData.outPort(), signal);
+            Double attenuation = roadmService.getAttenuation(deviceId, channelData.outPort(), signal);
             return RoadmUtil.objectToString(attenuation, RoadmUtil.UNKNOWN);
         }
 
@@ -236,8 +236,8 @@
             ChannelData channelData = ChannelData.fromFlow(entry);
             PortNumber port = channelData.outPort();
             OchSignal signal = channelData.ochSignal();
-            Range<Long> range = roadmService.attenuationRange(deviceId, port, signal);
-            Long attenuation = payload.get(ATTENUATION).asLong();
+            Range<Double> range = roadmService.attenuationRange(deviceId, port, signal);
+            Double attenuation = payload.get(ATTENUATION).asDouble();
             boolean validAttenuation = range != null && range.contains(attenuation);
             if (validAttenuation) {
                 roadmService.setAttenuation(deviceId, port, signal, attenuation);
@@ -315,7 +315,7 @@
             ChannelSpacing spacing = channelSpacing((int) number(chNode, CHANNEL_SPACING_INDEX));
             int multiplier = (int) number(flowNode, CHANNEL_MULTIPLIER);
             OchSignal och = OchSignal.newDwdmSlot(spacing, multiplier);
-            long att = number(flowNode, ATTENUATION);
+            double att = number(flowNode, ATTENUATION);
 
             boolean showItems = deviceService.getDevice(did).type() != Type.FIBER_SWITCH;
             boolean validInPort = roadmService.validInputPort(did, inPort);
@@ -355,7 +355,7 @@
 
                 // Construct error for attenuation
                 if (!validAttenuation) {
-                    Range<Long> range = roadmService.attenuationRange(did, outPort, och);
+                    Range<Double> range = roadmService.attenuationRange(did, outPort, och);
                     if (range != null) {
                         attenuationMessage = String.format(ATTENUATION_ERR_MSG, range.toString());
                     }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java
index 7f1a559..191f608 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java
@@ -189,7 +189,7 @@
 
 
     @Override
-    public void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, long power) {
+    public void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, double power) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
@@ -202,11 +202,11 @@
     }
 
     @Override
-    public Long getTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
+    public Double getTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         // Request target port power when it doesn't exist. Inactive updating mode.
-        Long power = roadmStore.getTargetPower(deviceId, portNumber);
+        Double power = roadmStore.getTargetPower(deviceId, portNumber);
         if (power == null) {
             return syncTargetPortPower(deviceId, portNumber);
         }
@@ -214,12 +214,12 @@
     }
 
     @Override
-    public Long syncTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
+    public Double syncTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> pl = powerConfig.getTargetPower(portNumber, Direction.ALL);
+            Optional<Double> pl = powerConfig.getTargetPower(portNumber, Direction.ALL);
             if (pl.isPresent()) {
                 roadmStore.setTargetPower(deviceId, portNumber, pl.get());
                 return pl.get();
@@ -232,7 +232,7 @@
 
     @Override
     public void setAttenuation(DeviceId deviceId, PortNumber portNumber,
-                               OchSignal ochSignal, long attenuation) {
+                               OchSignal ochSignal, double attenuation) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
@@ -246,13 +246,13 @@
     }
 
     @Override
-    public Long getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
+    public Double getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> attenuation = powerConfig.getTargetPower(portNumber, ochSignal);
+            Optional<Double> attenuation = powerConfig.getTargetPower(portNumber, ochSignal);
             if (attenuation.isPresent()) {
                 return attenuation.get();
             }
@@ -261,12 +261,12 @@
     }
 
     @Override
-    public Long getCurrentPortPower(DeviceId deviceId, PortNumber portNumber) {
+    public Double getCurrentPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> currentPower = powerConfig.currentPower(portNumber, Direction.ALL);
+            Optional<Double> currentPower = powerConfig.currentPower(portNumber, Direction.ALL);
             if (currentPower.isPresent()) {
                 return currentPower.get();
             }
@@ -275,13 +275,13 @@
     }
 
     @Override
-    public Long getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
+    public Double getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> currentPower = powerConfig.currentPower(portNumber, ochSignal);
+            Optional<Double> currentPower = powerConfig.currentPower(portNumber, ochSignal);
             if (currentPower.isPresent()) {
                 return currentPower.get();
             }
@@ -375,8 +375,8 @@
 
     @Override
     public FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
-                                   int timeout, PortNumber inPort, PortNumber outPort,
-                                   OchSignal ochSignal, long attenuation) {
+                                 int timeout, PortNumber inPort, PortNumber outPort,
+                                 OchSignal ochSignal, Double attenuation) {
         checkNotNull(deviceId);
         checkNotNull(inPort);
         checkNotNull(outPort);
@@ -404,32 +404,32 @@
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
             return range.isPresent();
         }
         return false;
     }
 
     @Override
-    public boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, long power) {
+    public boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, double power) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
             return range.isPresent() && range.get().contains(power);
         }
         return false;
     }
 
     @Override
-    public boolean attenuationInRange(DeviceId deviceId, PortNumber outPort, long att) {
+    public boolean attenuationInRange(DeviceId deviceId, PortNumber outPort, double att) {
         checkNotNull(deviceId);
         checkNotNull(outPort);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
             OchSignal stubOch = OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 0);
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(outPort, stubOch);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(outPort, stubOch);
             return range.isPresent() && range.get().contains(att);
         }
         return false;
@@ -441,7 +441,7 @@
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
             return range.isPresent();
         }
         return false;
@@ -486,12 +486,12 @@
     }
 
     @Override
-    public Range<Long> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
+    public Range<Double> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
             if (range.isPresent()) {
                 return range.get();
             }
@@ -500,13 +500,13 @@
     }
 
     @Override
-    public Range<Long> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
+    public Range<Double> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, ochSignal);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, ochSignal);
             if (range.isPresent()) {
                 return range.get();
             }
@@ -515,12 +515,12 @@
     }
 
     @Override
-    public Range<Long> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
+    public Range<Double> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
             if (range.isPresent()) {
                 return range.get();
             }
@@ -588,13 +588,13 @@
             return;
         }
 
-        Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+        Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
         if (!range.isPresent()) {
             log.warn("No target power range found for port {} on device {}", portNumber, deviceId);
             return;
         }
 
-        Long power = roadmStore.getTargetPower(deviceId, portNumber);
+        Double power = roadmStore.getTargetPower(deviceId, portNumber);
         if (power == null) {
             // Set default to middle of the range
             power = (range.get().lowerEndpoint() + range.get().upperEndpoint()) / 2;
@@ -615,9 +615,9 @@
 
         List<Port> ports = deviceService.getPorts(deviceId);
         for (Port port : ports) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(port.number(), Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(port.number(), Direction.ALL);
             if (range.isPresent()) {
-                Long power = roadmStore.getTargetPower(deviceId, port.number());
+                Double power = roadmStore.getTargetPower(deviceId, port.number());
                 if (power == null) {
                     // Set default to middle of the range
                     power = (range.get().lowerEndpoint() + range.get().upperEndpoint()) / 2;
@@ -633,7 +633,7 @@
     // Delay the call to setTargetPower because the flow may not be in the store yet
     // Tested with Lumentum ROADM-20 1 seconds was not enough, increased to 5 seconds
     private void delayedSetAttenuation(DeviceId deviceId, PortNumber outPort,
-                                       OchSignal ochSignal, long attenuation) {
+                                       OchSignal ochSignal, Double attenuation) {
         Runnable setAtt = () -> {
             try {
                 TimeUnit.SECONDS.sleep(5);
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
index f0d0183..54d1a59 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
@@ -204,7 +204,7 @@
         // If the port is RX direction then acquire the input power range from driver.
         // Otherwise there will be a TX direction port, thus acquire the target power range.
         private String getPowerRange(DeviceId deviceId, PortNumber portNumber) {
-            Range<Long> range = roadmService.inputPortPowerRange(deviceId, portNumber);
+            Range<Double> range = roadmService.inputPortPowerRange(deviceId, portNumber);
             if (range == null) {
                 range = roadmService.targetPortPowerRange(deviceId, portNumber);
             }
@@ -213,7 +213,7 @@
 
         // Returns the current power as a string, Unknown if no value can be found.
         private String getCurrentPower(DeviceId deviceId, PortNumber portNumber) {
-            Long currentPower = roadmService.getCurrentPortPower(deviceId, portNumber);
+            Double currentPower = roadmService.getCurrentPortPower(deviceId, portNumber);
             return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
         }
 
@@ -223,7 +223,7 @@
             if (!roadmService.hasPortTargetPower(deviceId, portNumber)) {
                 return RoadmUtil.NA;
             }
-            Long targetPower = roadmService.getTargetPortPower(deviceId, portNumber);
+            Double targetPower = roadmService.getTargetPortPower(deviceId, portNumber);
             return RoadmUtil.objectToString(targetPower, RoadmUtil.UNKNOWN);
         }
 
@@ -253,12 +253,12 @@
         public void process(ObjectNode payload) {
             DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
             PortNumber portNumber = PortNumber.portNumber(payload.get(ID).asLong());
-            Range<Long> range = roadmService.targetPortPowerRange(deviceId, portNumber);
+            Range<Double> range = roadmService.targetPortPowerRange(deviceId, portNumber);
             if (range == null) {
                 log.warn("Unable to determine target power range for device {}", deviceId);
                 return;
             }
-            Long targetPower = payload.get(TARGET_POWER).asLong();
+            Double targetPower = payload.get(TARGET_POWER).asDouble();
             boolean validTargetPower = range.contains(targetPower);
             if (validTargetPower) {
                 roadmService.setTargetPortPower(deviceId, portNumber, targetPower);
@@ -284,7 +284,7 @@
         public void process(ObjectNode payload) {
             DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
             PortNumber portNumber = PortNumber.portNumber(payload.get(ID).asLong());
-            Long targetPower = roadmService.syncTargetPortPower(deviceId, portNumber);
+            Double targetPower = roadmService.syncTargetPortPower(deviceId, portNumber);
             String power = RoadmUtil.objectToString(targetPower, RoadmUtil.UNKNOWN);
             ObjectNode rootNode = objectNode();
             rootNode.put(ID, payload.get(ID).asText())
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java
index d116391..7662626 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java
@@ -91,7 +91,7 @@
      * @param portNumber PortNumber of the port to configure
      * @param power value to set target power to
      */
-    void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, long power);
+    void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, double power);
 
     /**
      * Returns the target power stored in storage for a port if the port has configurable target power.
@@ -100,7 +100,7 @@
      * @param portNumber PortNumber of the port to configure
      * @return the target power if the port has a target power, null otherwise
      */
-    Long getTargetPortPower(DeviceId deviceId, PortNumber portNumber);
+    Double getTargetPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Sync-up the target power for a port if the operator want to check the configuration.
@@ -108,7 +108,7 @@
      * @param portNumber PortNumber of the port to configure
      * @return the target power if the port has a target power, null otherwise
      */
-    Long syncTargetPortPower(DeviceId deviceId, PortNumber portNumber);
+    Double syncTargetPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Sets the attenuation of a connection. This does not check that attenuation
@@ -119,7 +119,7 @@
      * @param ochSignal channel to set attenuation for
      * @param attenuation attenuation value to set to
      */
-    void setAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal, long attenuation);
+    void setAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal, double attenuation);
 
     /**
      * Returns the attenuation of a connection.
@@ -129,7 +129,7 @@
      * @param ochSignal channel to search for
      * @return attenuation if found, null otherwise
      */
-    Long getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
+    Double getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
 
     /**
      * Returns the current port power.
@@ -138,7 +138,7 @@
      * @param portNumber PortNumber of the port
      * @return current power if found, null otherwise
      */
-    Long getCurrentPortPower(DeviceId deviceId, PortNumber portNumber);
+    Double getCurrentPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Returns the current channel power.
@@ -148,7 +148,7 @@
      * @param ochSignal channel to search for
      * @return channel power if found, null otherwise
      */
-    Long getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
+    Double getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
 
     /**
      * Returns the channels supported by a port.
@@ -217,7 +217,7 @@
      */
     FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
                           int timeout, PortNumber inPort, PortNumber outPort,
-                          OchSignal ochSignal, long attenuation);
+                          OchSignal ochSignal, Double attenuation);
 
     /**
      * Removes an internal connection from a device by matching the FlowId and
@@ -250,7 +250,7 @@
      * @return true if value is within the acceptable target power range, false
      * otherwise
      */
-    boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, long power);
+    boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, double power);
 
     /**
      * Returns true if value is within the acceptable attenuation range of a
@@ -264,7 +264,7 @@
      * @return true if value is within the acceptable attenuation range, false
      * otherwise
      */
-    boolean attenuationInRange(DeviceId deviceId, PortNumber portNumber, long att);
+    boolean attenuationInRange(DeviceId deviceId, PortNumber portNumber, double att);
 
     /**
      * Returns true if the port is an input port.
@@ -324,7 +324,7 @@
      * @param portNumber PortNumber of the port
      * @return range if found, null otherwise
      */
-    Range<Long> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber);
+    Range<Double> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Returns the acceptable attenuation range for a connection.
@@ -334,7 +334,7 @@
      * @param ochSignal channel to check
      * @return range if found, null otherwise
      */
-    Range<Long> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
+    Range<Double> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
 
     /**
      * Returns the expected input power range for an input port.
@@ -343,5 +343,5 @@
      * @param portNumber PortNumber of an input port
      * @return range if found, null otherwise
      */
-    Range<Long> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber);
+    Range<Double> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber);
 }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java
index 6c7abac..764131b 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java
@@ -52,7 +52,7 @@
      * @param portNumber PortNumber of the port
      * @param targetPower target port power to store
      */
-    void setTargetPower(DeviceId deviceId, PortNumber portNumber, long targetPower);
+    void setTargetPower(DeviceId deviceId, PortNumber portNumber, double targetPower);
 
     /**
      * Returns the targetPower for a port on a device. The device needs to be added
@@ -63,7 +63,7 @@
      * @param portNumber PortNumber of the port
      * @return target power if target power has already been set, null otherwise
      */
-    Long getTargetPower(DeviceId deviceId, PortNumber portNumber);
+    Double getTargetPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Remove the targetPower for a port on a device. The power value is removed,
diff --git a/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html b/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html
index 79e2fb5..db86b57 100644
--- a/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html
+++ b/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html
@@ -67,8 +67,8 @@
                     <td colId="name">Name</td>
                     <td colId="type">Type</td>
                     <td colId="enabled">Enabled</td>
-                    <td colId="minFreq">Min Freq (GHz)</td>
-                    <td colId="maxFreq">Max Freq (GHz)</td>
+                    <td colId="minFreq">Min Freq (THz)</td>
+                    <td colId="maxFreq">Max Freq (THz)</td>
                     <td colId="grid">Grid (GHz)</td>
                     <td colId="modulation">Modulation</td>
                     <td colId="powerRange">Power Range (dBm)</td>
@@ -105,10 +105,10 @@
                         </form>
                     </td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.powerRange}}</td>
-                    <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.currentPower}}</td>
+                    <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.currentPower | number: '1.2-2'}}</td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">
                         <form [formGroup]="powerForm" (ngSubmit)="submitPower(devId, port.id)" *ngIf="port.type=='OCH'">
-                            <input type="number" step="any" style="width:50px" value="{{port.targetPower}}" formControlName="newPower" required>
+                            <input type="number" step="any" style="width:50px" value="{{port.targetPower | number: '1.2-2'}}" formControlName="newPower" required>
                             <button type="submit">Submit</button>
                         </form>
                     </td>
diff --git a/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java b/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java
index 817bba8..901cd21 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java
@@ -58,7 +58,7 @@
 
     @Argument(index = 2, name = "value", description = "target-output-power value. Unit: dBm",
             required = false, multiValued = false)
-    private Long value = null;
+    private Double value = null;
 
     @Override
     protected void doExecute() throws Exception {
@@ -81,28 +81,28 @@
         // FIXME the parameter "component" equals NULL now, because there is one-to-one mapping between
         //  <component> and <optical-channel>.
         if (operation.equals("get")) {
-            Optional<Long> val = powerConfig.getTargetPower(cp.port(), Direction.ALL);
+            Optional<Double> val = powerConfig.getTargetPower(cp.port(), Direction.ALL);
             if (val.isPresent()) {
-                long power = val.orElse(Long.MIN_VALUE);
-                print("The target-output-power value in port %s on device %s is %d.",
+                double power = val.orElse(Double.MIN_VALUE);
+                print("The target-output-power value in port %s on device %s is %f.",
                         cp.port().toString(), cp.deviceId().toString(), power);
             }
-            Optional<Long> currentPower = powerConfig.currentPower(cp.port(), Direction.ALL);
+            Optional<Double> currentPower = powerConfig.currentPower(cp.port(), Direction.ALL);
             if (currentPower.isPresent()) {
-                long currentPowerVal = currentPower.orElse(Long.MIN_VALUE);
-                print("The current-output-power value in port %s on device %s is %d.",
+                double currentPowerVal = currentPower.orElse(Double.MIN_VALUE);
+                print("The current-output-power value in port %s on device %s is %f.",
                         cp.port().toString(), cp.deviceId().toString(), currentPowerVal);
             }
-            Optional<Long> currentInputPower = powerConfig.currentInputPower(cp.port(), Direction.ALL);
+            Optional<Double> currentInputPower = powerConfig.currentInputPower(cp.port(), Direction.ALL);
             if (currentInputPower.isPresent()) {
-                long inputPowerVal = currentInputPower.orElse(Long.MIN_VALUE);
-                print("The current-input-power value in port %s on device %s is %d.",
+                double inputPowerVal = currentInputPower.orElse(Double.MIN_VALUE);
+                print("The current-input-power value in port %s on device %s is %f.",
                         cp.port().toString(), cp.deviceId().toString(), inputPowerVal);
             }
         } else if (operation.equals("edit-config")) {
             checkNotNull(value);
             powerConfig.setTargetPower(cp.port(), Direction.ALL, value);
-            print("Set %s power on port", value, connectPoint);
+            print("Set %f power on port", value, connectPoint);
         } else {
             print("Operation %s are not supported now.", operation);
         }
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
index 92bfba6..7e04198 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
@@ -43,7 +43,7 @@
      * @param component the port component
      * @return target power in .01 dBm
      */
-    Optional<Long> getTargetPower(PortNumber port, T component);
+    Optional<Double> getTargetPower(PortNumber port, T component);
 
     /**
      * Set the target power on the component.
@@ -52,7 +52,7 @@
      * @param component the port component
      * @param power target power in .01 dBm
      */
-    void setTargetPower(PortNumber port, T component, long power);
+    void setTargetPower(PortNumber port, T component, double power);
 
     /**
      * Get the current output power on the component.
@@ -61,7 +61,7 @@
      * @param component the port component
      * @return power power in .01 dBm
      */
-    Optional<Long> currentPower(PortNumber port, T component);
+    Optional<Double> currentPower(PortNumber port, T component);
 
     /**
      * Get the current input power on the component.
@@ -69,7 +69,7 @@
      * @param component the port component
      * @return power in .01 dBm
      */
-    default Optional<Long> currentInputPower(PortNumber port, T component)  {
+    default Optional<Double> currentInputPower(PortNumber port, T component)  {
         return Optional.empty();
     }
 
@@ -82,7 +82,7 @@
      * @return the accepted target power range, null if the component's power is
      * not configurable. For example the port target power can only be set on TX ports.
      */
-    default Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    default Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         return Optional.empty();
     }
 
@@ -96,7 +96,7 @@
      * a specified input power range. For example input power range only applies
      * to RX ports.
      */
-    default Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    default Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         return Optional.empty();
     }
 
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java
index 7bc44c6..f495a21 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java
@@ -46,13 +46,13 @@
 
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         return Optional.ofNullable(acquireTargetPower(port, component));
     }
 
     //Used by the ROADM app to set the "attenuation" parameter
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
             setConnectionTargetPower(port, (OchSignal) component, power);
         } else {
@@ -61,12 +61,12 @@
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         return Optional.ofNullable(acquireCurrentPower(port, component));
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber portNumber, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber portNumber, T component) {
 
         log.debug("Lumentum getTargetPowerRange {}", portNumber);
         //TODO automatically read if a port is input or output
@@ -87,7 +87,7 @@
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber portNumber, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber portNumber, T component) {
 
         log.debug("Lumentum getInputPowerRange {}", portNumber);
         //TODO automatically read if a port is input or output
@@ -110,7 +110,7 @@
     //TODO implement actual get configuration from the device
     //This is used by ROADM application to retrieve attenuation parameter, with T instanceof OchSignal
     //The ROADM app expresses the attenuation in 0.01 dB units
-    private Long acquireTargetPower(PortNumber port, T component) {
+    private Double acquireTargetPower(PortNumber port, T component) {
         log.debug("Lumentum get port {} target power...", port);
 
         if (component instanceof OchSignal) {
@@ -120,7 +120,7 @@
 
             if (rules == null) {
                 log.error("Lumentum NETCONF fail to retrieve attenuation signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 rule = rules.stream()
                         .filter(c -> ((LumentumFlowRule) c).getOutputPort() == port)
@@ -131,20 +131,20 @@
 
             if (rule == null) {
                 log.error("Lumentum NETCONF fail to retrieve attenuation signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 log.debug("Lumentum NETCONF on port {} attenuation {}", port,
                         (((LumentumFlowRule) rule).attenuation * 100));
-                return ((long) (((LumentumFlowRule) rule).attenuation * 100));
+                return ((LumentumFlowRule) rule).attenuation * 100;
             }
         }
 
-        return 0L;
+        return 0.0;
     }
 
     //TODO implement actual get configuration from the device
     //This is used by ROADM application to retrieve power parameter, with T instanceof OchSignal
-    private Long acquireCurrentPower(PortNumber port, T component) {
+    private Double acquireCurrentPower(PortNumber port, T component) {
         log.debug("Lumentum get port {} current power...", port);
 
         if (component instanceof OchSignal) {
@@ -154,7 +154,7 @@
 
             if (rules == null) {
                 log.error("Lumentum NETCONF fail to retrieve power signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 rule = rules.stream()
                         .filter(c -> ((LumentumFlowRule) c).getInputPort() == port)
@@ -165,38 +165,38 @@
 
             if (rule == null) {
                 log.error("Lumentum NETCONF fail to retrieve power signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 log.debug("Lumentum NETCONF on port {} power {}", port, (((LumentumFlowRule) rule).inputPower));
-                return ((long) (((LumentumFlowRule) rule).inputPower * 100));
+                return ((double) (((LumentumFlowRule) rule).inputPower * 100));
             }
         }
 
-        return 0L;
+        return 0.0;
     }
 
     //TODO implement actual get configuration from the device
     //Return PowerRange -60 dBm to 60 dBm
-    private Range<Long> getTxPowerRange(PortNumber port, T component) {
+    private Range<Double> getTxPowerRange(PortNumber port, T component) {
         log.debug("Get port {} tx power range...", port);
-        return Range.closed(-60L, 60L);
+        return Range.closed(-60.0, 60.0);
     }
 
     //TODO implement actual get configuration from the device
     //Return PowerRange -60dBm to 60 dBm
-    private Range<Long> getRxPowerRange(PortNumber port, T component) {
+    private Range<Double> getRxPowerRange(PortNumber port, T component) {
         log.debug("Get port {} rx power range...", port);
-        return Range.closed(-60L, 60L);
+        return Range.closed(-60.0, 60.0);
     }
 
     //TODO implement configuration on the device
     //Nothing to do
-    private void setPortTargetPower(PortNumber port, long power) {
+    private void setPortTargetPower(PortNumber port, double power) {
         log.debug("Set port {} target power {}", port, power);
     }
 
     //Used by the ROADM app to set the "attenuation" parameter
-    private void setConnectionTargetPower(PortNumber port, OchSignal signal, long power) {
+    private void setConnectionTargetPower(PortNumber port, OchSignal signal, double power) {
         log.debug("Set connection target power {} ochsignal {} port {}", power, signal, port);
 
         Set<FlowRule> rules = getConnectionCache().get(did());
@@ -231,7 +231,7 @@
 
     //Following Lumentum documentation <edit-config> operation to edit connection parameter
     //Currently only edit the "attenuation" parameter
-    private boolean editConnection(int moduleId, int connectionId, long attenuation) {
+    private boolean editConnection(int moduleId, int connectionId, double attenuation) {
 
         double attenuationDouble = ((double) attenuation);
 
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java
index 7b312bf..24251e6 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java
@@ -58,8 +58,6 @@
 
     private static final String RPC_CLOSE_TAG = "</rpc>";
 
-    private static final long NO_POWER = -50;
-
     private static final Logger log = getLogger(CassiniTerminalDevicePowerConfig.class);
 
     private ComponentType state = ComponentType.DIRECTION;
@@ -122,37 +120,37 @@
      * @return target power value
      */
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPower(port, component);
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         checkState(component);
         state.setTargetPower(port, component, power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         checkState(component);
         return state.currentPower(port, component);
     }
 
     @Override
-    public Optional<Long> currentInputPower(PortNumber port, T component) {
+    public Optional<Double> currentInputPower(PortNumber port, T component) {
         checkState(component);
         return state.currentInputPower(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPowerRange(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getInputPowerRange(port, component);
     }
@@ -195,12 +193,12 @@
          */
         DIRECTION() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
 
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         },
@@ -210,12 +208,12 @@
          */
         OCHSIGNAL() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
 
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         };
@@ -230,7 +228,7 @@
          * @param component component
          * @return target power
          */
-        Optional<Long> getTargetPower(PortNumber port, Object component) {
+        Optional<Double> getTargetPower(PortNumber port, Object component) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String filter = parsePort(cassini, port, null, null);
@@ -253,7 +251,10 @@
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/config");
-                long power = Float.valueOf(config.getString("target-output-power")).longValue();
+                if (config == null || config.getString("target-output-power") == null) {
+                    return Optional.empty();
+                }
+                double power = Float.valueOf(config.getString("target-output-power")).doubleValue();
                 return Optional.of(power);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -267,7 +268,7 @@
          * @param component component
          * @param power     target value
          */
-        void setTargetPower(PortNumber port, Object component, long power) {
+        void setTargetPower(PortNumber port, Object component, double power) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String editConfig = parsePort(cassini, port, null, power);
@@ -301,13 +302,16 @@
          * @param component the component.
          * @return current output power.
          */
-        Optional<Long> currentPower(PortNumber port, Object component) {
+        Optional<Double> currentPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<output-power><instant/></output-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/output-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                if (config == null || config.getString("instant") == null) {
+                    return Optional.empty();
+                }
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -321,28 +325,31 @@
          * @param component the component
          * @return current input power
          */
-        Optional<Long> currentInputPower(PortNumber port, Object component) {
+        Optional<Double> currentInputPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<input-power><instant/></input-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/input-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                if (config == null || config.getString("instant") == null) {
+                    return Optional.empty();
+                }
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
             }
         }
 
-        Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-            long targetMin = -30;
-            long targetMax = 1;
+        Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+            double targetMin = -30;
+            double targetMax = 1;
             return Optional.of(Range.open(targetMin, targetMax));
         }
 
-        Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-            long targetMin = -30;
-            long targetMax = 1;
+        Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+            double targetMin = -30;
+            double targetMax = 1;
             return Optional.of(Range.open(targetMin, targetMax));
         }
 
@@ -409,7 +416,7 @@
          * @return filtering string in xml format
          */
         private static String parsePort(CassiniTerminalDevicePowerConfig pc, PortNumber portNumber,
-                                        Object component, Long power) {
+                                        Object component, Double power) {
             if (component == null) {
                 String name = ocName(pc, portNumber);
                 StringBuilder sb = new StringBuilder("<components xmlns=\"http://openconfig.net/yang/platform\">");
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java
index 0029fff..b823e0c 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java
@@ -56,7 +56,7 @@
 
     private static final String RPC_CLOSE_TAG = "</rpc>";
 
-    private static final long NO_POWER = -50;
+    private static final double NO_POWER = -50;
 
     private static final Logger log = getLogger(CassiniTerminalDevicePowerConfigExt.class);
 
@@ -119,37 +119,37 @@
      * @return target power value
      */
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPower(port, component);
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         checkState(component);
         state.setTargetPower(port, component, power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         checkState(component);
         return state.currentPower(port, component);
     }
 
     @Override
-    public Optional<Long> currentInputPower(PortNumber port, T component) {
+    public Optional<Double> currentInputPower(PortNumber port, T component) {
         checkState(component);
         return state.currentInputPower(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPowerRange(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getInputPowerRange(port, component);
     }
@@ -191,11 +191,11 @@
          */
         DIRECTION() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         },
@@ -205,12 +205,12 @@
          */
         OCHSIGNAL() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
 
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         };
@@ -225,7 +225,7 @@
          * @param component component
          * @return target power
          */
-        Optional<Long> getTargetPower(PortNumber port, Object component) {
+        Optional<Double> getTargetPower(PortNumber port, Object component) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String filter = parsePort(cassini, port, null, null);
@@ -241,7 +241,7 @@
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/config");
-                long power = Float.valueOf(config.getString("target-output-power")).longValue();
+                double power = Float.valueOf(config.getString("target-output-power")).doubleValue();
                 return Optional.of(power);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -254,7 +254,7 @@
          * @param component component
          * @param power target value
          */
-        void setTargetPower(PortNumber port, Object component, long power) {
+        void setTargetPower(PortNumber port, Object component, double power) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String editConfig = parsePort(cassini, port, null, power);
@@ -281,13 +281,13 @@
          * @param component the component.
          * @return current output power.
          */
-        Optional<Long> currentPower(PortNumber port, Object component) {
+        Optional<Double> currentPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                                     cassini, port, "<output-power><instant/></output-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/output-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -300,27 +300,27 @@
          * @param component the component
          * @return current input power
          */
-        Optional<Long> currentInputPower(PortNumber port, Object component) {
+        Optional<Double> currentInputPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<input-power><instant/></input-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/input-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
             }
         }
 
-        Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
+        Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<target-power-range/>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/target-power-range");
-                long targetMin = Float.valueOf(config.getString("min")).longValue();
-                long targetMax = Float.valueOf(config.getString("max")).longValue();
+                double targetMin = Float.valueOf(config.getString("min")).doubleValue();
+                double targetMax = Float.valueOf(config.getString("max")).doubleValue();
                 return Optional.of(Range.open(targetMin, targetMax));
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -328,14 +328,14 @@
 
         }
 
-        Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
+        Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<input-power-range/>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/input-power-range");
-                long inputMin = Float.valueOf(config.getString("min")).longValue();
-                long inputMax = Float.valueOf(config.getString("max")).longValue();
+                double inputMin = Float.valueOf(config.getString("min")).doubleValue();
+                double inputMax = Float.valueOf(config.getString("max")).doubleValue();
                 return Optional.of(Range.open(inputMin, inputMax));
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -395,7 +395,7 @@
          * @return filtering string in xml format
          */
         private static String parsePort(CassiniTerminalDevicePowerConfigExt pc, PortNumber portNumber,
-                                        Object component, Long power) {
+                                        Object component, Double power) {
             if (component == null) {
                 String name = ocName(pc, portNumber);
                 StringBuilder sb = new StringBuilder("<components xmlns=\"http://openconfig.net/yang/platform\">");
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
index 110096c..dba2f6f 100644
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
@@ -69,38 +69,54 @@
     private static final Logger log = getLogger(OplinkOpticalPowerConfig.class);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
+        Long power = acquireTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
-            setChannelTargetPower(port, (OchSignal) component, power);
+            setChannelTargetPower(port, (OchSignal) component, (long) power);
         } else {
-            setPortTargetPower(port, power);
+            setPortTargetPower(port, (long) power);
         }
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getTxPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
+        Range<Long> power = getTxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getRxPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
+        Range<Long> power = getRxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     private String getPortPowerFilter(PortNumber port, String selection) {
         return new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_PORTS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_PORT))
                 .append(xmlEmpty(selection))
                 .append(xmlClose(KEY_PORT))
@@ -112,7 +128,7 @@
     private String getChannelPowerFilter(PortNumber port, OchSignal channel) {
         return new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_OCMS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_OCMSTATS))
                 .append(xml(KEY_CHNUM, Integer.toString(channel.spacingMultiplier())))
                 .append(xmlEmpty(KEY_CHSTATS))
@@ -135,7 +151,7 @@
     private String getPowerRangeFilter(PortNumber port, String direction) {
         return new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_PORTS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_PORT))
                 .append(xml(KEY_PORTDIRECT, direction))
                 .append(xmlEmpty(KEY_PORTPROPERTY))
@@ -194,9 +210,9 @@
         log.debug("Set port{} target power...", port);
         String cfg = new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_PORTS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_PORT))
-                .append(xml(KEY_PORTTARPWR, Long.toString(power)))
+                .append(xml(KEY_PORTTARPWR, Double.toString(power)))
                 .append(xmlClose(KEY_PORT))
                 .append(xmlClose(KEY_PORTS))
                 .append(xmlClose(KEY_OPENOPTICALDEV))
@@ -209,7 +225,7 @@
         FlowRuleService service = handler().get(FlowRuleService.class);
         Iterable<FlowEntry> entries = service.getFlowEntries(data().deviceId());
         for (FlowEntry entry : entries) {
-            OplinkCrossConnect crossConnect  = OplinkOpticalUtility.fromFlowRule(this, entry);
+            OplinkCrossConnect crossConnect = OplinkOpticalUtility.fromFlowRule(this, entry);
             // The channel port might be input port or output port.
             if ((port.equals(crossConnect.getInPort()) || port.equals(crossConnect.getOutPort())) &&
                     channel.spacingMultiplier() == crossConnect.getChannel()) {
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java
index 6aabf17..762d1be 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java
@@ -25,40 +25,55 @@
 
 /**
  * Port Power (Gain and attenuation) implementation for Oplink EDFA device.
- *
+ * <p>
  * An Oplink EDFA port exposes Direction resources.
  * Set gain(attenuation) at AGC mode or set output level at APC mode.
- *
  */
 
 public class OplinkEdfaPowerConfig extends AbstractHandlerBehaviour
-                                    implements PowerConfig<Object> {
+        implements PowerConfig<Object> {
 
     // oplink power config utility
     private OplinkPowerConfigUtil oplinkUtil = new OplinkPowerConfigUtil(this);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, Object component, long power) {
-        oplinkUtil.setTargetPower(port, component, power);
+    public void setTargetPower(PortNumber port, Object component, double power) {
+        oplinkUtil.setTargetPower(port, component, (long) power);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getTargetPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getInputPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getInputPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 }
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java
index 157ec8a..b750bf1 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java
@@ -25,40 +25,54 @@
 
 /**
  * Port Power (Gain and attenuation) implementation for Oplink 1-SLOT-8D ROADM.
- *
+ * <p>
  * An Oplink ROADM port exposes OchSignal resources.
  * Optical Power can be set at port level or channel/wavelength level (attenuation).
- *
  */
 
 public class OplinkRoadmPowerConfig extends AbstractHandlerBehaviour
-                                    implements PowerConfig<Object> {
+        implements PowerConfig<Object> {
 
-    // oplink power config utility
     private OplinkPowerConfigUtil oplinkUtil = new OplinkPowerConfigUtil(this);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, Object component, long power) {
-        oplinkUtil.setTargetPower(port, component, power);
+    public void setTargetPower(PortNumber port, Object component, double power) {
+        oplinkUtil.setTargetPower(port, component, (long) power);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getTargetPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getInputPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getInputPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 }
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java
index 2946fb1..ab7b8e5 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java
@@ -25,50 +25,65 @@
 
 /**
  * Port Power implementation for Oplink protection switch device.
- *
+ * <p>
  * Intruduction:
- *                                       _____
- *             _____________________    |     | 0  VIRTUAL
- *            |                     |   |  1  |
- *   CLIENT   |                     |---|-----|--- PRIMARY
+ * _____
+ * _____________________    |     | 0  VIRTUAL
+ * |                     |   |  1  |
+ * CLIENT   |                     |---|-----|--- PRIMARY
  * -----------|         OPS         |   |     |                NETWORK
- *      3     |                     |---|-----|--- SECONDARY
- *            |_____________________|   |  2  |
- *                                      |_____|
+ * 3     |                     |---|-----|--- SECONDARY
+ * |_____________________|   |  2  |
+ * |_____|
  * Uses flow to set switch path.
  * network port = 0, client port = 3, AUTO mode.
  * network port = 1 or 2, client port = 3, MANUAL mode.
- *
  */
 
 public class OplinkSwitchPowerConfig extends AbstractHandlerBehaviour
-                                    implements PowerConfig<Object> {
+        implements PowerConfig<Object> {
 
     // oplink power config utility
     private OplinkPowerConfigUtil oplinkUtil = new OplinkPowerConfigUtil(this);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, Object component) {
-        return Optional.ofNullable(null);
+    public Optional<Double> getTargetPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, Object component, long power) {
-        return;
+    public void setTargetPower(PortNumber port, Object component, double power) {
+        oplinkUtil.setTargetPower(port, component, (long) power);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getTargetPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getInputPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getInputPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 }
diff --git a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
index 61a3727..05df59a 100644
--- a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
+++ b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
@@ -58,7 +58,7 @@
  * Set target port power or channel attenuation to an optical netconf device.
  */
 public class PolatisPowerConfig<T> extends AbstractHandlerBehaviour
-    implements PowerConfig<T> {
+        implements PowerConfig<T> {
 
     private static final String KEY_POWER = "power";
     private static final String KEY_ATTEN_LEVEL = "atten-level";
@@ -68,32 +68,48 @@
     private static final Logger log = getLogger(PolatisPowerConfig.class);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
             log.warn("Channel power is not applicable.");
             return;
         }
-        setPortTargetPower(port, power);
+        setPortTargetPower(port, (long) power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getTxPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
+        Range<Long> power = getTxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getRxPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
+        Range<Long> power = getRxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
diff --git a/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java b/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java
index 2255ba0..9ac2504 100644
--- a/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java
+++ b/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java
@@ -53,12 +53,12 @@
  * Set target port power or channel attenuation to an openflow device.
  */
 public class OpenFlowPowerConfig<T> extends AbstractHandlerBehaviour
-    implements PowerConfig<T> {
+        implements PowerConfig<T> {
 
     private static final Logger log = getLogger(OpenFlowPowerConfig.class);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         // TODO: OpenFlow does not seem to have the concept of retrieving this
         // information as only the current power is returned in the port stats
         // reply. This can be different from the configured value. Perhaps, the
@@ -68,12 +68,12 @@
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         setPortTargetPower(port, power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         // TODO: Ideally, this needs to read the port stats output for real-time
         // data or as a short-term workaround, it could get the last read value
         // from the port stats polling.
@@ -81,14 +81,14 @@
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         for (OFPortDesc pd : getPortDescs()) {
             if (pd.getPortNo().getPortNumber() == port.toLong()) {
                 for (OFPortDescProp prop : pd.getProperties()) {
                     if (prop instanceof OFPortDescPropOptical) {
                         OFPortDescPropOptical oprop = (OFPortDescPropOptical) prop;
-                        long txMin = oprop.getTxPwrMin();
-                        long txMax = oprop.getTxPwrMax();
+                        double txMin = oprop.getTxPwrMin();
+                        double txMax = oprop.getTxPwrMax();
                         return Optional.of(Range.closed(txMin, txMax));
                     }
                 }
@@ -104,7 +104,7 @@
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         log.warn("Unsupported as OpenFlow does not seem to have the concept of input (presumably rx) power range.");
         return Optional.empty();
     }
@@ -129,7 +129,7 @@
     }
 
     private OFPortMod.Builder makePortMod(OpenFlowSwitch sw, PortNumber portNumber,
-                                boolean enable) {
+                                          boolean enable) {
         OFPortMod.Builder pmb = sw.factory().buildPortMod();
         OFPort port = OFPort.of((int) portNumber.toLong());
         pmb.setPortNo(port);
@@ -151,7 +151,7 @@
         return pmb;
     }
 
-    private boolean setPortTargetPower(PortNumber port, long power) {
+    private boolean setPortTargetPower(PortNumber port, double power) {
         DeviceId deviceId = handler().data().deviceId();
         final Dpid dpid = dpid(deviceId.uri());
         OpenFlowSwitch sw = handler().get(OpenFlowController.class).getSwitch(dpid);
@@ -167,9 +167,9 @@
             }
         }
         OFPortMod.Builder pmb = makePortMod(sw, port, enable);
-        long configure = OFOpticalPortFeaturesSerializerVer14.TX_PWR_VAL;
+        double configure = OFOpticalPortFeaturesSerializerVer14.TX_PWR_VAL;
         OFPortModPropOptical.Builder property = sw.factory().buildPortModPropOptical();
-        property.setTxPwr(power);
+        property.setTxPwr((long) power);
 
         List<OFPortModProp> properties = new ArrayList<>();
         properties.add(property.build());
diff --git a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java
index 4de4a88..4a3b749 100644
--- a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java
+++ b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java
@@ -50,7 +50,7 @@
  * Set target port power or channel attenuation to an optical snmp device.
  */
 public class PolatisPowerConfig<T> extends AbstractHandlerBehaviour
-    implements PowerConfig<T> {
+        implements PowerConfig<T> {
 
     private static final int VOA_STATE_ABSOLUTE = 2;
 
@@ -64,32 +64,48 @@
     private final Logger log = getLogger(getClass());
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
             log.warn("Channel power is not applicable.");
             return;
         }
-        setPortTargetPower(port, power);
+        setPortTargetPower(port, (long) power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getTxPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
+        Range<Long> power = getTxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getRxPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
+        Range<Long> power = getRxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
@@ -158,7 +174,7 @@
         DeviceId deviceId = handler().data().deviceId();
         Long targetPower = 0L;
         try {
-          targetPower = Long.valueOf(get(handler(), VOA_LEVEL_OID + "." + port.toLong()).toInt());
+            targetPower = Long.valueOf(get(handler(), VOA_LEVEL_OID + "." + port.toLong()).toInt());
         } catch (IOException e) {
             log.error("Error reading target power for device {} exception {}", deviceId, e);
         }
@@ -175,7 +191,7 @@
         DeviceId deviceId = handler().data().deviceId();
         Long power = 0L;
         try {
-          power = Long.valueOf(get(handler(), OPM_POWER_OID + "." + port.toLong()).toInt());
+            power = Long.valueOf(get(handler(), OPM_POWER_OID + "." + port.toLong()).toInt());
         } catch (IOException e) {
             log.error("Error reading current power for device {} exception {}", deviceId, e);
         }