[freeboxos] Remove macAddress as thing configuration parameter (#17088)

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>
This commit is contained in:
lolodomo 2024-08-03 18:26:44 +02:00 committed by GitHub
parent 8c29b5973e
commit 149992859e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 105 additions and 57 deletions

View 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()));

View 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();
}
}

View 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());
}
}

View 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());
}

View 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

View 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

View 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

View 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();

View 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();

View 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>

View File

@ -11,10 +11,6 @@
<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>

View File

@ -11,10 +11,6 @@
<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>

View File

@ -11,10 +11,6 @@
<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>

View 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

View 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>