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()));
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();
}
}
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
@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());
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());
}
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());
}
}
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
*
}
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());
}
}
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"));
}
}
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());
}
@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
@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
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
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;
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();
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.
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());
}
// 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();
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>
<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>
<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>
<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>
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
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
<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>
<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>