mirror of
https://github.com/openhab/openhab-addons.git
synced 2025-01-10 23:22:02 +01:00
Compare commits
1 Commits
65d58920c7
...
74184aa889
Author | SHA1 | Date | |
---|---|---|---|
|
74184aa889 |
@ -147,6 +147,10 @@ Additional [example rules are available](https://openhab.github.io/openhab-jruby
|
|||||||
After installing this add-on, you will find configuration options in the openHAB portal under _Settings -> Add-on Settings -> JRuby Scripting_.
|
After installing this add-on, you will find configuration options in the openHAB portal under _Settings -> Add-on Settings -> JRuby Scripting_.
|
||||||
Alternatively, JRuby configuration parameters may be set by creating a `jruby.cfg` file in `conf/services/`.
|
Alternatively, JRuby configuration parameters may be set by creating a `jruby.cfg` file in `conf/services/`.
|
||||||
|
|
||||||
|
> **_NOTE:_**
|
||||||
|
> In openHAB 3.4.x, the `gems` and `require` settings must be manually configured to the value given in the table below.
|
||||||
|
Starting from openHAB 4.0, the correct defaults were added, so manual configurations are no longer necessary.
|
||||||
|
|
||||||
By default this add-on includes the [openhab-scripting](https://github.com/openhab/openhab-jruby) Ruby gem and automatically `require`s it.
|
By default this add-on includes the [openhab-scripting](https://github.com/openhab/openhab-jruby) Ruby gem and automatically `require`s it.
|
||||||
This allows the use of [items](https://openhab.github.io/openhab-jruby/main/OpenHAB/DSL.html#items-class_method), [rules](https://openhab.github.io/openhab-jruby/main/OpenHAB/DSL.html#rules-class_method), [shared_cache](https://openhab.github.io/openhab-jruby/main/OpenHAB/DSL.html#shared_cache-class_method) and other objects in your scripts.
|
This allows the use of [items](https://openhab.github.io/openhab-jruby/main/OpenHAB/DSL.html#items-class_method), [rules](https://openhab.github.io/openhab-jruby/main/OpenHAB/DSL.html#rules-class_method), [shared_cache](https://openhab.github.io/openhab-jruby/main/OpenHAB/DSL.html#shared_cache-class_method) and other objects in your scripts.
|
||||||
This functionality can be disabled for users who prefer to manage their own gems and `require`s via the add-on configuration options.
|
This functionality can be disabled for users who prefer to manage their own gems and `require`s via the add-on configuration options.
|
||||||
|
@ -46,8 +46,6 @@ The following channels are available:
|
|||||||
| playMode | String | The current playback mode ie: stop, play, pause (ReadOnly). |
|
| playMode | String | The current playback mode ie: stop, play, pause (ReadOnly). |
|
||||||
| timeElapsed | Number:Time | The total number of seconds of playback time elapsed for the current playing title (ReadOnly). |
|
| timeElapsed | Number:Time | The total number of seconds of playback time elapsed for the current playing title (ReadOnly). |
|
||||||
| timeTotal | Number:Time | The total length of the current playing title in seconds (ReadOnly). This data is not provided by all streaming apps. |
|
| timeTotal | Number:Time | The total length of the current playing title in seconds (ReadOnly). This data is not provided by all streaming apps. |
|
||||||
| endTime | DateTime | The date/time when the currently playing media will end (ReadOnly). N/A if timeTotal is not provided by the current streaming app. |
|
|
||||||
| progress | Dimmer | The current progress [0-100%] of playing media (ReadOnly). N/A if timeTotal is not provided by the current streaming app. |
|
|
||||||
| activeChannel | String | A dropdown containing a list of available TV channels on the Roku TV. The channel currently tuned is automatically selected. The list updates every 10 minutes. |
|
| activeChannel | String | A dropdown containing a list of available TV channels on the Roku TV. The channel currently tuned is automatically selected. The list updates every 10 minutes. |
|
||||||
| signalMode | String | The signal type of the current TV channel, ie: 1080i (ReadOnly). |
|
| signalMode | String | The signal type of the current TV channel, ie: 1080i (ReadOnly). |
|
||||||
| signalQuality | Number:Dimensionless | The signal quality of the current TV channel, 0-100% (ReadOnly). |
|
| signalQuality | Number:Dimensionless | The signal quality of the current TV channel, 0-100% (ReadOnly). |
|
||||||
@ -61,7 +59,6 @@ The following channels are available:
|
|||||||
Some Notes:
|
Some Notes:
|
||||||
|
|
||||||
- The values for `activeApp`, `activeAppName`, `playMode`, `timeElapsed`, `timeTotal`, `activeChannel`, `signalMode`, `signalQuality`, `channelName`, `programTitle`, `programDescription`, `programRating`, `power` & `powerState` refresh automatically per the configured `refresh` interval.
|
- The values for `activeApp`, `activeAppName`, `playMode`, `timeElapsed`, `timeTotal`, `activeChannel`, `signalMode`, `signalQuality`, `channelName`, `programTitle`, `programDescription`, `programRating`, `power` & `powerState` refresh automatically per the configured `refresh` interval.
|
||||||
- The `endTime` and `progress` channels may not be accurate for some streaming apps especially 'live' streams where the `timeTotal` value constantly increases.
|
|
||||||
|
|
||||||
**List of available button commands for Roku streaming devices:**
|
**List of available button commands for Roku streaming devices:**
|
||||||
|
|
||||||
@ -116,36 +113,32 @@ roku:roku_tv:mytv1 "My Roku TV" [ hostName="192.168.10.1", refresh=10 ]
|
|||||||
```java
|
```java
|
||||||
// Roku streaming media player items:
|
// Roku streaming media player items:
|
||||||
|
|
||||||
String Player_ActiveApp "Current App: [%s]" { channel="roku:roku_player:myplayer1:activeApp" }
|
String Player_ActiveApp "Current App: [%s]" { channel="roku:roku_player:myplayer1:activeApp" }
|
||||||
String Player_ActiveAppName "Current App Name: [%s]" { channel="roku:roku_player:myplayer1:activeAppName" }
|
String Player_ActiveAppName "Current App Name: [%s]" { channel="roku:roku_player:myplayer1:activeAppName" }
|
||||||
String Player_Button "Send Command to Roku" { channel="roku:roku_player:myplayer1:button" }
|
String Player_Button "Send Command to Roku" { channel="roku:roku_player:myplayer1:button" }
|
||||||
Player Player_Control "Control" { channel="roku:roku_player:myplayer1:control" }
|
Player Player_Control "Control" { channel="roku:roku_player:myplayer1:control" }
|
||||||
String Player_PlayMode "Status: [%s]" { channel="roku:roku_player:myplayer1:playMode" }
|
String Player_PlayMode "Status: [%s]" { channel="roku:roku_player:myplayer1:playMode" }
|
||||||
Number:Time Player_TimeElapsed "Elapsed Time: [%d %unit%]" { channel="roku:roku_player:myplayer1:timeElapsed" }
|
Number:Time Player_TimeElapsed "Elapsed Time: [%d %unit%]" { channel="roku:roku_player:myplayer1:timeElapsed" }
|
||||||
Number:Time Player_TimeTotal "Total Time: [%d %unit%]" { channel="roku:roku_player:myplayer1:timeTotal" }
|
Number:Time Player_TimeTotal "Total Time: [%d %unit%]" { channel="roku:roku_player:myplayer1:timeTotal" }
|
||||||
DateTime Player_EndTime "End Time: [%1$tl:%1$tM %1$tp]" { channel="roku:roku_player:myplayer1:endTime" }
|
|
||||||
Dimmer Player_Progress "Progress [%.0f%%]" { channel="roku:roku_player:myplayer1:progress" }
|
|
||||||
|
|
||||||
// Roku TV items:
|
// Roku TV items:
|
||||||
|
|
||||||
Switch Player_Power "Power: [%s]" { channel="roku:roku_tv:mytv1:power" }
|
Switch Player_Power "Power: [%s]" { channel="roku:roku_tv:mytv1:power" }
|
||||||
String Player_PowerState "Power State: [%s] { channel="roku:roku_tv:mytv1:powerState" }
|
String Player_PowerState "Power State: [%s] { channel="roku:roku_tv:mytv1:powerState" }
|
||||||
String Player_ActiveApp "Current App: [%s]" { channel="roku:roku_tv:mytv1:activeApp" }
|
String Player_ActiveApp "Current App: [%s]" { channel="roku:roku_tv:mytv1:activeApp" }
|
||||||
String Player_ActiveAppName "Current App Name: [%s]" { channel="roku:roku_tv:mytv1:activeAppName" }
|
String Player_ActiveAppName "Current App Name: [%s]" { channel="roku:roku_tv:mytv1:activeAppName" }
|
||||||
String Player_Button "Send Command to Roku" { channel="roku:roku_tv:mytv1:button" }
|
String Player_Button "Send Command to Roku" { channel="roku:roku_tv:mytv1:button" }
|
||||||
Player Player_Control "Control" { channel="roku:roku_tv:mytv1:control" }
|
Player Player_Control "Control" { channel="roku:roku_tv:mytv1:control" }
|
||||||
String Player_PlayMode "Status: [%s]" { channel="roku:roku_tv:mytv1:playMode" }
|
String Player_PlayMode "Status: [%s]" { channel="roku:roku_tv:mytv1:playMode" }
|
||||||
Number:Time Player_TimeElapsed "Elapsed Time: [%d %unit%]" { channel="roku:roku_tv:mytv1:timeElapsed" }
|
Number:Time Player_TimeElapsed "Elapsed Time: [%d %unit%]" { channel="roku:roku_tv:mytv1:timeElapsed" }
|
||||||
Number:Time Player_TimeTotal "Total Time: [%d %unit%]" { channel="roku:roku_tv:mytv1:timeTotal" }
|
Number:Time Player_TimeTotal "Total Time: [%d %unit%]" { channel="roku:roku_tv:mytv1:timeTotal" }
|
||||||
DateTime Player_EndTime "End Time: [%1$tl:%1$tM %1$tp]" { channel="roku:roku_tv:mytv1:endTime" }
|
String Player_ActiveChannel "Current Channel: [%s]" { channel="roku:roku_tv:mytv1:activeChannel" }
|
||||||
Dimmer Player_Progress "Progress [%.0f%%]" { channel="roku:roku_tv:mytv1:progress" }
|
String Player_SignalMode "Signal Mode: [%s]" { channel="roku:roku_tv:mytv1:signalMode" }
|
||||||
String Player_ActiveChannel "Current Channel: [%s]" { channel="roku:roku_tv:mytv1:activeChannel" }
|
Number Player_SignalQuality "Signal Quality: [%d %%]" { channel="roku:roku_tv:mytv1:signalQuality" }
|
||||||
String Player_SignalMode "Signal Mode: [%s]" { channel="roku:roku_tv:mytv1:signalMode" }
|
String Player_ChannelName "Channel Name: [%s]" { channel="roku:roku_tv:mytv1:channelName" }
|
||||||
Number Player_SignalQuality "Signal Quality: [%d %%]" { channel="roku:roku_tv:mytv1:signalQuality" }
|
String Player_ProgramTitle "Program Title: [%s]" { channel="roku:roku_tv:mytv1:programTitle" }
|
||||||
String Player_ChannelName "Channel Name: [%s]" { channel="roku:roku_tv:mytv1:channelName" }
|
String Player_ProgramDescription "Program Description: [%s]" { channel="roku:roku_tv:mytv1:programDescription" }
|
||||||
String Player_ProgramTitle "Program Title: [%s]" { channel="roku:roku_tv:mytv1:programTitle" }
|
String Player_ProgramRating "Program Rating: [%s]" { channel="roku:roku_tv:mytv1:programRating" }
|
||||||
String Player_ProgramDescription "Program Description: [%s]" { channel="roku:roku_tv:mytv1:programDescription" }
|
|
||||||
String Player_ProgramRating "Program Rating: [%s]" { channel="roku:roku_tv:mytv1:programRating" }
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### `roku.sitemap` Example
|
### `roku.sitemap` Example
|
||||||
@ -161,8 +154,6 @@ sitemap roku label="Roku" {
|
|||||||
Text item=Player_PlayMode
|
Text item=Player_PlayMode
|
||||||
Text item=Player_TimeElapsed icon="time"
|
Text item=Player_TimeElapsed icon="time"
|
||||||
Text item=Player_TimeTotal icon="time"
|
Text item=Player_TimeTotal icon="time"
|
||||||
Text item=Player_EndTime icon="time"
|
|
||||||
Slider item=Player_Progress icon="time"
|
|
||||||
// The following items apply to Roku TVs only
|
// The following items apply to Roku TVs only
|
||||||
Switch item=Player_Power
|
Switch item=Player_Power
|
||||||
Text item=Player_PowerState
|
Text item=Player_PowerState
|
||||||
|
@ -55,8 +55,6 @@ public class RokuBindingConstants {
|
|||||||
public static final String PLAY_MODE = "playMode";
|
public static final String PLAY_MODE = "playMode";
|
||||||
public static final String TIME_ELAPSED = "timeElapsed";
|
public static final String TIME_ELAPSED = "timeElapsed";
|
||||||
public static final String TIME_TOTAL = "timeTotal";
|
public static final String TIME_TOTAL = "timeTotal";
|
||||||
public static final String END_TIME = "endTime";
|
|
||||||
public static final String PROGRESS = "progress";
|
|
||||||
public static final String ACTIVE_CHANNEL = "activeChannel";
|
public static final String ACTIVE_CHANNEL = "activeChannel";
|
||||||
public static final String SIGNAL_MODE = "signalMode";
|
public static final String SIGNAL_MODE = "signalMode";
|
||||||
public static final String SIGNAL_QUALITY = "signalQuality";
|
public static final String SIGNAL_QUALITY = "signalQuality";
|
||||||
|
@ -14,8 +14,6 @@ package org.openhab.binding.roku.internal.handler;
|
|||||||
|
|
||||||
import static org.openhab.binding.roku.internal.RokuBindingConstants.*;
|
import static org.openhab.binding.roku.internal.RokuBindingConstants.*;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -36,10 +34,8 @@ import org.openhab.binding.roku.internal.dto.DeviceInfo;
|
|||||||
import org.openhab.binding.roku.internal.dto.Player;
|
import org.openhab.binding.roku.internal.dto.Player;
|
||||||
import org.openhab.binding.roku.internal.dto.TvChannel;
|
import org.openhab.binding.roku.internal.dto.TvChannel;
|
||||||
import org.openhab.binding.roku.internal.dto.TvChannels.Channel;
|
import org.openhab.binding.roku.internal.dto.TvChannels.Channel;
|
||||||
import org.openhab.core.library.types.DateTimeType;
|
|
||||||
import org.openhab.core.library.types.NextPreviousType;
|
import org.openhab.core.library.types.NextPreviousType;
|
||||||
import org.openhab.core.library.types.OnOffType;
|
import org.openhab.core.library.types.OnOffType;
|
||||||
import org.openhab.core.library.types.PercentType;
|
|
||||||
import org.openhab.core.library.types.PlayPauseType;
|
import org.openhab.core.library.types.PlayPauseType;
|
||||||
import org.openhab.core.library.types.QuantityType;
|
import org.openhab.core.library.types.QuantityType;
|
||||||
import org.openhab.core.library.types.StringType;
|
import org.openhab.core.library.types.StringType;
|
||||||
@ -199,32 +195,21 @@ public class RokuHandler extends BaseThingHandler {
|
|||||||
PLAY.equalsIgnoreCase(playerInfo.getState()) ? PlayPauseType.PLAY : PlayPauseType.PAUSE);
|
PLAY.equalsIgnoreCase(playerInfo.getState()) ? PlayPauseType.PLAY : PlayPauseType.PAUSE);
|
||||||
|
|
||||||
// Remove non-numeric from string, ie: ' ms'
|
// Remove non-numeric from string, ie: ' ms'
|
||||||
final String positionStr = playerInfo.getPosition().replaceAll(NON_DIGIT_PATTERN, EMPTY);
|
String position = playerInfo.getPosition().replaceAll(NON_DIGIT_PATTERN, EMPTY);
|
||||||
int position = -1;
|
if (!EMPTY.equals(position)) {
|
||||||
if (!EMPTY.equals(positionStr)) {
|
updateState(TIME_ELAPSED,
|
||||||
position = Integer.parseInt(positionStr) / 1000;
|
new QuantityType<>(Integer.parseInt(position) / 1000, API_SECONDS_UNIT));
|
||||||
updateState(TIME_ELAPSED, new QuantityType<>(position, API_SECONDS_UNIT));
|
|
||||||
} else {
|
} else {
|
||||||
updateState(TIME_ELAPSED, UnDefType.UNDEF);
|
updateState(TIME_ELAPSED, UnDefType.UNDEF);
|
||||||
}
|
}
|
||||||
|
|
||||||
final String durationStr = playerInfo.getDuration().replaceAll(NON_DIGIT_PATTERN, EMPTY);
|
String duration = playerInfo.getDuration().replaceAll(NON_DIGIT_PATTERN, EMPTY);
|
||||||
int duration = -1;
|
if (!EMPTY.equals(duration)) {
|
||||||
if (!EMPTY.equals(durationStr)) {
|
updateState(TIME_TOTAL,
|
||||||
duration = Integer.parseInt(durationStr) / 1000;
|
new QuantityType<>(Integer.parseInt(duration) / 1000, API_SECONDS_UNIT));
|
||||||
updateState(TIME_TOTAL, new QuantityType<>(duration, API_SECONDS_UNIT));
|
|
||||||
} else {
|
} else {
|
||||||
updateState(TIME_TOTAL, UnDefType.UNDEF);
|
updateState(TIME_TOTAL, UnDefType.UNDEF);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (position >= 0 && duration > 0) {
|
|
||||||
updateState(END_TIME, new DateTimeType(Instant.now().plusSeconds(duration - position)));
|
|
||||||
updateState(PROGRESS,
|
|
||||||
new PercentType(BigDecimal.valueOf(Math.round(position / (double) duration * 100.0))));
|
|
||||||
} else {
|
|
||||||
updateState(END_TIME, UnDefType.UNDEF);
|
|
||||||
updateState(PROGRESS, UnDefType.UNDEF);
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
logger.debug("Unable to parse playerInfo integer value. Exception: {}", e.getMessage());
|
logger.debug("Unable to parse playerInfo integer value. Exception: {}", e.getMessage());
|
||||||
} catch (RokuLimitedModeException e) {
|
} catch (RokuLimitedModeException e) {
|
||||||
@ -239,8 +224,6 @@ public class RokuHandler extends BaseThingHandler {
|
|||||||
updateState(PLAY_MODE, UnDefType.UNDEF);
|
updateState(PLAY_MODE, UnDefType.UNDEF);
|
||||||
updateState(TIME_ELAPSED, UnDefType.UNDEF);
|
updateState(TIME_ELAPSED, UnDefType.UNDEF);
|
||||||
updateState(TIME_TOTAL, UnDefType.UNDEF);
|
updateState(TIME_TOTAL, UnDefType.UNDEF);
|
||||||
updateState(END_TIME, UnDefType.UNDEF);
|
|
||||||
updateState(PROGRESS, UnDefType.UNDEF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thingTypeUID.equals(THING_TYPE_ROKU_TV) && tvActive) {
|
if (thingTypeUID.equals(THING_TYPE_ROKU_TV) && tvActive) {
|
||||||
|
@ -80,8 +80,6 @@ channel-type.roku.channelName.label = Channel Name
|
|||||||
channel-type.roku.channelName.description = The Name of the Channel Currently Selected
|
channel-type.roku.channelName.description = The Name of the Channel Currently Selected
|
||||||
channel-type.roku.control.label = Control
|
channel-type.roku.control.label = Control
|
||||||
channel-type.roku.control.description = Control playback e.g. Play/Pause/Next/Previous
|
channel-type.roku.control.description = Control playback e.g. Play/Pause/Next/Previous
|
||||||
channel-type.roku.endTime.label = End Time
|
|
||||||
channel-type.roku.endTime.description = The date/time when the currently playing media will end
|
|
||||||
channel-type.roku.playMode.label = Play Mode
|
channel-type.roku.playMode.label = Play Mode
|
||||||
channel-type.roku.playMode.description = The Current Playback Mode
|
channel-type.roku.playMode.description = The Current Playback Mode
|
||||||
channel-type.roku.powerState.label = Power State
|
channel-type.roku.powerState.label = Power State
|
||||||
@ -95,8 +93,6 @@ channel-type.roku.programRating.label = Program Rating
|
|||||||
channel-type.roku.programRating.description = The TV Parental Guideline Rating of the Current TV Program
|
channel-type.roku.programRating.description = The TV Parental Guideline Rating of the Current TV Program
|
||||||
channel-type.roku.programTitle.label = Program Title
|
channel-type.roku.programTitle.label = Program Title
|
||||||
channel-type.roku.programTitle.description = The Name of the Current TV Program
|
channel-type.roku.programTitle.description = The Name of the Current TV Program
|
||||||
channel-type.roku.progress.label = Media Progress
|
|
||||||
channel-type.roku.progress.description = The current progress of playing media
|
|
||||||
channel-type.roku.signalMode.label = Signal Mode
|
channel-type.roku.signalMode.label = Signal Mode
|
||||||
channel-type.roku.signalMode.description = The Signal Type of the Current TV Channel, ie: 1080i
|
channel-type.roku.signalMode.description = The Signal Type of the Current TV Channel, ie: 1080i
|
||||||
channel-type.roku.signalQuality.label = Signal Quality
|
channel-type.roku.signalQuality.label = Signal Quality
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
<channel id="playMode" typeId="playMode"/>
|
<channel id="playMode" typeId="playMode"/>
|
||||||
<channel id="timeElapsed" typeId="timeElapsed"/>
|
<channel id="timeElapsed" typeId="timeElapsed"/>
|
||||||
<channel id="timeTotal" typeId="timeTotal"/>
|
<channel id="timeTotal" typeId="timeTotal"/>
|
||||||
<channel id="endTime" typeId="endTime"/>
|
|
||||||
<channel id="progress" typeId="progress"/>
|
|
||||||
</channels>
|
</channels>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@ -30,7 +28,7 @@
|
|||||||
<property name="Serial Number">unknown</property>
|
<property name="Serial Number">unknown</property>
|
||||||
<property name="Device Id">unknown</property>
|
<property name="Device Id">unknown</property>
|
||||||
<property name="Software Version">unknown</property>
|
<property name="Software Version">unknown</property>
|
||||||
<property name="thingTypeVersion">2</property>
|
<property name="thingTypeVersion">1</property>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<representation-property>uuid</representation-property>
|
<representation-property>uuid</representation-property>
|
||||||
@ -54,8 +52,6 @@
|
|||||||
<channel id="playMode" typeId="playMode"/>
|
<channel id="playMode" typeId="playMode"/>
|
||||||
<channel id="timeElapsed" typeId="timeElapsed"/>
|
<channel id="timeElapsed" typeId="timeElapsed"/>
|
||||||
<channel id="timeTotal" typeId="timeTotal"/>
|
<channel id="timeTotal" typeId="timeTotal"/>
|
||||||
<channel id="endTime" typeId="endTime"/>
|
|
||||||
<channel id="progress" typeId="progress"/>
|
|
||||||
<channel id="activeChannel" typeId="activeChannel"/>
|
<channel id="activeChannel" typeId="activeChannel"/>
|
||||||
<channel id="signalMode" typeId="signalMode"/>
|
<channel id="signalMode" typeId="signalMode"/>
|
||||||
<channel id="signalQuality" typeId="signalQuality"/>
|
<channel id="signalQuality" typeId="signalQuality"/>
|
||||||
@ -73,7 +69,7 @@
|
|||||||
<property name="Serial Number">unknown</property>
|
<property name="Serial Number">unknown</property>
|
||||||
<property name="Device Id">unknown</property>
|
<property name="Device Id">unknown</property>
|
||||||
<property name="Software Version">unknown</property>
|
<property name="Software Version">unknown</property>
|
||||||
<property name="thingTypeVersion">2</property>
|
<property name="thingTypeVersion">1</property>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<representation-property>uuid</representation-property>
|
<representation-property>uuid</representation-property>
|
||||||
@ -189,24 +185,6 @@
|
|||||||
<state readOnly="true" pattern="%d %unit%"/>
|
<state readOnly="true" pattern="%d %unit%"/>
|
||||||
</channel-type>
|
</channel-type>
|
||||||
|
|
||||||
<channel-type id="endTime">
|
|
||||||
<item-type>DateTime</item-type>
|
|
||||||
<label>End Time</label>
|
|
||||||
<description>The date/time when the currently playing media will end</description>
|
|
||||||
<category>Time</category>
|
|
||||||
<tags>
|
|
||||||
<tag>Status</tag>
|
|
||||||
<tag>Timestamp</tag>
|
|
||||||
</tags>
|
|
||||||
<state readOnly="true"/>
|
|
||||||
</channel-type>
|
|
||||||
|
|
||||||
<channel-type id="progress">
|
|
||||||
<item-type>Dimmer</item-type>
|
|
||||||
<label>Media Progress</label>
|
|
||||||
<description>The current progress of playing media</description>
|
|
||||||
</channel-type>
|
|
||||||
|
|
||||||
<channel-type id="activeChannel">
|
<channel-type id="activeChannel">
|
||||||
<item-type>String</item-type>
|
<item-type>String</item-type>
|
||||||
<label>Active Channel</label>
|
<label>Active Channel</label>
|
||||||
|
@ -12,15 +12,6 @@
|
|||||||
<type>roku:control</type>
|
<type>roku:control</type>
|
||||||
</add-channel>
|
</add-channel>
|
||||||
</instruction-set>
|
</instruction-set>
|
||||||
|
|
||||||
<instruction-set targetVersion="2">
|
|
||||||
<add-channel id="endTime">
|
|
||||||
<type>roku:endTime</type>
|
|
||||||
</add-channel>
|
|
||||||
<add-channel id="progress">
|
|
||||||
<type>roku:progress</type>
|
|
||||||
</add-channel>
|
|
||||||
</instruction-set>
|
|
||||||
</thing-type>
|
</thing-type>
|
||||||
|
|
||||||
<thing-type uid="roku:roku_tv">
|
<thing-type uid="roku:roku_tv">
|
||||||
@ -38,15 +29,6 @@
|
|||||||
<type>roku:control</type>
|
<type>roku:control</type>
|
||||||
</add-channel>
|
</add-channel>
|
||||||
</instruction-set>
|
</instruction-set>
|
||||||
|
|
||||||
<instruction-set targetVersion="2">
|
|
||||||
<add-channel id="endTime">
|
|
||||||
<type>roku:endTime</type>
|
|
||||||
</add-channel>
|
|
||||||
<add-channel id="progress">
|
|
||||||
<type>roku:progress</type>
|
|
||||||
</add-channel>
|
|
||||||
</instruction-set>
|
|
||||||
</thing-type>
|
</thing-type>
|
||||||
|
|
||||||
</update:update-descriptions>
|
</update:update-descriptions>
|
||||||
|
@ -185,7 +185,6 @@ public class ApiPageParser extends AbstractSimpleMarkupHandler {
|
|||||||
} else if ("durchsichtig".equals(classFlag)) { // link
|
} else if ("durchsichtig".equals(classFlag)) { // link
|
||||||
this.fieldType = FieldType.IGNORE;
|
this.fieldType = FieldType.IGNORE;
|
||||||
} else if ("bord".equals(classFlag)) { // special button style - not of our interest...
|
} else if ("bord".equals(classFlag)) { // special button style - not of our interest...
|
||||||
continue;
|
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Unhanndled class in {}:{}:{}: '{}' ", id, line, col, classFlag);
|
logger.debug("Unhanndled class in {}:{}:{}: '{}' ", id, line, col, classFlag);
|
||||||
}
|
}
|
||||||
@ -193,7 +192,7 @@ public class ApiPageParser extends AbstractSimpleMarkupHandler {
|
|||||||
}
|
}
|
||||||
} else if (this.parserState == ParserState.DATA_ENTRY && this.fieldType == FieldType.BUTTON
|
} else if (this.parserState == ParserState.DATA_ENTRY && this.fieldType == FieldType.BUTTON
|
||||||
&& "span".equals(elementName)) {
|
&& "span".equals(elementName)) {
|
||||||
return; // ignored...
|
// ignored...
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Unexpected OpenElement in {}:{}: {} [{}]", line, col, elementName, attributes);
|
logger.debug("Unexpected OpenElement in {}:{}: {} [{}]", line, col, elementName, attributes);
|
||||||
}
|
}
|
||||||
@ -246,14 +245,14 @@ public class ApiPageParser extends AbstractSimpleMarkupHandler {
|
|||||||
getApiPageEntry(id, line, col, shortName, description, this.buttonValue);
|
getApiPageEntry(id, line, col, shortName, description, this.buttonValue);
|
||||||
}
|
}
|
||||||
} else if (this.fieldType == FieldType.IGNORE) {
|
} else if (this.fieldType == FieldType.IGNORE) {
|
||||||
return; // ignore
|
// ignore
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Unhandled setting {}:{}:{} [{}] : {}", id, line, col, this.fieldType, sb);
|
logger.debug("Unhandled setting {}:{}:{} [{}] : {}", id, line, col, this.fieldType, sb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (this.parserState == ParserState.DATA_ENTRY && this.fieldType == FieldType.BUTTON
|
} else if (this.parserState == ParserState.DATA_ENTRY && this.fieldType == FieldType.BUTTON
|
||||||
&& "span".equals(elementName)) {
|
&& "span".equals(elementName)) {
|
||||||
return;// ignored...
|
// ignored...
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Unexpected CloseElement in {}:{}: {}", line, col, elementName);
|
logger.debug("Unexpected CloseElement in {}:{}: {}", line, col, elementName);
|
||||||
}
|
}
|
||||||
@ -308,7 +307,7 @@ public class ApiPageParser extends AbstractSimpleMarkupHandler {
|
|||||||
}
|
}
|
||||||
} else if (this.parserState == ParserState.INIT && ((len == 1 && buffer[offset] == '\n')
|
} else if (this.parserState == ParserState.INIT && ((len == 1 && buffer[offset] == '\n')
|
||||||
|| (len == 2 && buffer[offset] == '\r' && buffer[offset + 1] == '\n'))) {
|
|| (len == 2 && buffer[offset] == '\r' && buffer[offset + 1] == '\n'))) {
|
||||||
return; // single newline - ignore/drop it...
|
// single newline - ignore/drop it...
|
||||||
} else {
|
} else {
|
||||||
String msg = new String(buffer, offset, len).replace("\n", "\\n").replace("\r", "\\r");
|
String msg = new String(buffer, offset, len).replace("\n", "\\n").replace("\r", "\\r");
|
||||||
logger.debug("Unexpected Text {}:{}: ParserState: {} ({}) `{}`", line, col, parserState, len, msg);
|
logger.debug("Unexpected Text {}:{}: ParserState: {} ({}) `{}`", line, col, parserState, len, msg);
|
||||||
@ -401,9 +400,9 @@ public class ApiPageParser extends AbstractSimpleMarkupHandler {
|
|||||||
// failed to get unit...
|
// failed to get unit...
|
||||||
if ("Imp".equals(unitStr) || "€$".contains(unitStr)) {
|
if ("Imp".equals(unitStr) || "€$".contains(unitStr)) {
|
||||||
// special case
|
// special case
|
||||||
unitData = TACmiSchemaHandler.SPECIAL_MARKER;
|
unitData = taCmiSchemaHandler.SPECIAL_MARKER;
|
||||||
} else {
|
} else {
|
||||||
unitData = TACmiSchemaHandler.NULL_MARKER;
|
unitData = taCmiSchemaHandler.NULL_MARKER;
|
||||||
logger.warn(
|
logger.warn(
|
||||||
"Unhandled UoM '{}' - seen on channel {} '{}'; Message from QuantityType: {}",
|
"Unhandled UoM '{}' - seen on channel {} '{}'; Message from QuantityType: {}",
|
||||||
valParts[1], shortName, description, iae.getMessage());
|
valParts[1], shortName, description, iae.getMessage());
|
||||||
@ -411,12 +410,12 @@ public class ApiPageParser extends AbstractSimpleMarkupHandler {
|
|||||||
}
|
}
|
||||||
taCmiSchemaHandler.unitsCache.put(unitStr, unitData);
|
taCmiSchemaHandler.unitsCache.put(unitStr, unitData);
|
||||||
}
|
}
|
||||||
if (unitData == TACmiSchemaHandler.NULL_MARKER) {
|
if (unitData == taCmiSchemaHandler.NULL_MARKER) {
|
||||||
// no UoM mappable - just send value
|
// no UoM mappable - just send value
|
||||||
channelType = "Number";
|
channelType = "Number";
|
||||||
unit = null;
|
unit = null;
|
||||||
state = new DecimalType(bd);
|
state = new DecimalType(bd);
|
||||||
} else if (unitData == TACmiSchemaHandler.SPECIAL_MARKER) {
|
} else if (unitData == taCmiSchemaHandler.SPECIAL_MARKER) {
|
||||||
// special handling for unknown UoM
|
// special handling for unknown UoM
|
||||||
if ("Imp".equals(unitStr)) { // Number of Pulses
|
if ("Imp".equals(unitStr)) { // Number of Pulses
|
||||||
// impulses - no idea how to map this to something useful here?
|
// impulses - no idea how to map this to something useful here?
|
||||||
|
@ -102,7 +102,7 @@ public class ChangerX2Parser extends AbstractSimpleMarkupHandler {
|
|||||||
this.optionFieldName = attributes == null ? null : attributes.get("name");
|
this.optionFieldName = attributes == null ? null : attributes.get("name");
|
||||||
} else if ((this.parserState == ParserState.INIT || this.parserState == ParserState.INPUT)
|
} else if ((this.parserState == ParserState.INIT || this.parserState == ParserState.INPUT)
|
||||||
&& "br".equals(elementName)) {
|
&& "br".equals(elementName)) {
|
||||||
return; // ignored
|
// ignored
|
||||||
} else if ((this.parserState == ParserState.INIT || this.parserState == ParserState.INPUT)
|
} else if ((this.parserState == ParserState.INIT || this.parserState == ParserState.INPUT)
|
||||||
&& "input".equals(elementName) && "changeto".equals(id)) {
|
&& "input".equals(elementName) && "changeto".equals(id)) {
|
||||||
this.parserState = ParserState.INPUT_DATA;
|
this.parserState = ParserState.INPUT_DATA;
|
||||||
@ -171,6 +171,7 @@ public class ChangerX2Parser extends AbstractSimpleMarkupHandler {
|
|||||||
}
|
}
|
||||||
this.options.put(ChangerX2Entry.TIME_PERIOD_PARTS, timeParts);
|
this.options.put(ChangerX2Entry.TIME_PERIOD_PARTS, timeParts);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
logger.warn("Error parsing options for {}: Unhandled input field in {}:{}: {}", channelName, line,
|
logger.warn("Error parsing options for {}: Unhandled input field in {}:{}: {}", channelName, line,
|
||||||
col, attributes);
|
col, attributes);
|
||||||
}
|
}
|
||||||
@ -217,7 +218,7 @@ public class ChangerX2Parser extends AbstractSimpleMarkupHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (this.parserState == ParserState.INPUT && "span".equals(elementName)) {
|
} else if (this.parserState == ParserState.INPUT && "span".equals(elementName)) {
|
||||||
return; // span's are ignored...
|
// span's are ignored...
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Error parsing options for {}: Unexpected CloseElement in {}:{}: {}", channelName, line, col,
|
logger.debug("Error parsing options for {}: Unexpected CloseElement in {}:{}: {}", channelName, line, col,
|
||||||
elementName);
|
elementName);
|
||||||
@ -274,11 +275,10 @@ public class ChangerX2Parser extends AbstractSimpleMarkupHandler {
|
|||||||
sb.append(buffer, offset, len);
|
sb.append(buffer, offset, len);
|
||||||
}
|
}
|
||||||
} else if (this.parserState == ParserState.INIT && len == 1 && buffer[offset] == '\n') {
|
} else if (this.parserState == ParserState.INIT && len == 1 && buffer[offset] == '\n') {
|
||||||
return; // single newline - ignore/drop it...
|
// single newline - ignore/drop it...
|
||||||
} else if (this.parserState == ParserState.INPUT) {
|
} else if (this.parserState == ParserState.INPUT) {
|
||||||
// this is a label next to the value input field - we currently have no use for it so
|
// this is a label next to the value input field - we currently have no use for it so
|
||||||
// it's dropped...
|
// it's dropped...
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Error parsing options for {}: Unexpected Text {}:{}: (ctx: {} len: {}) '{}' ",
|
logger.debug("Error parsing options for {}: Unexpected Text {}:{}: (ctx: {} len: {}) '{}' ",
|
||||||
this.channelName, line, col, this.parserState, len, new String(buffer, offset, len));
|
this.channelName, line, col, this.parserState, len, new String(buffer, offset, len));
|
||||||
|
@ -90,9 +90,9 @@ public class TACmiSchemaHandler extends BaseThingHandler {
|
|||||||
// this is the units lookup cache.
|
// this is the units lookup cache.
|
||||||
protected final Map<String, UnitAndType> unitsCache = new ConcurrentHashMap<>();
|
protected final Map<String, UnitAndType> unitsCache = new ConcurrentHashMap<>();
|
||||||
// marks an entry with known un-resolveable unit
|
// marks an entry with known un-resolveable unit
|
||||||
protected static final UnitAndType NULL_MARKER = new UnitAndType(Units.ONE, "");
|
protected final UnitAndType NULL_MARKER = new UnitAndType(Units.ONE, "");
|
||||||
// marks an entry with special handling - i.e. 'Imp'
|
// marks an entry with special handling - i.e. 'Imp'
|
||||||
protected static final UnitAndType SPECIAL_MARKER = new UnitAndType(Units.ONE, "s");
|
protected final UnitAndType SPECIAL_MARKER = new UnitAndType(Units.ONE, "s");
|
||||||
|
|
||||||
public TACmiSchemaHandler(final Thing thing, final HttpClient httpClient,
|
public TACmiSchemaHandler(final Thing thing, final HttpClient httpClient,
|
||||||
final TACmiChannelTypeProvider channelTypeProvider) {
|
final TACmiChannelTypeProvider channelTypeProvider) {
|
||||||
|
@ -165,7 +165,6 @@ public class HomieImplementationTest extends MqttOSGiTest {
|
|||||||
"Connection " + homieConnection.getClientId() + " not retrieving all topics ");
|
"Connection " + homieConnection.getClientId() + " not retrieving all topics ");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Disabled("https://github.com/openhab/openhab-addons/issues/12667")
|
|
||||||
@Test
|
@Test
|
||||||
public void retrieveOneAttribute() throws Exception {
|
public void retrieveOneAttribute() throws Exception {
|
||||||
WaitForTopicValue watcher = new WaitForTopicValue(homieConnection, DEVICE_TOPIC + "/$homie");
|
WaitForTopicValue watcher = new WaitForTopicValue(homieConnection, DEVICE_TOPIC + "/$homie");
|
||||||
|
@ -107,7 +107,6 @@ public class WemoMakerHandlerOSGiTest extends GenericWemoOSGiTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Disabled("https://github.com/openhab/openhab-addons/issues/12474")
|
|
||||||
public void assertThatThingHandlesREFRESHCommand()
|
public void assertThatThingHandlesREFRESHCommand()
|
||||||
throws MalformedURLException, URISyntaxException, ValidationException, IOException {
|
throws MalformedURLException, URISyntaxException, ValidationException, IOException {
|
||||||
Command command = RefreshType.REFRESH;
|
Command command = RefreshType.REFRESH;
|
||||||
|
Loading…
Reference in New Issue
Block a user