diff --git a/bundles/org.openhab.binding.heos/.classpath b/bundles/org.openhab.binding.heos/.classpath index 040c0a3315d44..39abf1c5e9102 100644 --- a/bundles/org.openhab.binding.heos/.classpath +++ b/bundles/org.openhab.binding.heos/.classpath @@ -1,7 +1,49 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/org.openhab.binding.heos/.project b/bundles/org.openhab.binding.heos/.project index 18a764e115069..320367b85ec22 100644 --- a/bundles/org.openhab.binding.heos/.project +++ b/bundles/org.openhab.binding.heos/.project @@ -11,23 +11,13 @@ - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.pde.ds.core.builder + org.eclipse.m2e.core.maven2Builder - org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature diff --git a/bundles/org.openhab.binding.heos/README.md b/bundles/org.openhab.binding.heos/README.md index 75ad08c73c863..882ea8b57fb8c 100644 --- a/bundles/org.openhab.binding.heos/README.md +++ b/bundles/org.openhab.binding.heos/README.md @@ -1,7 +1,8 @@ # Denon HEOS Binding -This binding support the HEOS-System from Denon. The binding provides control of the players and groups within the network. -It also supports selecting favorites and play them on players or groups within the HEOS-Network. +This binding support the HEOS-System from Denon. +The binding provides control of the players and groups within the network. +It also supports selecting favorites and play them on players or groups within the HEOS-Network. The binding first establishes a connection to one of the players of the HEOS-Network and use them as a bridge. After a connection is established, the binding searches for all available players and groups via the bridge. To keep the network traffic low it is recommended to establish only one connection via one bridge. @@ -11,7 +12,7 @@ Connection to the bridge is done via a Telnet connection. Bridge: The binding supports a bridge to connect to the HEOS-Network. -A bridge uses the thing ID "bridge" +A bridge uses the thing ID "bridge". Player: @@ -29,13 +30,13 @@ A group uses the thing ID "group" This binding supports full automatic discovery of available players to be used as a bridge, players and groups (both after establishing a connection via a bridge). Please note that only one bridge is required to establish a connection. Adding a second bridge can cause trouble with the connection. -It is recommended to use the PaperUI or other GUI to setup the system and add all players and groups. +It is recommended to use the Paper UI or other GUI to setup the system and add all players and groups. The bridge is discovered through UPnP in the local network. Once it is added the players and groups are discovered via the bridge and placed within the inbox. ## Binding Configuration -This binding does not require any configuration. +This binding does not require any configuration. ## Thing Configuration @@ -43,18 +44,19 @@ This binding does not require any configuration. The bridge has the following configuration parameter -| Parameter | Description | Required | -|----------------- |----------------------------------------------------------- | --------- | -| ipAddress | The network address of the bridge | yes | -| username | The user name to login to the HEOS account | no | -| password | The password for the HEOS account | no | -| heartbeat | The time in seconds for the HEOS Heartbeat (default = 60s) | no | +| Parameter | Description | Required | +|----------------- |------------------------------------------------------------ | --------- | +| ipAddress | The network address of the bridge | yes | +| username | The user name to login to the HEOS account | no | +| password | The password for the HEOS account | no | +| heartbeat | The time in seconds for the HEOS Heartbeat (default = 60 s) | no | -The password and the user name are used to login to the HEOS account. This is required to load the favorites, playlists and so on from personal settings. -If no login information is provided these features can't be used. +The password and the user name are used to login to the HEOS account. +This is required to load the favorites, playlists and so on from personal settings. +If no login information is provided these features can't be used. ```` -Bridge heos:bridge:main "name" [ipAddress="192.168.0.1", unsername="xxx", password="123456"] +Bridge heos:bridge:main "name" [ipAddress="192.168.0.1", unsername="xxx", password="123456"] ```` ### Player Configuration @@ -68,14 +70,14 @@ Player have the following configuration parameter For manual configuration a player can be defined as followed: ```` -Thing heos:player:pid "name" [pid="123456789"] +Thing heos:player:player1 "name" [pid="123456789"] ```` -PID behind the heos:player:--- should be changed as required. Every name or value can be used. +PID behind the heos:player:--- should be changed as required. It is recommended to use the player PID. -If the PID isn't known it can be discovered by establishing a TelNet connection (port 1255) to one player and search for available players (Command: heos://player/get_players) within the network. -An other way is to use PaperUI to discover the player via the bridge and get the PID. -For further details refer to the [HEOS CLI](http://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf) specification. +If the PID isn't known it can be discovered by establishing a Telnet connection (port 1255) to one player and search for available players (Command: heos://player/get_players) within the network. +Another way is to use Paper UI to discover the player via the bridge and get the PID. +For further details refer to the [HEOS CLI](https://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf) specification. ### Group Configuration @@ -87,12 +89,13 @@ Player have the following configuration parameter ``` -Thing heos:group:memberHash "name" [members="45345634;35534567"] +Thing heos:group:group1 "name" [members="45345634;35534567"] ``` ### Defining Bridge and Players together -Defining Player and Bridge together. To ensure that the players and groups are attached to the bridge the definition can be like: +Defining Player and Bridge together. +To ensure that the players and groups are attached to the bridge the definition can be like: ``` Bridge heos:bridge:main "Bridge" [ipAddress="192.168.0.1", username="userName", password="123456"] { @@ -188,7 +191,7 @@ Player LivingRoom_Control "Control" {channel="heos:player:main:LivingRoom:Contro | tvaudio | | phono | -An current list can be found within the HEOS CLI protocol which can be found [here](http://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf). +An current list can be found within the HEOS CLI protocol which can be found [here](https://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf). ### Channels of Thing type 'bridge' @@ -199,7 +202,7 @@ An current list can be found within the HEOS CLI protocol which can be found [he -For a list of the commands please refer to the [HEOS CLI protocol](http://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf). +For a list of the commands please refer to the [HEOS CLI protocol](https://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf). ## *Dynamic Channels* @@ -215,7 +218,7 @@ The player and group channels are only shown on the bridge. | Channel ID | Item Type | Description | |------------ |----------- |------------------------------------------------------------------------------------------------------- | | {mid} | Switch | A channel which represents the favorite. Please check via UI how the correct Channel Type looks like. | - + Example ``` @@ -231,7 +234,7 @@ The player and group channels are only shown on the bridge. Example ``` - Switch Player_1 "Player [%s]" {channel="heos:bridge:main:P123456789"} + Switch Player_1 "Player [%s]" {channel="heos:bridge:main:P123456789"} ``` The {playerUID} has either a P in front of the number which indicates that this is a player or a G to indicate this is a group. @@ -289,7 +292,7 @@ If you want to change that for the whole group you have to do it via the group t ### Inputs To play inputs like the Aux_In it can be played at each player or group. -It is also possible to play an input from an other player at the selected player. +It is also possible to play an input from another player at the selected player. To do so, first select the player channel of the player where the input is located (source) at the bridge. Then use the input channel of the player where the source shall be played (destination) to activate the input. @@ -303,7 +306,7 @@ Items: ``` Switch HeosBridge_Play_Living "Living Room" (gHeos) {channel="heos:bridge:ed0ac1ff-0193-65c6-c1b8-506137456a50:P918797451"} String HeosKitchen_Input (gHeos) {channel="heos:player:918797451:Inputs"} -String HeosKitchen_InputSelect "Input" (gHeos) +String HeosKitchen_InputSelect "Input" (gHeos) ``` Rule for kitchen: @@ -315,7 +318,7 @@ rule "Play AuxIn from Living Room" then if (receivedCommand.toString == "aux_in_1") { sendCommand(HeosKitchen_Input, "aux_in_1") - + } if (receivedCommand.toString == "LivingRoom") { sendCommand(HeosBridge_Play_Living, ON) sendCommand(HeosKitchen_Input, "aux_in_1") @@ -350,13 +353,13 @@ Then we need a rule which triggers the state if an Item goes Online or Offline. Rules: ``` -rule "Online State Heos Group" +rule "Online State Heos Group" when - Thing "heos:group:1747557118" changed + Thing "heos:group:1747557118" changed then var thingStatus = getThingStatusInfo("heos:group:1747557118") - sendCommand(HeosGroup_Status, thingStatus.getStatus.toString) + sendCommand(HeosGroup_Status, thingStatus.getStatus.toString) end ``` @@ -365,20 +368,20 @@ Sitemap: ``` Frame label="Heos Group" visibility=[HeosGroup_Status==ONLINE] { - + Default item=HeosGroup1_Player Default item=HeosGroup1_Volume Default item=HeosGroup1_Mute Default item=HeosGroup1_Favorites Default item=HeosGroup1_Playlist - + Text item=HeosGroup1_Song { Default item=HeosGroup1_Song Default item=HeosGroup1_Artist Default item=HeosGroup1_Album Image item=HeosGroup1_Cover url="" } - + } ``` @@ -400,4 +403,4 @@ Sitemap: ``` Switch item=HeosKitchen_Playlists mappings=[0="San Glaser", 1="Classic", 2="Beasty Boys"] -``` \ No newline at end of file +``` diff --git a/bundles/org.openhab.binding.heos/pom.xml b/bundles/org.openhab.binding.heos/pom.xml index e3c2800c323a9..b5e8a2b858990 100644 --- a/bundles/org.openhab.binding.heos/pom.xml +++ b/bundles/org.openhab.binding.heos/pom.xml @@ -1,20 +1,25 @@ - + 4.0.0 - org.openhab.binding - pom + org.openhab.addons.bundles + org.openhab.addons.reactor.bundles 2.5.0-SNAPSHOT - org.openhab.binding org.openhab.binding.heos - 2.5.0-SNAPSHOT - Heos Binding - eclipse-plugin + openHAB Add-ons :: Bundles :: Heos Binding + + + commons-net + commons-net + 3.6 + provided + + diff --git a/bundles/org.openhab.binding.heos/src/main/feature/feature.xml b/bundles/org.openhab.binding.heos/src/main/feature/feature.xml new file mode 100644 index 0000000000000..36f3dbea5269e --- /dev/null +++ b/bundles/org.openhab.binding.heos/src/main/feature/feature.xml @@ -0,0 +1,11 @@ + + + mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${project.version}/xml/features + + + openhab-runtime-base + openhab-transport-upnp + mvn:commons-net/commons-net/3.6 + mvn:org.openhab.addons.bundles/org.openhab.binding.heos/${project.version} + + diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosBridgeHandler.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosBridgeHandler.java index 8ab9e44541b3f..d05351896b0c3 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosBridgeHandler.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosBridgeHandler.java @@ -13,7 +13,7 @@ package org.openhab.binding.heos.handler; import static org.openhab.binding.heos.HeosBindingConstants.*; -import static org.openhab.binding.heos.internal.resources.HeosConstants.*; +//import static org.openhab.binding.heos.internal.resources.HeosConstants.*; import java.util.ArrayList; import java.util.HashMap; @@ -120,11 +120,12 @@ private void scheduledStartUp() { String name = thing.getConfiguration().get(USERNAME).toString(); String password = thing.getConfiguration().get(PASSWORD).toString(); api.logIn(name, password); + updateState(CH_ID_REBOOT, OnOffType.OFF); + updateStatus(ThingStatus.ONLINE); } else { - logger.info("Can not log in. Username and Password not set"); + logger.debug("Can't log in. Username or password not set."); + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "Can't log in. Username or password not set."); } - updateState(CH_ID_REBOOT, OnOffType.OFF); - updateStatus(ThingStatus.ONLINE); }, 5, TimeUnit.SECONDS); } diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosThingBaseHandler.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosThingBaseHandler.java index 054d1d13d3493..5fd233d2f22ff 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosThingBaseHandler.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/handler/HeosThingBaseHandler.java @@ -13,7 +13,7 @@ package org.openhab.binding.heos.handler; import static org.openhab.binding.heos.HeosBindingConstants.*; -import static org.openhab.binding.heos.internal.resources.HeosConstants.*; +//import static org.openhab.binding.heos.internal.resources.HeosConstants.*; import java.net.MalformedURLException; import java.net.URL; diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosFacade.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosFacade.java index af6ffe9945233..88d0c97d3a324 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosFacade.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosFacade.java @@ -14,7 +14,7 @@ import java.net.URL; -import org.openhab.binding.heos.internal.resources.HeosConstants; +//import org.openhab.binding.heos.internal.resources.HeosConstants; import org.openhab.binding.heos.internal.resources.HeosEventListener; /** diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosSystem.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosSystem.java index 39c87e0789799..1de03127d311f 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosSystem.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/api/HeosSystem.java @@ -23,6 +23,8 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +// import org.eclipse.smarthome.core.thing.ThingStatus; +// import org.eclipse.smarthome.core.thing.ThingStatusDetail; import org.openhab.binding.heos.internal.resources.HeosCommands; import org.openhab.binding.heos.internal.resources.HeosGroup; import org.openhab.binding.heos.internal.resources.HeosPlayer; @@ -35,7 +37,7 @@ /** * The {@link HeosSystem} is handling the main commands, which are - * send and received by the HEOS system. + * sent and received by the HEOS system. * * @author Johannes Einig - Initial contribution */ @@ -89,6 +91,7 @@ public synchronized boolean send(String command) { return true; } else { logger.debug("Could not send message. HEOS bridge is not connected"); +// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "Could not send message. HEOS bridge is not connected"); return false; } } catch (ReadException e) { @@ -101,10 +104,12 @@ public synchronized boolean send(String command) { logger.debug("Could not send command. Please check the system connection"); } } catch (IOException e) { - logger.warn("IO Exception during send HEOS command with message: {}", e.getMessage()); + logger.debug("IO Exception during send HEOS command with message: {}", e.getMessage()); +// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); return false; } } +// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "Could not send command. Please check the system connection"); return false; } @@ -152,7 +157,8 @@ public boolean establishConnection(boolean connectionDelay) { try { commandLineConnected = commandLine.connect(connectionIP, connectionPort); } catch (IOException e) { - logger.warn("Execption during connection to bridge with message: {}", e.getMessage()); + logger.debug("Exception during connection to bridge with message: {}", e.getMessage()); +// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); logger.debug("Could not connect HEOS command line at IP {} @ port {}", connectionIP, connectionPort); commandLineConnected = false; } @@ -165,7 +171,8 @@ public boolean establishConnection(boolean connectionDelay) { try { eventLineConnected = eventLine.connect(connectionIP, connectionPort); } catch (IOException e) { - logger.warn("Execption during connection to bridge with message: {}", e.getMessage()); + logger.debug("Exception during connection to bridge with message: {}", e.getMessage()); +// updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); logger.debug("Could not connect HEOS event line at IP {} @ port {}", connectionIP, connectionPort); eventLineConnected = false; } diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/discovery/HeosPlayerDiscoveryListener.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/discovery/HeosPlayerDiscoveryListener.java index f62a50f4906dc..d004abeccc4c9 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/discovery/HeosPlayerDiscoveryListener.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/discovery/HeosPlayerDiscoveryListener.java @@ -12,7 +12,7 @@ */ package org.openhab.binding.heos.internal.discovery; -import org.openhab.binding.heos.handler.HeosBridgeHandler; +//import org.openhab.binding.heos.handler.HeosBridgeHandler; /** * The {@link HeosPlayerDiscoveryListener } is an Event Listener diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/HeosEventListener.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/HeosEventListener.java index 29fdd8f9f5a1d..7a068315e30d9 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/HeosEventListener.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/HeosEventListener.java @@ -16,7 +16,7 @@ import java.util.Map; import org.eclipse.jdt.annotation.NonNullByDefault; -import org.openhab.binding.heos.internal.api.HeosEventController; +//import org.openhab.binding.heos.internal.api.HeosEventController; /** * The {@link HeosEventListener } is an Event Listener diff --git a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/Telnet.java b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/Telnet.java index f10aa8d40d485..50b5ca9c6d0b5 100644 --- a/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/Telnet.java +++ b/bundles/org.openhab.binding.heos/src/main/java/org/openhab/binding/heos/internal/resources/Telnet.java @@ -153,8 +153,8 @@ public boolean read() throws IOException { * Read all commands till an End Of Line is detected * I more than one line is read every line is an * element in the returned {@code ArrayList<>} - * Reading timed out after 3000 milliseconds. For an other - * timing @see readLine(int timeOut). + * Reading timed out after 3000 milliseconds. For another timing + * @see readLine(int timeOut). * * @return A list with all read commands * @throws ReadException @@ -266,7 +266,7 @@ private void inputAvailableRead() { String str = new String(buffer, "UTF-8"); i = concatReadResult(str); } catch (IOException e) { - logger.debug("IO Excpetion- Message: {}", e.getMessage()); + logger.debug("IO Exception- Message: {}", e.getMessage()); } } @@ -298,7 +298,7 @@ public boolean isConnectionAlive() { try { return address.isReachable(IS_ALIVE_TIMEOUT); } catch (IOException e) { - logger.debug("IO Excpetion- Message: {}", e.getMessage()); + logger.debug("IO Exception- Message: {}", e.getMessage()); return false; } } @@ -312,6 +312,8 @@ public boolean isConnected() { } public class ReadException extends Exception { + private static final long serialVersionUID = 1L; + public ReadException() { super("Can not read from client"); } diff --git a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/binding/binding.xml b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/binding/binding.xml index 98c583d4eecc7..b59c688dac8af 100644 --- a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/binding/binding.xml +++ b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/binding/binding.xml @@ -1,10 +1,10 @@ - + HEOS Binding - This is the binding for the Denon HEOS system. + Binding for the Denon HEOS system. Johannes Einig - + diff --git a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/Channels.xml b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/Channels.xml index 866c89e1283b6..a5bdf2133e30e 100644 --- a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/Channels.xml +++ b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/Channels.xml @@ -1,17 +1,9 @@ + xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0" + xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> - - Dimmer - - - - Switch - - Switch @@ -28,8 +20,8 @@ Switch - - + + String diff --git a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosGroup.xml b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosGroup.xml index a4098fb40412a..c146b8a25d041 100644 --- a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosGroup.xml +++ b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosGroup.xml @@ -1,8 +1,8 @@ + xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0" + xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> @@ -12,8 +12,8 @@ A group of HEOS Player - - + + diff --git a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosPlayer.xml b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosPlayer.xml index a5f012d0070b3..aa032adb51956 100644 --- a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosPlayer.xml +++ b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosPlayer.xml @@ -1,8 +1,8 @@ + xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0" + xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> @@ -14,8 +14,8 @@ - - + + diff --git a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosSystem.xml b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosSystem.xml index 92a78f513a176..22b21bc5c2ecd 100644 --- a/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosSystem.xml +++ b/bundles/org.openhab.binding.heos/src/main/resources/ESH-INF/thing/HeosSystem.xml @@ -1,15 +1,15 @@ + xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0" + xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd"> The HEOS System Bridge - - + + Role @@ -34,7 +34,7 @@ false seconds - The time in seconds for the HEOS Heartbeat (default = 60s) + The time in seconds for the HEOS Heartbeat (default = 60 s) 60 true