]> git.basschouten.com Git - openhab-addons.git/commitdiff
[freeboxos] Remove macAddress as thing configuration parameter (#17088)
authorlolodomo <lg.hc@free.fr>
Sat, 3 Aug 2024 16:26:44 +0000 (18:26 +0200)
committerGitHub <noreply@github.com>
Sat, 3 Aug 2024 16:26:44 +0000 (18:26 +0200)
For server, revolution, player, active-player, repeater and vm thing types
Replace it by a thing property.

Fix #17076

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
15 files changed:
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ApiConsumerIntf.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/FreeplugHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/HostHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/PlayerHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/RepeaterHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/ServerHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/VmHandler.java
bundles/org.openhab.binding.freeboxos/src/main/java/org/openhab/binding/freeboxos/internal/handler/WifiStationHandler.java
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/player-config.xml
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/repeater-config.xml
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/server-config.xml
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/config/vm-config.xml
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/i18n/freeboxos.properties
bundles/org.openhab.binding.freeboxos/src/main/resources/OH-INF/thing/server-thing-type.xml

index dd07a1f7dd17b14f913fe87a8cbf4c2324102a54..7e85dec9b8729045f48c08ab3acb0d44686423dd 100644 (file)
@@ -85,14 +85,12 @@ public abstract class ApiConsumerHandler extends BaseThingHandler implements Api
 
     private void initializeOnceBridgeOnline(FreeboxOsHandler bridgeHandler) {
         Map<String, String> 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()));
index 5dde8cba6a52939695caad0822808b7fd47ea56e..f291199679a71da4e566752c9f361af9c583e654 100644 (file)
@@ -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();
     }
 }
index 7755666ada466414e566b169cbe63ec0500fc5fe..6efc5485be67f920fbc62c3c1e8244877848d5ea 100644 (file)
@@ -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<String, String> 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<Channel> 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());
         }
     }
 
index e24fdc3303ed361bd007a3eef559370c7b881bbe..5b24399d6bea07e7085a7b9683d25f225fe4a9f0 100644 (file)
@@ -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());
         }
index 1ad1c6037e83c70877e4e7f5b2243ff87e0a7c2d..fc89e510a56532f9ebe623b784b13be50ca4a9b2 100644 (file)
@@ -57,9 +57,12 @@ public class PlayerHandler extends HostHandler {
 
     @Override
     void initializeProperties(Map<String, String> 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
index 0ae755337eea6a431221be98bb6c9a10c28714d7..8cb9ed5d4d586df1148504790c7157ce11ccd028 100644 (file)
@@ -53,12 +53,14 @@ public class RepeaterHandler extends HostHandler implements FreeDeviceIntf {
 
     @Override
     void initializeProperties(Map<String, String> 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
index 93e3c0b69c723d5653959f3160d005ef21dfb7fe..d3601357d4b8de72cf775bd0076dd58060109dd6 100644 (file)
@@ -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<Channel> 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
index b22355df203a2488e902d2b0a0b297252b3b7217..9a0917cadf7a287ac7f975addcf1f82701f1dc06 100644 (file)
@@ -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<String, String> 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();
index 02595ddd177765aa7e639b38d0bbc5e098d056f1..47bf88c97ee6ffca5a6260b879662bfb4a346e10 100644 (file)
@@ -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> station = getManager(APManager.class).getStation(getMac());
+        Optional<Station> 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<LanHost> wifiHost = getManager(RepeaterManager.class).getHost(getMac());
+        Optional<LanHost> wifiHost = getManager(RepeaterManager.class).getHost(mac);
         if (wifiHost.isPresent()) {
             updateChannelDateTimeState(CONNECTIVITY, LAST_SEEN, wifiHost.get().getLastSeen());
             LanAccessPoint lanAp = wifiHost.get().accessPoint();
index 77eb76882ba919afb92cbfd2b37871d221661c33..e2431fe2adc61fdc192d9afbe9686c353e33eaed 100644 (file)
@@ -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">
 
        <config-description uri="thing-type:freeboxos:player">
-               <parameter name="macAddress" type="text" required="true" pattern="([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})">
-                       <label>MAC Address</label>
-                       <description>The MAC address of the player device</description>
-               </parameter>
                <parameter name="id" type="integer">
                        <label>ID</label>
                        <description>Id of the player</description>
index b78989608cca7d66400356fbd3b954b9d0a4200a..1a153e632ecc30a5fac7eecf7cc0b7691b64ac5f 100644 (file)
                        <description>The refresh interval in seconds which is used to poll the repeater</description>
                        <default>30</default>
                </parameter>
-               <parameter name="macAddress" type="text" pattern="([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})" required="true">
-                       <label>MAC Address</label>
-                       <description>The MAC address of the network device</description>
-               </parameter>
                <parameter name="id" type="integer" required="true">
                        <label>ID</label>
                        <description>Id of the repeater</description>
index 7bdfad57d14f9c2a6335b8d52ecb4c13c563a9b7..c0f5017bf7ed6de61b83610369ac65f864b9e680 100644 (file)
                        <description>The refresh interval in seconds which is used to poll given Freebox Server</description>
                        <default>30</default>
                </parameter>
-               <parameter name="macAddress" type="text" pattern="([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})" required="true">
-                       <label>MAC Address</label>
-                       <description>The MAC address of the network device</description>
-               </parameter>
        </config-description>
 
 </config-description:config-descriptions>
index 46fad86b26af0ea849330f407f5710facd31459c..4bea38901b3e48c501fbed36dab660fe960cc766 100644 (file)
                        <description>The refresh interval in seconds which is used to poll given virtual machine</description>
                        <default>30</default>
                </parameter>
-               <parameter name="macAddress" type="text" pattern="([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})" required="true">
-                       <label>MAC Address</label>
-                       <description>The MAC address of the network device</description>
-               </parameter>
                <parameter name="id" type="integer" required="true">
                        <label>ID</label>
                        <description>Id of the Virtual Machine</description>
index 16008685fa6c741d60031dd82307369851aaad47..d46ac8119bdccbe460133534e9fd8749c89155a4 100644 (file)
@@ -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
index faafbb24b385577a11a9d1617a09f641c99ae2b2..1e5538cf3e823d9ab460f6306565d8211ebaf5d0 100644 (file)
@@ -22,6 +22,8 @@
                        <channel-group typeId="connection-status" id="connection-status"/>
                </channel-groups>
 
+               <representation-property>macAddress</representation-property>
+
                <config-description-ref uri="thing-type:freeboxos:server"/>
        </thing-type>
 
@@ -42,6 +44,8 @@
                        <channel-group typeId="connection-status" id="connection-status"/>
                </channel-groups>
 
+               <representation-property>macAddress</representation-property>
+
                <config-description-ref uri="thing-type:freeboxos:server"/>
        </thing-type>