Skip to content

Commit

Permalink
[freeboxos] Remove macAddress as thing configuration parameter (#17088)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
lolodomo authored Aug 3, 2024
1 parent 8c29b59 commit 1499928
Show file tree
Hide file tree
Showing 15 changed files with 105 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,12 @@ public void initialize() {

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()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,11 @@ default int getClientId() {
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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
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
Expand All @@ -49,7 +51,13 @@ public FreeplugHandler(Thing thing) {

@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());
Expand All @@ -59,15 +67,23 @@ void initializeProperties(Map<String, String> properties) throws FreeboxExceptio

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());
Expand All @@ -84,11 +100,17 @@ private void updateRateChannel(String channel, int rate) {
}

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
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
*
Expand Down Expand Up @@ -63,9 +65,10 @@ public void dispose() {
}

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());
}
Expand All @@ -92,7 +95,12 @@ protected void internalForcePoll() throws FreeboxException {
}

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"));
}

Expand All @@ -104,9 +112,14 @@ public void updateConnectivityChannels(LanHost host) {
}

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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,12 @@ public PlayerHandler(Thing thing) {

@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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,14 @@ public RepeaterHandler(Thing thing) {

@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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,22 +79,30 @@ void initializeProperties(Map<String, String> properties) throws FreeboxExceptio
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

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;
Expand All @@ -40,6 +42,15 @@ public VmHandler(Thing thing) {
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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
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.
Expand All @@ -56,8 +58,14 @@ public WifiStationHandler(Thing thing) {
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());
Expand All @@ -67,7 +75,7 @@ protected void internalPoll() throws FreeboxException {
}

// 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand All @@ -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>

Expand Down

0 comments on commit 1499928

Please sign in to comment.