diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerHandler.java index dd07a1f7dd1..7e85dec9b87 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerHandler.java @@ -85,14 +85,12 @@ public abstract class ApiConsumerHandler extends BaseThingHandler implements Api private void initializeOnceBridgeOnline(FreeboxOsHandler bridgeHandler) { Map properties = editProperties(); - if (properties.isEmpty()) { - try { - initializeProperties(properties); - checkAirMediaCapabilities(properties); - updateProperties(properties); - } catch (FreeboxException e) { - logger.warn("Error getting thing {} properties: {}", thing.getUID(), e.getMessage()); - } + try { + initializeProperties(properties); + checkAirMediaCapabilities(properties); + updateProperties(properties); + } catch (FreeboxException e) { + logger.warn("Error getting thing {} properties: {}", thing.getUID(), e.getMessage()); } boolean isAudioReceiver = Boolean.parseBoolean(properties.get(MediaType.AUDIO.name())); diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerIntf.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerIntf.java index 5dde8cba6a5..f291199679a 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerIntf.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerIntf.java @@ -55,8 +55,11 @@ public interface ApiConsumerIntf extends ThingHandler { return ((BigDecimal) getConfig().get(ClientConfiguration.ID)).intValue(); } - default MACAddress getMac() { + default @Nullable MACAddress getMac() { String mac = (String) getConfig().get(Thing.PROPERTY_MAC_ADDRESS); - return new MACAddressString(mac).getAddress(); + if (mac == null) { + mac = editProperties().get(Thing.PROPERTY_MAC_ADDRESS); + } + return mac == null ? null : new MACAddressString(mac).getAddress(); } } diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/FreeplugHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/FreeplugHandler.java index 7755666ada4..6efc5485be6 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/FreeplugHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/FreeplugHandler.java @@ -33,6 +33,8 @@ import org.openhab.core.thing.binding.ThingHandlerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import inet.ipaddr.mac.MACAddress; + /** * The {@link FreeplugHandler} is responsible for handling everything associated to a * powerline gateway managed by the freebox server @@ -49,7 +51,13 @@ public class FreeplugHandler extends ApiConsumerHandler { @Override void initializeProperties(Map properties) throws FreeboxException { - getManager(FreeplugManager.class).getPlug(getMac()).ifPresent(plug -> { + MACAddress mac = getMac(); + if (mac == null) { + throw new FreeboxException( + "initializeProperties is not possible because MAC address is undefined for the thing " + + thing.getUID()); + } + getManager(FreeplugManager.class).getPlug(mac).ifPresent(plug -> { properties.put(Thing.PROPERTY_MODEL_ID, plug.model()); properties.put(ROLE, plug.netRole().name()); properties.put(NET_ID, plug.netId()); @@ -59,15 +67,23 @@ public class FreeplugHandler extends ApiConsumerHandler { if (plug.local()) { // Plug connected to the freebox does not provide rate up or down List channels = new ArrayList<>(getThing().getChannels()); + int nbInit = channels.size(); channels.removeIf(channel -> channel.getUID().getId().contains(RATE)); - updateThing(editThing().withChannels(channels).build()); + if (nbInit != channels.size()) { + updateThing(editThing().withChannels(channels).build()); + } } }); } @Override protected void internalPoll() throws FreeboxException { - getManager(FreeplugManager.class).getPlug(getMac()).ifPresent(plug -> { + MACAddress mac = getMac(); + if (mac == null) { + throw new FreeboxException( + "internalPoll is not possible because MAC address is undefined for the thing " + thing.getUID()); + } + getManager(FreeplugManager.class).getPlug(mac).ifPresent(plug -> { updateChannelDateTimeState(LAST_SEEN, ZonedDateTime.now().minusSeconds(plug.inactive())); updateChannelString(LINE_STATUS, plug.ethPortStatus()); @@ -84,11 +100,17 @@ public class FreeplugHandler extends ApiConsumerHandler { } public void reset() { + MACAddress mac = getMac(); + if (mac == null) { + logger.warn("Freeplug restart is not possible because MAC address is undefined for the thing {}", + thing.getUID()); + return; + } try { - getManager(FreeplugManager.class).reboot(getMac()); - logger.debug("Freeplug {} succesfully restarted", getMac()); + getManager(FreeplugManager.class).reboot(mac); + logger.debug("Freeplug {} succesfully restarted", mac); } catch (FreeboxException e) { - logger.warn("Error restarting freeplug {}: {}", getMac(), e.getMessage()); + logger.warn("Error restarting freeplug {}: {}", mac, e.getMessage()); } } diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/HostHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/HostHandler.java index e24fdc3303e..5b24399d6be 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/HostHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/HostHandler.java @@ -32,6 +32,8 @@ import org.openhab.core.thing.binding.ThingHandlerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import inet.ipaddr.mac.MACAddress; + /** * The {@link HostHandler} is responsible for all network equipments hosted on the network * @@ -63,9 +65,10 @@ public class HostHandler extends ApiConsumerHandler { } protected void cancelPushSubscription() { - if (pushSubscribed) { + MACAddress mac = getMac(); + if (pushSubscribed && mac != null) { try { - getManager(WebSocketManager.class).unregisterListener(getMac()); + getManager(WebSocketManager.class).unregisterListener(mac); } catch (FreeboxException e) { logger.warn("Error unregistering host from the websocket: {}", e.getMessage()); } @@ -92,7 +95,12 @@ public class HostHandler extends ApiConsumerHandler { } protected LanHost getLanHost() throws FreeboxException { - return getManager(LanBrowserManager.class).getHost(getMac()).map(hostIntf -> hostIntf.host()) + MACAddress mac = getMac(); + if (mac == null) { + throw new FreeboxException( + "getLanHost is not possible because MAC address is undefined for the thing " + thing.getUID()); + } + return getManager(LanBrowserManager.class).getHost(mac).map(hostIntf -> hostIntf.host()) .orElseThrow(() -> new FreeboxException("Host data not found")); } @@ -104,9 +112,14 @@ public class HostHandler extends ApiConsumerHandler { } public void wol() { + MACAddress mac = getMac(); + if (mac == null) { + logger.warn("Waking up host is not possible because MAC address is undefined for the thing {}", + thing.getUID()); + return; + } try { - getManager(LanBrowserManager.class).wakeOnLan(getMac(), - getConfigAs(ApiConsumerConfiguration.class).password); + getManager(LanBrowserManager.class).wakeOnLan(mac, getConfigAs(ApiConsumerConfiguration.class).password); } catch (FreeboxException e) { logger.warn("Error waking up host: {}", e.getMessage()); } diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/PlayerHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/PlayerHandler.java index 1ad1c6037e8..fc89e510a56 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/PlayerHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/PlayerHandler.java @@ -57,9 +57,12 @@ public class PlayerHandler extends HostHandler { @Override void initializeProperties(Map properties) throws FreeboxException { - super.initializeProperties(properties); + // We need to get and set the MAC address before calling super.initializeProperties Player player = getManager(PlayerManager.class).getDevice(getClientId()); + properties.put(Thing.PROPERTY_MAC_ADDRESS, player.mac().toColonDelimitedString()); properties.put(Thing.PROPERTY_MODEL_ID, player.deviceModel().name()); + updateProperties(properties); + super.initializeProperties(properties); } @Override diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/RepeaterHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/RepeaterHandler.java index 0ae755337ee..8cb9ed5d4d5 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/RepeaterHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/RepeaterHandler.java @@ -53,12 +53,14 @@ public class RepeaterHandler extends HostHandler implements FreeDeviceIntf { @Override void initializeProperties(Map properties) throws FreeboxException { - super.initializeProperties(properties); - + // We need to get and set the MAC address before calling super.initializeProperties Repeater repeater = getManager(RepeaterManager.class).getDevice(getClientId()); + properties.put(Thing.PROPERTY_MAC_ADDRESS, repeater.mainMac().toColonDelimitedString()); properties.put(Thing.PROPERTY_SERIAL_NUMBER, repeater.sn()); properties.put(Thing.PROPERTY_FIRMWARE_VERSION, repeater.firmwareVersion()); properties.put(Thing.PROPERTY_MODEL_ID, repeater.model().name()); + updateProperties(properties); + super.initializeProperties(properties); } @Override diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ServerHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ServerHandler.java index 93e3c0b69c7..d3601357d4b 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ServerHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ServerHandler.java @@ -79,22 +79,30 @@ public class ServerHandler extends ApiConsumerHandler implements FreeDeviceIntf properties.put(Thing.PROPERTY_SERIAL_NUMBER, config.serial()); properties.put(Thing.PROPERTY_FIRMWARE_VERSION, config.firmwareVersion()); properties.put(Thing.PROPERTY_HARDWARE_VERSION, config.modelInfo().prettyName()); + properties.put(Thing.PROPERTY_MAC_ADDRESS, config.mac().toColonDelimitedString()); properties.put(Source.UPNP.name(), lanConfig.name()); List channels = new ArrayList<>(getThing().getChannels()); + int nbInit = channels.size(); config.sensors().forEach(sensor -> { ChannelUID sensorId = new ChannelUID(thing.getUID(), GROUP_SENSORS, sensor.id()); - channels.add( - ChannelBuilder.create(sensorId).withLabel(sensor.name()).withAcceptedItemType("Number:Temperature") - .withType(new ChannelTypeUID(BINDING_ID + ":temperature")).build()); + if (getThing().getChannel(sensorId) == null) { + channels.add(ChannelBuilder.create(sensorId).withLabel(sensor.name()) + .withAcceptedItemType("Number:Temperature") + .withType(new ChannelTypeUID(BINDING_ID + ":temperature")).build()); + } }); config.fans().forEach(sensor -> { ChannelUID sensorId = new ChannelUID(thing.getUID(), GROUP_FANS, sensor.id()); - channels.add(ChannelBuilder.create(sensorId).withLabel(sensor.name()) - .withAcceptedItemType(CoreItemFactory.NUMBER).withType(new ChannelTypeUID(BINDING_ID + ":fanspeed")) - .build()); + if (getThing().getChannel(sensorId) == null) { + channels.add(ChannelBuilder.create(sensorId).withLabel(sensor.name()) + .withAcceptedItemType(CoreItemFactory.NUMBER) + .withType(new ChannelTypeUID(BINDING_ID + ":fanspeed")).build()); + } }); - updateThing(editThing().withChannels(channels).build()); + if (nbInit != channels.size()) { + updateThing(editThing().withChannels(channels).build()); + } } @Override diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/VmHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/VmHandler.java index b22355df203..9a0917cadf7 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/VmHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/VmHandler.java @@ -14,6 +14,8 @@ package org.openhab.binding.freeboxos.internal.handler; import static org.openhab.binding.freeboxos.internal.FreeboxOsBindingConstants.*; +import java.util.Map; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.binding.freeboxos.internal.api.FreeboxException; import org.openhab.binding.freeboxos.internal.api.rest.VmManager; @@ -40,6 +42,15 @@ public class VmHandler extends HostHandler { super(thing); } + @Override + void initializeProperties(Map properties) throws FreeboxException { + // We need to get and set the MAC address before calling super.initializeProperties + VirtualMachine vm = getManager(VmManager.class).getDevice(getClientId()); + properties.put(Thing.PROPERTY_MAC_ADDRESS, vm.mac().toColonDelimitedString()); + updateProperties(properties); + super.initializeProperties(properties); + } + @Override protected void internalPoll() throws FreeboxException { super.internalPoll(); diff --git a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/WifiStationHandler.java b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/WifiStationHandler.java index 02595ddd177..47bf88c97ee 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/WifiStationHandler.java +++ b/bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/WifiStationHandler.java @@ -36,6 +36,8 @@ import org.openhab.core.types.UnDefType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import inet.ipaddr.mac.MACAddress; + /** * The {@link WifiStationHandler} is responsible for handling everything associated to * any Freebox thing types except the bridge thing type. @@ -56,8 +58,14 @@ public class WifiStationHandler extends HostHandler { protected void internalPoll() throws FreeboxException { super.internalPoll(); + MACAddress mac = getMac(); + if (mac == null) { + throw new FreeboxException( + "internalPoll is not possible because MAC address is undefined for the thing " + thing.getUID()); + } + // Search if the wifi-host is hosted on server access-points - Optional station = getManager(APManager.class).getStation(getMac()); + Optional station = getManager(APManager.class).getStation(mac); if (station.isPresent()) { Station data = station.get(); updateChannelDateTimeState(CONNECTIVITY, LAST_SEEN, data.getLastSeen()); @@ -67,7 +75,7 @@ public class WifiStationHandler extends HostHandler { } // Search if it is hosted by a repeater - Optional wifiHost = getManager(RepeaterManager.class).getHost(getMac()); + Optional wifiHost = getManager(RepeaterManager.class).getHost(mac); if (wifiHost.isPresent()) { updateChannelDateTimeState(CONNECTIVITY, LAST_SEEN, wifiHost.get().getLastSeen()); LanAccessPoint lanAp = wifiHost.get().accessPoint(); diff --git a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/player-config.xml b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/player-config.xml index 77eb76882ba..e2431fe2adc 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/player-config.xml +++ b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/player-config.xml @@ -5,10 +5,6 @@ xsi:schemaLocation="https://openhab.org/schemas/config-description/v1.0.0 https://openhab.org/schemas/config-description-1.0.0.xsd"> - - - The MAC address of the player device - Id of the player diff --git a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/repeater-config.xml b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/repeater-config.xml index b78989608cc..1a153e632ec 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/repeater-config.xml +++ b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/repeater-config.xml @@ -11,10 +11,6 @@ The refresh interval in seconds which is used to poll the repeater 30 - - - The MAC address of the network device - Id of the repeater diff --git a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/server-config.xml b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/server-config.xml index 7bdfad57d14..c0f5017bf7e 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/server-config.xml +++ b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/server-config.xml @@ -11,10 +11,6 @@ The refresh interval in seconds which is used to poll given Freebox Server 30 - - - The MAC address of the network device - diff --git a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/vm-config.xml b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/vm-config.xml index 46fad86b26a..4bea38901b3 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/vm-config.xml +++ b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/vm-config.xml @@ -11,10 +11,6 @@ The refresh interval in seconds which is used to poll given virtual machine 30 - - - The MAC address of the network device - Id of the Virtual Machine diff --git a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/i18n/freeboxos.properties b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/i18n/freeboxos.properties index 16008685fa6..d46ac8119bd 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/i18n/freeboxos.properties +++ b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/i18n/freeboxos.properties @@ -93,8 +93,6 @@ thing-type.config.freeboxos.player.acceptAllMp3.label = Accept All MP3 thing-type.config.freeboxos.player.acceptAllMp3.description = Accept any bitrate for MP3 audio or only bitrates greater than 64 kbps thing-type.config.freeboxos.player.id.label = ID thing-type.config.freeboxos.player.id.description = Id of the player -thing-type.config.freeboxos.player.macAddress.label = MAC Address -thing-type.config.freeboxos.player.macAddress.description = The MAC address of the player device thing-type.config.freeboxos.player.password.label = Password thing-type.config.freeboxos.player.password.description = AirPlay password thing-type.config.freeboxos.player.port.label = Player port @@ -104,18 +102,12 @@ thing-type.config.freeboxos.player.remoteCode.label = Remote Code thing-type.config.freeboxos.player.remoteCode.description = Code associated to remote control thing-type.config.freeboxos.repeater.id.label = ID thing-type.config.freeboxos.repeater.id.description = Id of the repeater -thing-type.config.freeboxos.repeater.macAddress.label = MAC Address -thing-type.config.freeboxos.repeater.macAddress.description = The MAC address of the network device thing-type.config.freeboxos.repeater.refreshInterval.label = Refresh Interval thing-type.config.freeboxos.repeater.refreshInterval.description = The refresh interval in seconds which is used to poll the repeater -thing-type.config.freeboxos.server.macAddress.label = MAC Address -thing-type.config.freeboxos.server.macAddress.description = The MAC address of the network device thing-type.config.freeboxos.server.refreshInterval.label = Refresh Interval thing-type.config.freeboxos.server.refreshInterval.description = The refresh interval in seconds which is used to poll given Freebox Server thing-type.config.freeboxos.vm.id.label = ID thing-type.config.freeboxos.vm.id.description = Id of the Virtual Machine -thing-type.config.freeboxos.vm.macAddress.label = MAC Address -thing-type.config.freeboxos.vm.macAddress.description = The MAC address of the network device thing-type.config.freeboxos.vm.refreshInterval.label = Refresh Interval thing-type.config.freeboxos.vm.refreshInterval.description = The refresh interval in seconds which is used to poll given virtual machine thing-type.config.freeboxos.wifi-host.mDNS.label = mDNS Name diff --git a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/thing/server-thing-type.xml b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/thing/server-thing-type.xml index faafbb24b38..1e5538cf3e8 100644 --- a/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/thing/server-thing-type.xml +++ b/bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/thing/server-thing-type.xml @@ -22,6 +22,8 @@ + macAddress + @@ -42,6 +44,8 @@ + macAddress +