diff --git a/.project b/.project new file mode 100644 index 0000000000000..5025ea24805b7 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + org.openhab.addons.reactor + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterBindingConstants.java b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterBindingConstants.java index 937b86e9ef864..ff72e197a33cc 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterBindingConstants.java +++ b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterBindingConstants.java @@ -28,5 +28,4 @@ public class IammeterBindingConstants { // List of all Thing Type UIDs public static final ThingTypeUID THING_TYPE_POWERMETER = new ThingTypeUID(BINDING_ID, "powermeter"); - } diff --git a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterConfiguration.java b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterConfiguration.java index 39f2c72efa613..3bbfd3e646b5e 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterConfiguration.java +++ b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterConfiguration.java @@ -12,14 +12,17 @@ */ package org.openhab.binding.iammeter.internal; +import org.eclipse.jdt.annotation.NonNullByDefault; + /** * The {@link IammeterConfiguration} class contains fields mapping thing configuration parameters. * - * @author yang bo - Initial contribution + * @author Yang Bo - Initial contribution */ +@NonNullByDefault public class IammeterConfiguration { - public String host; - public int port; - public int refreshInterval; + public String host = "127.0.0.1"; + public int port = 80; + public int refreshInterval = 30; } diff --git a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterHandler.java b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterHandler.java index 50913e84fdff6..8527c7a8151c0 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterHandler.java +++ b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterHandler.java @@ -15,14 +15,16 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.smarthome.core.library.types.DecimalType; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.smarthome.core.library.types.QuantityType; +import org.eclipse.smarthome.core.library.unit.SmartHomeUnits; import org.eclipse.smarthome.core.thing.Channel; import org.eclipse.smarthome.core.thing.ChannelUID; import org.eclipse.smarthome.core.thing.Thing; @@ -49,13 +51,17 @@ * * @author yang bo - Initial contribution */ + @NonNullByDefault public class IammeterHandler extends BaseThingHandler { private final Logger logger = LoggerFactory.getLogger(IammeterHandler.class); + private @Nullable ScheduledFuture refreshJob; + private IammeterConfiguration config; public IammeterHandler(Thing thing) { super(thing); + config = getConfiguration(); } private final int timeout = 5000; @@ -63,10 +69,10 @@ public IammeterHandler(Thing thing) { @Override public void handleCommand(ChannelUID channelUID, Command command) { if (command instanceof RefreshType) { - try{ + try { refresh(); - } catch (Exception ex) { - logger.warn("refresh error {}" , ex.getMessage()); + } catch (IOException | JsonSyntaxException ex) { + logger.warn("refresh error {}", ex.getMessage()); } } } @@ -75,33 +81,28 @@ public void handleCommand(ChannelUID channelUID, Command command) { @Override public void initialize() { - IammeterConfiguration config = getConfiguration(); - - Runnable runnable = new Runnable() { - @Override - public void run() { - try{ - refresh(); - } catch (Exception ex) { - logger.warn("refresh error {}" , ex.getMessage()); + ScheduledFuture refreshJob = this.refreshJob; + IammeterConfiguration config = this.config; + config = getConfiguration(); + if (refreshJob == null || refreshJob.isCancelled()) { + Runnable runnable = new Runnable() { + @Override + public void run() { + try { + refresh(); + } catch (IOException | JsonSyntaxException ex) { + logger.warn("refresh error {}", ex.getMessage()); + } } - } - }; - scheduler.scheduleWithFixedDelay(runnable, 0, config.refreshInterval, TimeUnit.SECONDS); - - updateStatus(ThingStatus.UNKNOWN); - scheduler.execute(() -> { - try{ - refresh(); - } catch (Exception ex) { - logger.warn("refresh error {}" , ex.getMessage()); - } - }); + }; + refreshJob = scheduler.scheduleWithFixedDelay(runnable, 0, config.refreshInterval, TimeUnit.SECONDS); + updateStatus(ThingStatus.UNKNOWN); + } } - private void refresh() throws Exception { + private void refresh() throws IOException, JsonSyntaxException { + IammeterConfiguration config = this.config; try { - IammeterConfiguration config = getConfiguration(); logger.trace("Starting refresh handler"); String httpMethod = "GET"; String url = "http://admin:admin@" + config.host + ":" + config.port + "/monitorjson"; @@ -121,7 +122,7 @@ private void refresh() throws Exception { } for (IammeterWEM3080Channel channelConfig : IammeterWEM3080Channel.values()) { Channel channel = getThing().getChannel(channelConfig.getId()); - if (channel != null){ + if (channel != null) { channelProfix = IammeterBindingConstants.THING_TYPE_POWERMETER + ":" + channel.getUID().getThingUID().getId(); State state = getDecimal( @@ -133,7 +134,7 @@ private void refresh() throws Exception { keyWord = "Datas"; for (IammeterWEM3080TChannel channelConfig : IammeterWEM3080TChannel.values()) { Channel channel = getThing().getChannel(channelConfig.getId()); - if (channel != null){ + if (channel != null) { State state = getDecimal(iammeterData.get(keyWord).getAsJsonArray().get(channelConfig.getRow()) .getAsJsonArray().get(channelConfig.getCol()).toString()); updateState(channel.getUID(), state); @@ -145,15 +146,14 @@ private void refresh() throws Exception { thingStructureChanged(channelProfix); } } + stream.close(); updateStatus(ThingStatus.ONLINE); - // Very rudimentary Exception differentiation + // Very rudimentary Exception differentiation } catch (IOException e) { updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "Communication error with the device: " + e.getMessage()); } catch (JsonSyntaxException je) { logger.warn("Invalid JSON when refreshing source {}: {}", getThing().getUID(), je.getMessage()); - } catch (Exception e) { - logger.warn("Error refreshing source {}: {}", getThing().getUID(), e.getMessage(), e); } } @@ -185,7 +185,7 @@ protected void thingStructureChanged(String channelProfix) { private State getDecimal(String value) { try { - return new DecimalType(new BigDecimal(value)); + return QuantityType.valueOf(Float.parseFloat(value), SmartHomeUnits.VOLT); } catch (NumberFormatException e) { return UnDefType.UNDEF; } @@ -193,11 +193,16 @@ private State getDecimal(String value) { @Override public void dispose() { + ScheduledFuture refreshJob = this.refreshJob; + if (refreshJob != null && !refreshJob.isCancelled()) { + refreshJob.cancel(true); + refreshJob = null; + } super.dispose(); } - + + @NonNullByDefault public IammeterConfiguration getConfiguration() { return this.getConfigAs(IammeterConfiguration.class); } - } diff --git a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080Channel.java b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080Channel.java index e8fb946d99576..14df844626990 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080Channel.java +++ b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080Channel.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.iammeter.internal; +import javax.measure.Unit; + /** * The {@link IammeterWEM3080Channel} Enum defines common constants, which are * used across the whole binding. @@ -28,10 +30,12 @@ public enum IammeterWEM3080Channel { private final String id; private final int index; + private final Unit unit; IammeterWEM3080Channel(String id, int index) { this.id = id; this.index = index; + this.unit = null; } public String getId() { @@ -41,4 +45,8 @@ public String getId() { public int getIndex() { return index; } + + public Unit getUnit() { + return unit; + } } diff --git a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080TChannel.java b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080TChannel.java index dd68e1e198094..2500c2e7982dd 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080TChannel.java +++ b/bundles/org.openhab.binding.iammeter/src/main/java/org/openhab/binding/iammeter/internal/IammeterWEM3080TChannel.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.iammeter.internal; +import javax.measure.Unit; + /** * The {@link IammeterWEM3080TChannel} Enum defines common constants, which are * used across the whole binding. @@ -45,11 +47,13 @@ public enum IammeterWEM3080TChannel { private final String id; private final int row; private final int col; + private final Unit unit; IammeterWEM3080TChannel(String id, int r, int c) { this.id = id; this.row = r; this.col = c; + this.unit = null; } public String getId() { @@ -63,4 +67,8 @@ public int getRow() { public int getCol() { return col; } + + public Unit getUnit() { + return unit; + } } diff --git a/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/binding/binding.xml b/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/binding/binding.xml index 01c5c2d52c390..05e1d392b0743 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/binding/binding.xml +++ b/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/binding/binding.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="https://openhab.org/schemas/binding/v1.0.0 https://openhab.org/schemas/binding-1.0.0.xsd"> Iammeter Binding - This is the binding for Iammeter. - yang bo + The Iammeter binding pull your Iammeter power meter data from LAN. + Yang Bo diff --git a/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/i18n/iammeter_xx_XX.properties b/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/i18n/iammeter_xx_XX.properties deleted file mode 100644 index 6b152e1fd7d22..0000000000000 --- a/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/i18n/iammeter_xx_XX.properties +++ /dev/null @@ -1,15 +0,0 @@ -# binding -binding.iammeter.name = -binding.iammeter.description = - -# thing types -thing-type.iammeter.powermeter.label = -thing-type.iammeter.powermeter.description = - -# thing type config description -thing-type.config.iammeter.powermeter.voltage_a.label = -thing-type.config.iammeter.powermeter.voltage_a.description = - -# channel types -channel-type.iammeter.voltage_a.label = -channel-type.iammeter.voltage_a.description = diff --git a/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/thing/thing-types.xml index 4459afbfe6a73..cafd259748766 100644 --- a/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/thing/thing-types.xml +++ b/bundles/org.openhab.binding.iammeter/src/main/resources/ESH-INF/thing/thing-types.xml @@ -3,33 +3,31 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0" xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> - PowerMeter thing for Iammeter Binding - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -44,8 +42,8 @@ Port 80 - - + + 60 @@ -53,19 +51,19 @@ - Number:V + Number:ElectricPotential voltage for phase A - Number:A + Number:ElectricCurrent current for phase A - Number:W + Number:Power power for phase A @@ -95,19 +93,19 @@ - Number:V + Number:ElectricPotential voltage for phase B - Number:A + Number:ElectricCurrent current for phase B - Number:W + Number:Power power for phase B @@ -137,19 +135,19 @@ - Number:V + Number:ElectricPotential voltage for phase C - Number:A + Number:ElectricCurrent current for phase C - Number:W + Number:Power power for phase C