From 0853aa7ceac14fceaddda43c1d87538d2e378b75 Mon Sep 17 00:00:00 2001
From: Jan Gustafsson
+
+
zLdAyfmGv+0upD05jBfiJcO5C-2=$%Su!$R((O&aEc|1ob#l3MO5T`I1XN!^4*PhS=1&RX5JTR-srdD(2c&UzCPfG*R2 zUd=9JXR?y}rKP8qPJr@8sJ*YG;Zo_V&B?EgdJfa^xluPF1)377_W8YhY@XUVJuVm@ zxe*AePdb`aj_=2<{8~MGj 2wWfuGe;cwc5$@3-Onkt*F2rEYc*`WxBYQg#^ZgX2vzUoB$W2Tg>ki{zC+; zTxxbsE_~f%X!EeHbMjEw*rYf}9Q6a>z8n0?73H;wT=248iTl8wh|!kFjM0Vz0N@0n zb2jr#H%5-7{YmSVGt;JjDqR}&1@%$g?dSEY0TgQTh_;ixLsH+2$UxIn<|EQi&uPOx zCgaHVDgtn#0mQOlZK`VFYW+ixjva+54&^J)+WDs#t*UDw{{;6Z! 0(@`faM}?SERW}tPiNmcMpRXG)Ea;anbiMA!8VpJ{4_cN5o}XS~t>($J zlr8TyimA;gPYek=AD$UYUrNOLD$q3-cVk4MsTx@7-80}c^kRHtLu1LpzOpYss4@I? zQh35oy>?Ojp1jz8Ap)N_HU+`+L;#+~b4LpPMraxG%Nbx|FZXlr*wkosqn!0s$=H?S zVeE%08^XrbE&iht6Q0~*y|}OUwyHi^8Ar!k(S0Bq?0?KBKl4f8)d#Bw2H2x>ud1Cj zEFOThy@b-bc<@}>R6(r77>dzo7#+8sZoZcK tCme3Y~7;8ShW~Y+H3F_9g?v}#9iN+uflKS+N zN*-oi{>DOpLqs_Fp9HY(Ru(MgQ4ln(ZM&6k+CDn9s_mQ0HZgQa-%QZ{d^V?$EBa-^ zE~Q&q38DKA8_trf1p#9OgOwT6U@DZnx(2n>zUg|7s}e&mvnaNhi2q>)pv8`?thOBV zYuhmUOxQg${dA!y7KjjIXmk|p Ri2N+|SIW<=b#7eiamJZ9l{!S?m%6rp+5azE{ ^AN-fLZb5`cLxV!DQIEDQ08VCrWYdkR|sisLf$6Ug|ipptB0{ zeGVLI?a_jlgSs?TL%#pHFW 1@}y z@RV3kV-?w`kfJyxHitP)n=IeAddlUkt~eE-5wdc)6qh;S!)1fIoG}eq_E?083}b#; z!f)RcqktyzkyPvY^=`OiAD+^-@t3wH7Wsyo!V-^8BohKN@23ZYP9ztHrDR2p@~a zE94%rbOWhY?3lW&l8Pe5f@cJU?`?H_k_}&v-ke=Rsk;0YkDXj)TCjbgEsxxuZ9(r6 zQzRv)dnfhIK!KaFJHlNArwmK+XSIDA^%~L?Z{>UY-}f%zXTG7oG_{%{6^r^?Ii%5| z`HXGCn~F9#Sy1H~0J>B%et264E3GF9LHm3s`H{|GEUgY4m(?kYWWsCeFO=xj%iNfL z8|H62 CaS4iXH`g$%-kfMZ`oE$g_`@QB v2L +M4-Yd DFOJ8B_dRsre}V^yq_q2k64;rv`OHG-7LY=038IhoUO zs-P#%;&XXz%-a*8rmG#Ayw)`}G3t!rbK*)X-!gW(&70QnlanwiImyVQX^>e^E;TjQ zKmVnAJ>4`d2a?PN*kNmHYuB-GNm5Rd`}{N>YU(FRSB!F)aEU(`{mc)XR;2pMBpqXj zL`K7?WhKnp9>v?7A|a}R=rTfXCNbC@aZfiK32##*iW@wl3HKJGRrPgc>)PI&wU^o3 z_KLX%uro*GzUNoJH>!F^j<{myt?QF2iQadH(FXL|0s;a*-U&tWCESN)=Q(DY(p>RL zMsetuetk2RmN%zM^bOs9RUSMw5x~YyQEog`n7HC9$hKwC163s|aZNg)kNeX1@mY4Z z%PZI3Dwk)Kifu*Oltf1=@5UEshs5RZ7&+Yd+o`?NWTKF+LR8c(+x7+6?G(B+h-Z;( z#*EnKMN`5AHshp^5^JZZAz{gvY7MPEcoUM|+EMOwktd0z&!GtzEJf$*aK+CWI#=Rx z>I?&3)P2&$-5fqiVTcO_detj&&TK@@q8r%*Mg5QVVS#R6Uj%|sVFtkEr|_tfUf`V! zQrq4+vlYcWVq|0PU2Ml?^|>8dq|{B6aFKzkBrHS#AUZk*5Dn{h2}Jef7(~39=wKc` z24X4FJ21GGOVHmn1l8wD0x$h37u#gDvnk=~w6stk?NdrMQRy7p4% {N&>GWJRaQpBo+GIc4qNq%^9_VQBgV_qxvwLq3@VN-_Ev* zo1L&hcF~ka_V*w6e|}JZ;?_VVpNz chu z%&;SJvY;?)mPA|ht?f#E*aYAUjfcBohy6lUhkbc@btkB0>&tFd19MH%x~U(BD{iWq zM1j^w%;DaTK`xwfQ*#BRY}jN-yqc|9{wbeIh~51QWf9gCh{5K$n$caqhg!a>o*q2Y zw0)$rjNC83M8x+Bmc 0{^2sLF{ BvIQ&QPU96FJawH#FuLNA?;^3tQI*j@Kqs{#(X^~ zr?Td-clgVsFV*? d(+8j$WCRn|9|*HioCYLvQVp@`_&d4v&4Yv{`>7?#6dmNB<2fsbW|y+gc#09)6#~ zQ>t25(A)R}`XSOOBP+479CJ$NjGsL#CgbaRJK<(n8QzC{<5Z _#bv2kkOvRnApU4%~~nW@A(9rA`2sFdT;d%0L_*~jMN zpUR%g!su`jk2hx??GU}-v*DVFZm 0?1#MIWI?5WBH@-!NJ zrCB3@lY%_i{HzZunSEP|$ZG&i+NQOKHY56!(zsEFS>=}@)3Xtls `!2hZZlcl0R4HBx7A7yFAttT& zxUru(_4rzq*EbX8QtXU|(qi6CXsX;%`^**;IF*2^6C7aF!vI9Rw!lD@xWAtcAb^Mm z%mCLicZEoq1sA|HlWN;XcjpuLem7H+4A+3Mxw%95r=7?x4?miSmDHB~ bYKR`(Mq3?ShOy5gC~EQ!R~ST@ zb$u}^quWoS1fH#2IVfn N92^xL@uf#Yb{zq>c7B6N~Z~tTPn-tOR ztM?fcO`Q=L@k*MxrYmBE=2&od45{N#@DBqQkJfx&v3~j_jG+O8lORelJXs3LGzIt0 z1nz@}BJ3+N#hrtdY?uqwSn)+Z70Rh>4_>srNfYh4dY?tn)KL I4f1?CNRmJmC9#VRO7%2&@%?pkX-TV5 zK(V@7HJgP&?GS?Q%%KU_M| 6Rtn{=RHIPXLkJSTU*rCNz0 zHbO`M@52A3##bU05fgiT#7;8uG#XQWsS4Wq!>Q2lgyae1G}4Qvj&ix1bY$T6;#>Vk z9oAKxPRwFS;Z^2Hp5-SFvchVK*{zpiR2H!Y93^h9l9W+n+KZ+4!f3Ex2ozXP$K!fn zN+|j?VvW=n57aJi{{VH&6lrz{)vK2BW{PgV-p*Fluazn22=q%BN+Tj#j`7(z&5Z3E zq2;0kvl0wEqbb=6yHcb1>?Vn(YWT$cR!gi~D0~f#*iMv Xpq|IICqNd+?Lzu<`s|Ul!?MsR4#bK zEOl%>339?Up9d^jIH8}VKyN$NA~?e{@2CbhE+mF4t4zDtF>p~c*K^DDr_(w28Z|rJ zG25S+L6-~fW_u_*MW%TxTB`<3itH`{U5=q08f14PU=bxj9^Cy#2ChV4CC_(T42Hr3 zf?~B!tT=Y{$h5$)pt|=)Bvh$iRoL8BAdaC;s~OnxFBT6v=yqu&5jv5fBpdY7%j<5- zkoIiHDIrQv8{y;Zp`%$qy9r|6mS;UT`FL#G4olxH%%7%@yS`W?JcGw?dXjs7KF&oV z$NseHJ|vX8hJDO!gX+?CaK{*lZqbB1Y`4|;NFOeX9)gC}t(UQ0yc3BP%|h@k(zmXO zr|RywN3#wDjBt!wkrLgeX 9Q*)xi^HI^=q&G8~eP@TwPQCQq=m*^GC7oDYO6%)tlrtb+=rT<+epd)ms_Nil)< zV(XAzR(Typ^X(d7Er}|Kf4|EG{MBNC4~E75-@c1~42S+^NDw n z&CRs4p_Yr)7L`9P`U14+4+L_@4#EV>c3OP7lOM1Dal!o{e;032gX=^HxC8P*GhHYZ z>i=!{c(+w_l@CMcDyV`5h|TEcP#)#{+b~|?L%zoWPjTqrs}8K>ezW8#o9usr`3Unh zWt>e{PQ=8`2ztR{79reGrTq^l(c(|rl<{4C>#V4?c-xIqUYVzVQaBdh+KWHGQxbBD ztXgl6sr? q!(3{El2HBBpQ#djeBRQ7L`cijzU9~9=Iz~os?lue zYpwWj>WU+Q`xBmgok9+AE0d)ie}%54@4kPu1ow03=L+J$syc<4b8?TZxCbwW;-2|4 zt~E06CQ*qp?<#p(&JvVkL_82j?h+F?^)!jxmS 0c8j_@}=CzIUj8w>*BB zP{;bnk_|R?L``eFBI`y#XF>5IBk3)Zc^!UH%aF*jh(-cMyt23a;slE9^=mT5*8l^^ zoi&E)lf7hIN6>D%AtP> X$*9FsW`2tJ z`MFck0oPFYW^@nD%1^o#)@jY6h=d?%v-esuQb?G|sp#ZGiRg?)NZWTV2_|zSn(3EB zNE;0L6m}mdYle>Doh!z0bSu;l1O(0#wF!j 9z z=MBYov%;_r!zh*UO}*kV?HjziI?dWPw=AT_s0*-FJGf_J*pX;3ycI1BpuR<8mDHA& z+%OHP>5ISTb qylaM^y`HJ3AiTKx-xH@B;INSJXCJq(+cO+hVt{nyu2h-ob#I Izt!)M%}!8=>nDFYL7sF&4)aAeCC^-|XftkKx+!opccjF- zz+eY Sz)B)Fk zdy$NdcBd%$ {B>Q!A-BuA`vIUIZEF8emQ+JvF9hX{~tZ{S!7^Aa?=% zj%<(l5ITK3oZ?6u%`#zz&_f)T sA}IH|sNO! L?Xg8a?U6Z}j?UX^;gG*;| zMrSEB|NVDNQEghv6(7oE-@wm~U4xw0fDbZP(iV;lF6c3E?s%tq0 7DMr(cqPx8X&N{Q}hkOl!+e zv^L4D*SvzM6=?xs*u+H+ZTGd=v{_Sj(Fp;1pfdIF!Sop&`FsxwmREiyws#ENPFaGM zAVHo-;U~z5v~q!HO)W}*qXYS3NPMV%=L+p$9_K}6{#xft5jD@k{cAuxZhc=*#zN_s zT;lj;Q=*~F3q2=#XX517O^o-KnIObPCd^Vt<(a-mjv>`A?RXjHbOeJ$NEC1Bm&d~B z%qOu))F$U}Ug}aPt!TaP?NopHEiPAq+b@fN#G|U=LA@4nT)G$=kqieRbo;hc4_TiM z9)Ws`0h3g4OJc}#1icS*>+1yv>#)vGnWpi0$LKSpk6U#In-8Jv!=wqF+wBeJDQa9Y z_?}WJYC<}!@%}0^o|JI1U5(nerSCABxY^=xsj~_|@{ PE(gk32w2imNM`i*RDA9PrXto;DNB JAL>d>T*H_JAe#pA z 1! zY*P42D#Tn}Noy*&IPrVFBgQiNTQaDEJZqcz_jC|DR 6V`Eii&oh=}ID^1`->+^o^koM|I~Aq%c>QUU#ry@6tkhmpZnHQuol1_^V0 zZy<@yR%DL$`_6Pp>lvw5=DkI46d)p68>OcWg)E-~cF8a+)S_ICwZ>9PKa>L29@-6W z(vH9%D7;9J7HS}C3xS~-$yy=b*!`Gy(am(v!;9rx@QlPO-Q_YeqcS@$I(wj{O>dQ+ z{M?HEdzMN4%Q2i*r!{Uz)z0zTb DF zO65<8PJ60Hj#QN!<56-A^-#$K;-rMKR>fuyyuZ4`Ug1Zb66Kw@jPrs9)7Ohr^2?jL z&J0b>Ld{R9Sz~v3)9g&o -@B}jrV7~ z_WXKqbVwNqpGUKrsdsj1#?{F4r+$9tpq3sMkGqT=_ vgrY*T&(^SSiULN zRADR94=WJ*tWpQA@)?sYTSeM_Lz6)v?{Tjpnw)|jM9s(H`}#`cEs-bMMw2HQ;CF(1 zutbr2O#Nf1!Cc)1od_;r+Es5F0UQhiOyhjF; literal 0 HcmV?d00001 diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickBindingConstants.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickBindingConstants.java index a8690ec827..1f62da2615 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickBindingConstants.java +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickBindingConstants.java @@ -14,10 +14,7 @@ package org.openhab.binding.tellstick.internal; import static org.openhab.core.library.unit.MetricPrefix.*; -import java.util.Collections; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import javax.measure.Unit; import javax.measure.quantity.Angle; @@ -65,6 +62,7 @@ public class TellstickBindingConstants { public static final String DEVICE_ISDIMMER = "dimmer"; public static final String BRIDGE_TELLDUS_CORE = "telldus-core"; public static final String BRIDGE_TELLDUS_LIVE = "telldus-live"; + public static final String BRIDGE_TELLDUS_LOCAL = "telldus-local"; public static final String DEVICE_SENSOR = "sensor"; public static final String DEVICE_WINDSENSOR = "windsensor"; public static final String DEVICE_RAINSENSOR = "rainsensor"; @@ -82,6 +80,7 @@ public class TellstickBindingConstants { public static final ThingTypeUID TELLDUSBRIDGE_THING_TYPE = new ThingTypeUID(BINDING_ID, BRIDGE_TELLDUS_CORE); public static final ThingTypeUID TELLDUSCOREBRIDGE_THING_TYPE = new ThingTypeUID(BINDING_ID, BRIDGE_TELLDUS_CORE); public static final ThingTypeUID TELLDUSLIVEBRIDGE_THING_TYPE = new ThingTypeUID(BINDING_ID, BRIDGE_TELLDUS_LIVE); + public static final ThingTypeUID TELLDUSLOCALBRIDGE_THING_TYPE = new ThingTypeUID(BINDING_ID, BRIDGE_TELLDUS_LOCAL); // List of all Channel ids public static final String CHANNEL_DIMMER = "dimmer"; public static final String CHANNEL_STATE = "state"; @@ -97,13 +96,11 @@ public class TellstickBindingConstants { public static final String CHANNEL_AMPERE = "ampere"; public static final String CHANNEL_LUX = "lux"; - public static final Set SUPPORTED_BRIDGE_THING_TYPES_UIDS = Collections.unmodifiableSet( - Stream.of(TELLDUSCOREBRIDGE_THING_TYPE, TELLDUSLIVEBRIDGE_THING_TYPE).collect(Collectors.toSet())); - public static final Set SUPPORTED_DEVICE_THING_TYPES_UIDS = Collections - .unmodifiableSet(Stream.of(DIMMER_THING_TYPE, SWITCH_THING_TYPE, SENSOR_THING_TYPE, RAINSENSOR_THING_TYPE, - WINDSENSOR_THING_TYPE, POWERSENSOR_THING_TYPE).collect(Collectors.toSet())); - public static final Set SUPPORTED_THING_TYPES_UIDS = Collections.unmodifiableSet(Stream - .of(DIMMER_THING_TYPE, SWITCH_THING_TYPE, SENSOR_THING_TYPE, RAINSENSOR_THING_TYPE, WINDSENSOR_THING_TYPE, - POWERSENSOR_THING_TYPE, TELLDUSCOREBRIDGE_THING_TYPE, TELLDUSLIVEBRIDGE_THING_TYPE) - .collect(Collectors.toSet())); + public static final Set SUPPORTED_BRIDGE_THING_TYPES_UIDS = Set.of(TELLDUSCOREBRIDGE_THING_TYPE, + TELLDUSLIVEBRIDGE_THING_TYPE); + public static final Set SUPPORTED_DEVICE_THING_TYPES_UIDS = Set.of(DIMMER_THING_TYPE, + SWITCH_THING_TYPE, SENSOR_THING_TYPE, RAINSENSOR_THING_TYPE, WINDSENSOR_THING_TYPE, POWERSENSOR_THING_TYPE); + public static final Set SUPPORTED_THING_TYPES_UIDS = Set.of(DIMMER_THING_TYPE, SWITCH_THING_TYPE, + SENSOR_THING_TYPE, RAINSENSOR_THING_TYPE, WINDSENSOR_THING_TYPE, POWERSENSOR_THING_TYPE, + TELLDUSCOREBRIDGE_THING_TYPE, TELLDUSLIVEBRIDGE_THING_TYPE, TELLDUSLOCALBRIDGE_THING_TYPE); } diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickHandlerFactory.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickHandlerFactory.java index 3897fcee9b..266e7c8bd3 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickHandlerFactory.java +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/TellstickHandlerFactory.java @@ -16,19 +16,24 @@ import static org.openhab.binding.tellstick.internal.TellstickBindingConstants.* import java.util.Hashtable; +import org.eclipse.jetty.client.HttpClient; import org.openhab.binding.tellstick.internal.core.TelldusCoreBridgeHandler; import org.openhab.binding.tellstick.internal.discovery.TellstickDiscoveryService; import org.openhab.binding.tellstick.internal.handler.TelldusBridgeHandler; import org.openhab.binding.tellstick.internal.handler.TelldusDevicesHandler; import org.openhab.binding.tellstick.internal.live.TelldusLiveBridgeHandler; +import org.openhab.binding.tellstick.internal.local.TelldusLocalBridgeHandler; import org.openhab.core.config.discovery.DiscoveryService; +import org.openhab.core.io.net.http.HttpClientFactory; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.Thing; import org.openhab.core.thing.ThingTypeUID; import org.openhab.core.thing.binding.BaseThingHandlerFactory; import org.openhab.core.thing.binding.ThingHandler; import org.openhab.core.thing.binding.ThingHandlerFactory; +import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,11 +42,18 @@ import org.slf4j.LoggerFactory; * handlers. * * @author Jarle Hjortland - Initial contribution + * @author Jan Gustafsson - Adding support for local API */ @Component(service = ThingHandlerFactory.class, configurationPid = "binding.tellstick") public class TellstickHandlerFactory extends BaseThingHandlerFactory { private final Logger logger = LoggerFactory.getLogger(TellstickHandlerFactory.class); private TellstickDiscoveryService discoveryService = null; + private final HttpClient httpClient; + + @Activate + public TellstickHandlerFactory(@Reference HttpClientFactory httpClientFactory) { + this.httpClient = httpClientFactory.getCommonHttpClient(); + } @Override public boolean supportsThingType(ThingTypeUID thingTypeUID) { @@ -68,6 +80,10 @@ public class TellstickHandlerFactory extends BaseThingHandlerFactory { TelldusLiveBridgeHandler handler = new TelldusLiveBridgeHandler((Bridge) thing); registerDeviceDiscoveryService(handler); return handler; + } else if (thing.getThingTypeUID().equals(TELLDUSLOCALBRIDGE_THING_TYPE)) { + TelldusLocalBridgeHandler handler = new TelldusLocalBridgeHandler((Bridge) thing, httpClient); + registerDeviceDiscoveryService(handler); + return handler; } else if (supportsThingType(thing.getThingTypeUID())) { return new TelldusDevicesHandler(thing); } else { diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLiveConfiguration.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLiveConfiguration.java index 32528e7c11..e334c0b9fa 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLiveConfiguration.java +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLiveConfiguration.java @@ -14,7 +14,7 @@ package org.openhab.binding.tellstick.internal.conf; /** * Configuration class for {@link TellstickBridge} bridge used to connect to the - * Tellus Live service. + * Telldus Live service. * * @author Jarle Hjortland - Initial contribution */ diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLocalConfiguration.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLocalConfiguration.java new file mode 100644 index 0000000000..61e315ad0b --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/conf/TelldusLocalConfiguration.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.conf; + +/** + * Configuration class for {@link TellstickBridge} bridge used to connect to the + * Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TelldusLocalConfiguration { + public String ipAddress; + public String accessToken; + public long refreshInterval; +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/discovery/TellstickDiscoveryService.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/discovery/TellstickDiscoveryService.java index 424e805fdc..59ab040378 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/discovery/TellstickDiscoveryService.java +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/discovery/TellstickDiscoveryService.java @@ -22,6 +22,8 @@ import org.openhab.binding.tellstick.internal.handler.TelldusBridgeHandler; import org.openhab.binding.tellstick.internal.live.xml.LiveDataType; import org.openhab.binding.tellstick.internal.live.xml.TellstickNetDevice; import org.openhab.binding.tellstick.internal.live.xml.TellstickNetSensor; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalDeviceDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalSensorDTO; import org.openhab.core.config.discovery.AbstractDiscoveryService; import org.openhab.core.config.discovery.DiscoveryResult; import org.openhab.core.config.discovery.DiscoveryResultBuilder; @@ -141,6 +143,14 @@ public class TellstickDiscoveryService extends AbstractDiscoveryService implemen thingUID = new ThingUID(TellstickBindingConstants.SWITCH_THING_TYPE, bridge.getUID(), device.getUUId()); } + } else if (device instanceof TellstickLocalDeviceDTO) { + if ((((TellstickLocalDeviceDTO) device).getMethods() & JNA.CLibrary.TELLSTICK_DIM) > 0) { + thingUID = new ThingUID(TellstickBindingConstants.DIMMER_THING_TYPE, bridge.getUID(), + device.getUUId()); + } else { + thingUID = new ThingUID(TellstickBindingConstants.SWITCH_THING_TYPE, bridge.getUID(), + device.getUUId()); + } } break; default: @@ -163,7 +173,7 @@ public class TellstickDiscoveryService extends AbstractDiscoveryService implemen } else { sensorThingId = TellstickBindingConstants.SENSOR_THING_TYPE; } - } else { + } else if (device instanceof TellstickNetSensor) { TellstickNetSensor sensor = (TellstickNetSensor) device; if (sensor.isSensorOfType(LiveDataType.WINDAVERAGE) || sensor.isSensorOfType(LiveDataType.WINDDIRECTION) || sensor.isSensorOfType(LiveDataType.WINDGUST)) { @@ -175,6 +185,18 @@ public class TellstickDiscoveryService extends AbstractDiscoveryService implemen } else { sensorThingId = TellstickBindingConstants.SENSOR_THING_TYPE; } + } else { + TellstickLocalSensorDTO sensor = (TellstickLocalSensorDTO) device; + if (sensor.isSensorOfType(LiveDataType.WINDAVERAGE) || sensor.isSensorOfType(LiveDataType.WINDDIRECTION) + || sensor.isSensorOfType(LiveDataType.WINDGUST)) { + sensorThingId = TellstickBindingConstants.WINDSENSOR_THING_TYPE; + } else if (sensor.isSensorOfType(LiveDataType.RAINRATE) || sensor.isSensorOfType(LiveDataType.RAINTOTAL)) { + sensorThingId = TellstickBindingConstants.RAINSENSOR_THING_TYPE; + } else if (sensor.isSensorOfType(LiveDataType.WATT)) { + sensorThingId = TellstickBindingConstants.POWERSENSOR_THING_TYPE; + } else { + sensorThingId = TellstickBindingConstants.SENSOR_THING_TYPE; + } } return sensorThingId; } diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/handler/TelldusDevicesHandler.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/handler/TelldusDevicesHandler.java index b46412e426..e1b57874cc 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/handler/TelldusDevicesHandler.java +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/handler/TelldusDevicesHandler.java @@ -23,12 +23,16 @@ import org.openhab.binding.tellstick.internal.TellstickBindingConstants; import org.openhab.binding.tellstick.internal.live.xml.DataTypeValue; import org.openhab.binding.tellstick.internal.live.xml.TellstickNetSensor; import org.openhab.binding.tellstick.internal.live.xml.TellstickNetSensorEvent; +import org.openhab.binding.tellstick.internal.local.dto.LocalDataTypeValueDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalSensorDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalSensorEventDTO; import org.openhab.core.config.core.Configuration; import org.openhab.core.library.types.DateTimeType; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.PercentType; import org.openhab.core.library.types.QuantityType; import org.openhab.core.library.unit.SIUnits; +import org.openhab.core.library.unit.Units; import org.openhab.core.thing.Bridge; import org.openhab.core.thing.ChannelUID; import org.openhab.core.thing.Thing; @@ -109,9 +113,15 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta return; } if (command instanceof RefreshType) { - getBridge().getHandler().handleCommand(channelUID, command); - refreshDevice(dev); - return; + Bridge bridge = getBridge(); + if (bridge != null) { + TelldusBridgeHandler localBridgeHandler = (TelldusBridgeHandler) bridge.getHandler(); + if (localBridgeHandler != null) { + localBridgeHandler.handleCommand(channelUID, command); + refreshDevice(dev); + return; + } + } } if (channelUID.getId().equals(CHANNEL_DIMMER) || channelUID.getId().equals(CHANNEL_STATE)) { try { @@ -123,9 +133,6 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta } catch (TellstickException e) { logger.debug("Failed to send command to tellstick", e); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); - } catch (Exception e) { - logger.error("Failed to send command to tellstick", e); - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); } } else { logger.warn("Setting of channel {} not possible. Read-only", channelUID); @@ -159,8 +166,9 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta if (repeatCount != null) { resend = repeatCount.intValue(); } - if (getBridge() != null) { - bridgeStatusChanged(getBridge().getStatusInfo()); + Bridge bridge = getBridge(); + if (bridge != null) { + bridgeStatusChanged(bridge.getStatusInfo()); } } @@ -169,31 +177,34 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta logger.debug("device: {} bridgeStatusChanged: {}", deviceId, bridgeStatusInfo); if (bridgeStatusInfo.getStatus() == ThingStatus.ONLINE) { try { - TelldusBridgeHandler tellHandler = (TelldusBridgeHandler) getBridge().getHandler(); - logger.debug("Init bridge for {}, bridge:{}", deviceId, tellHandler); - if (tellHandler != null) { - this.bridgeHandler = tellHandler; - this.bridgeHandler.registerDeviceStatusListener(this); - Configuration config = editConfiguration(); - Device dev = getDevice(tellHandler, deviceId); - if (dev != null) { - if (dev.getName() != null) { - config.put(TellstickBindingConstants.DEVICE_NAME, dev.getName()); - } - if (dev.getProtocol() != null) { - config.put(TellstickBindingConstants.DEVICE_PROTOCOL, dev.getProtocol()); - } - if (dev.getModel() != null) { - config.put(TellstickBindingConstants.DEVICE_MODEL, dev.getModel()); - } - updateConfiguration(config); + Bridge localBridge = getBridge(); + if (localBridge != null) { + TelldusBridgeHandler telldusBridgeHandler = (TelldusBridgeHandler) localBridge.getHandler(); + logger.debug("Init bridge for {}, bridge:{}", deviceId, telldusBridgeHandler); + if (telldusBridgeHandler != null) { + this.bridgeHandler = telldusBridgeHandler; + this.bridgeHandler.registerDeviceStatusListener(this); + Configuration config = editConfiguration(); + Device dev = getDevice(telldusBridgeHandler, deviceId); + if (dev != null) { + if (dev.getName() != null) { + config.put(TellstickBindingConstants.DEVICE_NAME, dev.getName()); + } + if (dev.getProtocol() != null) { + config.put(TellstickBindingConstants.DEVICE_PROTOCOL, dev.getProtocol()); + } + if (dev.getModel() != null) { + config.put(TellstickBindingConstants.DEVICE_MODEL, dev.getModel()); + } + updateConfiguration(config); - updateStatus(ThingStatus.ONLINE); - } else { - logger.warn( - "Could not find {}, please make sure it is defined and that telldus service is running", - deviceId); - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR); + updateStatus(ThingStatus.ONLINE); + } else { + logger.warn( + "Could not find {}, please make sure it is defined and that telldus service is running", + deviceId); + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR); + } } } } catch (Exception e) { @@ -240,6 +251,10 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta for (DataTypeValue type : ((TellstickNetSensor) dev).getData()) { updateSensorDataState(type); } + } else if (dev instanceof TellstickLocalSensorDTO) { + for (LocalDataTypeValueDTO type : ((TellstickLocalSensorDTO) dev).getData()) { + updateSensorDataState(type); + } } } @@ -260,6 +275,9 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta } else if (event instanceof TellstickNetSensorEvent) { TellstickNetSensorEvent sensorevent = (TellstickNetSensorEvent) event; updateSensorDataState(sensorevent.getDataTypeValue()); + } else if (event instanceof TellstickLocalSensorEventDTO) { + TellstickLocalSensorEventDTO sensorevent = (TellstickLocalSensorEventDTO) event; + updateSensorDataState(sensorevent.getDataTypeValue()); } else if (event instanceof TellstickSensorEvent) { TellstickSensorEvent sensorevent = (TellstickSensorEvent) event; updateSensorDataState(sensorevent.getDataType(), sensorevent.getData()); @@ -340,6 +358,46 @@ public class TelldusDevicesHandler extends BaseThingHandler implements DeviceSta } } + private void updateSensorDataState(LocalDataTypeValueDTO dataType) { + switch (dataType.getName()) { + case HUMIDITY: + updateState(humidityChannel, new QuantityType<>(new BigDecimal(dataType.getValue()), HUMIDITY_UNIT)); + break; + case TEMPERATURE: + updateState(tempChannel, new QuantityType<>(new BigDecimal(dataType.getValue()), SIUnits.CELSIUS)); + break; + case RAINRATE: + updateState(rainRateChannel, new QuantityType<>(new BigDecimal(dataType.getValue()), RAIN_UNIT)); + break; + case RAINTOTAL: + updateState(raintTotChannel, new QuantityType<>(new BigDecimal(dataType.getValue()), RAIN_UNIT)); + break; + case WINDAVERAGE: + updateState(windAverageChannel, + new QuantityType<>(new BigDecimal(dataType.getValue()), WIND_SPEED_UNIT_MS)); + break; + case WINDDIRECTION: + updateState(windDirectionChannel, + new QuantityType<>(new BigDecimal(dataType.getValue()), WIND_DIRECTION_UNIT)); + break; + case WINDGUST: + updateState(windGuestChannel, + new QuantityType<>(new BigDecimal(dataType.getValue()), WIND_SPEED_UNIT_MS)); + break; + case WATT: + if (dataType.getScale() == 5) { + updateState(ampereChannel, new QuantityType<>(new BigDecimal(dataType.getValue()), ELECTRIC_UNIT)); + } else if (dataType.getScale() == 2) { + updateState(wattChannel, new QuantityType<>(new BigDecimal(dataType.getValue()), Units.WATT)); + } + break; + case LUMINATION: + updateState(luxChannel, new QuantityType<>(new DecimalType(dataType.getValue()), LUX_UNIT)); + break; + default: + } + } + private void updateDeviceState(Device device) { if (device != null) { logger.debug("Updating state of {} {} ({}) id: {}", device.getDeviceType(), device.getName(), diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/live/xml/LiveDataType.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/live/xml/LiveDataType.java index 67dd3f95c9..9340acf113 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/live/xml/LiveDataType.java +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/live/xml/LiveDataType.java @@ -20,11 +20,11 @@ package org.openhab.binding.tellstick.internal.live.xml; public enum LiveDataType { HUMIDITY("humidity"), TEMPERATURE("temp"), - WINDAVERAGE("windaverage"), - WINDDIRECTION("winddirection"), - WINDGUST("windgust"), - RAINRATE("rainrate"), - RAINTOTAL("rainttotal"), + WINDAVERAGE("wavg"), + WINDDIRECTION("wdir"), + WINDGUST("wgust"), + RAINRATE("rrate"), + RAINTOTAL("rtot"), WATT("watt"), LUMINATION("lum"), UNKOWN("unkown"); diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalBridgeHandler.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalBridgeHandler.java new file mode 100644 index 0000000000..d1a7dd4a09 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalBridgeHandler.java @@ -0,0 +1,290 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.eclipse.jetty.client.HttpClient; +import org.openhab.binding.tellstick.internal.conf.TelldusLocalConfiguration; +import org.openhab.binding.tellstick.internal.handler.DeviceStatusListener; +import org.openhab.binding.tellstick.internal.handler.TelldusBridgeHandler; +import org.openhab.binding.tellstick.internal.handler.TelldusDeviceController; +import org.openhab.binding.tellstick.internal.handler.TelldusDevicesHandler; +import org.openhab.binding.tellstick.internal.local.dto.LocalDataTypeValueDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalDeviceDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalDevicesDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalSensorDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalSensorEventDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalSensorsDTO; +import org.openhab.core.cache.ExpiringCache; +import org.openhab.core.thing.Bridge; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.thing.ThingStatus; +import org.openhab.core.thing.ThingStatusDetail; +import org.openhab.core.thing.binding.BaseBridgeHandler; +import org.openhab.core.types.Command; +import org.openhab.core.types.RefreshType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tellstick.device.TellstickDeviceEvent; +import org.tellstick.device.TellstickException; +import org.tellstick.device.iface.Device; + +/** + * {@link TelldusLocalBridgeHandler} is the handler for Telldus Local API (Tellstick ZNET v1/v2) and connects it + * to the framework. All {@link TelldusDevicesHandler}s use the + * {@link TelldusLocalDeviceController} to execute the actual commands. + * + * @author Jan Gustafsson- Initial contribution + */ +public class TelldusLocalBridgeHandler extends BaseBridgeHandler implements TelldusBridgeHandler { + + private final Logger logger = LoggerFactory.getLogger(TelldusLocalBridgeHandler.class); + + private TellstickLocalDevicesDTO deviceList = null; + private TellstickLocalSensorsDTO sensorList = null; + private TelldusLocalDeviceController controller = null; + private List deviceStatusListeners = Collections.synchronizedList(new ArrayList<>()); + private final HttpClient httpClient; + private ScheduledFuture> pollingJob; + /** + * Use cache for refresh command to not update again when call is made within 10 seconds of previous call. + */ + private final ExpiringCache refreshCache = new ExpiringCache<>(Duration.ofSeconds(10), + this::refreshDeviceList); + + public TelldusLocalBridgeHandler(Bridge bridge, HttpClient httpClient) { + super(bridge); + this.httpClient = httpClient; + } + + @Override + public void initialize() { + TelldusLocalConfiguration configuration = getConfigAs(TelldusLocalConfiguration.class); + this.controller = new TelldusLocalDeviceController(configuration, httpClient); + pollingJob = scheduler.scheduleWithFixedDelay(this::refreshDeviceList, 11, configuration.refreshInterval, + TimeUnit.MILLISECONDS); + updateStatus(ThingStatus.UNKNOWN); + } + + @Override + public void dispose() { + if (pollingJob != null) { + pollingJob.cancel(true); + } + if (this.controller != null) { + this.controller.dispose(); + } + deviceList = null; + sensorList = null; + super.dispose(); + } + + private boolean refreshDeviceList() { + try { + updateDevices(deviceList); + updateSensors(sensorList); + updateStatus(ThingStatus.ONLINE); + return true; + } catch (TellstickException | InterruptedException e) { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, e.getMessage()); + } + return false; + } + + private synchronized void updateDevices(TellstickLocalDevicesDTO previouslist) + throws TellstickException, InterruptedException { + TellstickLocalDevicesDTO newList = controller + .callRestMethod(TelldusLocalDeviceController.HTTP_LOCAL_API_DEVICES, TellstickLocalDevicesDTO.class); + logger.debug("Device list {}", newList.getDevices()); + if (newList.getDevices() != null) { + if (previouslist == null) { + for (TellstickLocalDeviceDTO device : newList.getDevices()) { + device.setUpdated(true); + synchronized (deviceStatusListeners) { + for (DeviceStatusListener listener : deviceStatusListeners) { + listener.onDeviceAdded(getThing(), device); + } + } + } + this.deviceList = newList; + } else { + for (TellstickLocalDeviceDTO device : newList.getDevices()) { + int index = previouslist.getDevices().indexOf(device); + logger.debug("Device:{} found at {}", device, index); + if (index >= 0) { + TellstickLocalDeviceDTO orgDevice = previouslist.getDevices().get(index); + if (device.getState() != orgDevice.getState()) { + orgDevice.setState(device.getState()); + orgDevice.setStatevalue(device.getStatevalue()); + orgDevice.setUpdated(true); + } + } else { + logger.debug("New Device - Adding:{}", device); + previouslist.getDevices().add(device); + device.setUpdated(true); + synchronized (deviceStatusListeners) { + for (DeviceStatusListener listener : deviceStatusListeners) { + listener.onDeviceAdded(getThing(), device); + } + } + } + } + } + + for (TellstickLocalDeviceDTO device : deviceList.getDevices()) { + if (device.isUpdated()) { + synchronized (deviceStatusListeners) { + for (DeviceStatusListener listener : deviceStatusListeners) { + listener.onDeviceStateChanged(getThing(), device, + new TellstickDeviceEvent(device, null, null, null, System.currentTimeMillis())); + } + } + device.setUpdated(false); + } + } + } + } + + private synchronized void updateSensors(TellstickLocalSensorsDTO previouslist) + throws TellstickException, InterruptedException { + TellstickLocalSensorsDTO newList = controller + .callRestMethod(TelldusLocalDeviceController.HTTP_LOCAL_API_SENSORS, TellstickLocalSensorsDTO.class); + logger.debug("Updated sensors:{}", newList.getSensors()); + if (newList.getSensors() != null) { + if (previouslist == null) { + this.sensorList = newList; + for (TellstickLocalSensorDTO sensor : sensorList.getSensors()) { + sensor.setUpdated(true); + synchronized (deviceStatusListeners) { + for (DeviceStatusListener listener : deviceStatusListeners) { + listener.onDeviceAdded(getThing(), sensor); + } + } + } + } else { + for (TellstickLocalSensorDTO sensor : previouslist.getSensors()) { + sensor.setUpdated(false); + } + + for (TellstickLocalSensorDTO sensor : newList.getSensors()) { + int index = this.sensorList.getSensors().indexOf(sensor); + if (index >= 0) { + TellstickLocalSensorDTO orgSensor = this.sensorList.getSensors().get(index); + orgSensor.setData(sensor.getData()); + orgSensor.setUpdated(true); + sensor.setUpdated(true); + } else { + this.sensorList.getSensors().add(sensor); + sensor.setUpdated(true); + synchronized (deviceStatusListeners) { + for (DeviceStatusListener listener : deviceStatusListeners) { + listener.onDeviceAdded(getThing(), sensor); + } + } + } + } + } + for (TellstickLocalSensorDTO sensor : sensorList.getSensors()) { + if (sensor.getData() != null && sensor.isUpdated()) { + synchronized (deviceStatusListeners) { + for (DeviceStatusListener listener : deviceStatusListeners) { + for (LocalDataTypeValueDTO type : sensor.getData()) { + listener.onDeviceStateChanged(getThing(), sensor, + new TellstickLocalSensorEventDTO(sensor.getId(), type.getValue(), type, + sensor.getProtocol(), sensor.getModel(), System.currentTimeMillis())); + } + } + } + sensor.setUpdated(false); + } + } + } + } + + @Override + public void handleCommand(ChannelUID channelUID, Command command) { + if (command instanceof RefreshType) { + refreshCache.getValue(); + } + } + + @Override + public boolean registerDeviceStatusListener(DeviceStatusListener deviceStatusListener) { + if (deviceStatusListener == null) { + throw new IllegalArgumentException("It's not allowed to pass a null deviceStatusListener."); + } + return deviceStatusListeners.add(deviceStatusListener); + } + + @Override + public boolean unregisterDeviceStatusListener(DeviceStatusListener deviceStatusListener) { + return deviceStatusListeners.remove(deviceStatusListener); + } + + private Device getDevice(String id, List devices) { + for (Device device : devices) { + if (device.getId() == Integer.valueOf(id)) { + return device; + } + } + return null; + } + + private Device getSensor(String id, List sensors) { + for (Device sensor : sensors) { + if (sensor.getId() == Integer.valueOf(id)) { + return sensor; + } + } + return null; + } + + @Override + public Device getDevice(String serialNumber) { + return getDevice(serialNumber, getDevices()); + } + + private List getDevices() { + if (deviceList == null) { + refreshDeviceList(); + } + return deviceList.getDevices(); + } + + @Override + public Device getSensor(String deviceUUId) { + Device result = null; + if (sensorList != null) { + result = getSensor(deviceUUId, sensorList.getSensors()); + } + return result; + } + + @Override + public void rescanTelldusDevices() { + this.deviceList = null; + this.sensorList = null; + refreshDeviceList(); + } + + @Override + public TelldusDeviceController getController() { + return controller; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalDeviceController.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalDeviceController.java new file mode 100644 index 0000000000..425f76e29a --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalDeviceController.java @@ -0,0 +1,282 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local; + +import java.math.BigDecimal; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.api.ContentResponse; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.http.HttpMethod; +import org.openhab.binding.tellstick.internal.TelldusBindingException; +import org.openhab.binding.tellstick.internal.conf.TelldusLocalConfiguration; +import org.openhab.binding.tellstick.internal.handler.TelldusDeviceController; +import org.openhab.binding.tellstick.internal.local.dto.TelldusLocalResponseDTO; +import org.openhab.binding.tellstick.internal.local.dto.TellstickLocalDeviceDTO; +import org.openhab.core.library.types.IncreaseDecreaseType; +import org.openhab.core.library.types.OnOffType; +import org.openhab.core.library.types.PercentType; +import org.openhab.core.types.Command; +import org.openhab.core.types.State; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.tellstick.JNA; +import org.tellstick.device.TellstickDevice; +import org.tellstick.device.TellstickDeviceEvent; +import org.tellstick.device.TellstickException; +import org.tellstick.device.TellstickSensorEvent; +import org.tellstick.device.iface.Device; +import org.tellstick.device.iface.DeviceChangeListener; +import org.tellstick.device.iface.SensorListener; +import org.tellstick.device.iface.SwitchableDevice; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +/** + * {@link TelldusLocalDeviceController} handles the communication with Telldus Local API (Tellstick ZNET v1/v2) + * This controller uses JSON based Rest API to communicate with Telldus Local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TelldusLocalDeviceController implements DeviceChangeListener, SensorListener, TelldusDeviceController { + private final Logger logger = LoggerFactory.getLogger(TelldusLocalDeviceController.class); + private long lastSend = 0; + public static final long DEFAULT_INTERVAL_BETWEEN_SEND_SEC = 250; + static final int REQUEST_TIMEOUT_MS = 5000; + private final HttpClient httpClient; + private final Gson gson = new Gson(); + private String localApiUrl; + private String authorizationHeader = "Bearer "; + static final String HTTP_LOCAL_API = "api/"; + static final String HTTP_LOCAL_API_DEVICES = HTTP_LOCAL_API + "devices/list?supportedMethods=19&includeIgnored=0"; + static final String HTTP_LOCAL_API_SENSORS = HTTP_LOCAL_API + + "sensors/list?includeValues=1&includeScale=1&includeUnit=1&includeIgnored=0"; + static final String HTTP_LOCAL_API_SENSOR_INFO = HTTP_LOCAL_API + "sensor/info"; + static final String HTTP_LOCAL_API_DEVICE_DIM = HTTP_LOCAL_API + "device/dim?id=%d&level=%d"; + static final String HTTP_LOCAL_API_DEVICE_TURNOFF = HTTP_LOCAL_API + "device/turnOff?id=%d"; + static final String HTTP_LOCAL_DEVICE_TURNON = HTTP_LOCAL_API + "device/turnOn?id=%d"; + private static final int MAX_RETRIES = 3; + + public TelldusLocalDeviceController(TelldusLocalConfiguration configuration, HttpClient httpClient) { + this.httpClient = httpClient; + localApiUrl = "http://" + configuration.ipAddress + "/"; + authorizationHeader = authorizationHeader + configuration.accessToken; + } + + @Override + public void dispose() { + } + + @Override + public void handleSendEvent(Device device, int resendCount, boolean isdimmer, Command command) + throws TellstickException { + logger.debug("Send {} to {}", command, device); + try { + if (device instanceof TellstickLocalDeviceDTO) { + if (command == OnOffType.ON) { + turnOn(device); + } else if (command == OnOffType.OFF) { + turnOff(device); + } else if (command instanceof PercentType) { + dim(device, (PercentType) command); + } else if (command instanceof IncreaseDecreaseType) { + increaseDecrease(device, ((IncreaseDecreaseType) command)); + } + } else if (device instanceof SwitchableDevice) { + if (command == OnOffType.ON) { + if (isdimmer) { + logger.trace("Turn off first in case it is allready on"); + turnOff(device); + } + turnOn(device); + } else if (command == OnOffType.OFF) { + turnOff(device); + } + } else { + logger.warn("Cannot send to {}", device); + } + } catch (InterruptedException e) { + logger.debug("OH is shut-down."); + } + } + + private void increaseDecrease(Device dev, IncreaseDecreaseType increaseDecreaseType) + throws TellstickException, InterruptedException { + String strValue = ((TellstickDevice) dev).getData(); + double value = 0; + if (strValue != null) { + value = Double.valueOf(strValue); + } + int percent = (int) Math.round((value / 255) * 100); + if (IncreaseDecreaseType.INCREASE == increaseDecreaseType) { + percent = Math.min(percent + 10, 100); + } else if (IncreaseDecreaseType.DECREASE == increaseDecreaseType) { + percent = Math.max(percent - 10, 0); + } + dim(dev, new PercentType(percent)); + } + + private void dim(Device dev, PercentType command) throws TellstickException, InterruptedException { + double value = command.doubleValue(); + + // 0 means OFF and 100 means ON + if (value == 0 && dev instanceof TellstickLocalDeviceDTO) { + turnOff(dev); + } else if (value == 100 && dev instanceof TellstickLocalDeviceDTO) { + turnOn(dev); + } else if (dev instanceof TellstickLocalDeviceDTO + && (((TellstickLocalDeviceDTO) dev).getMethods() & JNA.CLibrary.TELLSTICK_DIM) > 0) { + long tdVal = Math.round((value / 100) * 255); + TelldusLocalResponseDTO response = callRestMethod( + String.format(HTTP_LOCAL_API_DEVICE_DIM, dev.getId(), tdVal), TelldusLocalResponseDTO.class); + handleResponse((TellstickLocalDeviceDTO) dev, response); + } else { + throw new TelldusBindingException("Cannot send DIM to " + dev); + } + } + + private void turnOff(Device dev) throws TellstickException, InterruptedException { + if (dev instanceof TellstickLocalDeviceDTO) { + TelldusLocalResponseDTO response = callRestMethod(String.format(HTTP_LOCAL_API_DEVICE_TURNOFF, dev.getId()), + TelldusLocalResponseDTO.class); + handleResponse((TellstickLocalDeviceDTO) dev, response); + } else { + throw new TelldusBindingException("Cannot send OFF to " + dev); + } + } + + private void handleResponse(TellstickLocalDeviceDTO device, TelldusLocalResponseDTO response) + throws TellstickException { + if (response == null || (response.getStatus() == null && response.getError() == null)) { + throw new TelldusBindingException("No response " + response); + } else if (response.getError() != null) { + device.setUpdated(true); + throw new TelldusBindingException("Error " + response.getError()); + } else if (!response.getStatus().trim().equals("success")) { + throw new TelldusBindingException("Response " + response.getStatus()); + } + } + + private void turnOn(Device dev) throws TellstickException, InterruptedException { + if (dev instanceof TellstickLocalDeviceDTO) { + TelldusLocalResponseDTO response = callRestMethod(String.format(HTTP_LOCAL_DEVICE_TURNON, dev.getId()), + TelldusLocalResponseDTO.class); + handleResponse((TellstickLocalDeviceDTO) dev, response); + } else { + throw new TelldusBindingException("Cannot send ON to " + dev); + } + } + + @Override + public State calcState(Device dev) { + TellstickLocalDeviceDTO device = (TellstickLocalDeviceDTO) dev; + State st = null; + + switch (device.getState()) { + case JNA.CLibrary.TELLSTICK_TURNON: + st = OnOffType.ON; + break; + case JNA.CLibrary.TELLSTICK_TURNOFF: + st = OnOffType.OFF; + break; + case JNA.CLibrary.TELLSTICK_DIM: + BigDecimal dimValue = new BigDecimal(device.getStatevalue()); + if (dimValue.intValue() == 0) { + st = OnOffType.OFF; + } else if (dimValue.intValue() >= 255) { + st = OnOffType.ON; + } else { + st = OnOffType.ON; + } + break; + default: + logger.warn("Could not handle {} for {}", device.getState(), device); + } + + return st; + } + + @Override + public BigDecimal calcDimValue(Device device) { + BigDecimal dimValue = BigDecimal.ZERO; + switch (((TellstickLocalDeviceDTO) device).getState()) { + case JNA.CLibrary.TELLSTICK_TURNON: + dimValue = new BigDecimal(100); + break; + case JNA.CLibrary.TELLSTICK_TURNOFF: + break; + case JNA.CLibrary.TELLSTICK_DIM: + dimValue = new BigDecimal(((TellstickLocalDeviceDTO) device).getStatevalue()); + dimValue = dimValue.multiply(new BigDecimal(100)); + dimValue = dimValue.divide(new BigDecimal(255), 0, BigDecimal.ROUND_HALF_UP); + break; + default: + logger.warn("Could not handle {} for {}", (((TellstickLocalDeviceDTO) device).getState()), device); + } + return dimValue; + } + + public long getLastSend() { + return lastSend; + } + + public void setLastSend(long currentTimeMillis) { + lastSend = currentTimeMillis; + } + + @Override + public void onRequest(TellstickSensorEvent newDevices) { + setLastSend(newDevices.getTimestamp()); + } + + @Override + public void onRequest(TellstickDeviceEvent newDevices) { + setLastSend(newDevices.getTimestamp()); + } + + T callRestMethod(String uri, Class response) throws TelldusLocalException, InterruptedException { + T resultObj = null; + try { + for (int i = 0; i < MAX_RETRIES; i++) { + try { + resultObj = innerCallRest(localApiUrl + uri, response); + break; + } catch (TimeoutException e) { + logger.warn("TimeoutException error in get"); + } + } + } catch (JsonSyntaxException e) { + throw new TelldusLocalException(e); + } catch (ExecutionException e) { + throw new TelldusLocalException(e); + } + return resultObj; + } + + private T innerCallRest(String uri, Class json) + throws ExecutionException, InterruptedException, TimeoutException, JsonSyntaxException { + logger.trace("HTTP GET: {}", uri); + + Request request = httpClient.newRequest(uri).method(HttpMethod.GET); + request.header("Authorization", authorizationHeader); + + ContentResponse response = request.send(); + String content = response.getContentAsString(); + logger.trace("API response: {}", content); + + return gson.fromJson(content, json); + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalException.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalException.java new file mode 100644 index 0000000000..f9da540621 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/TelldusLocalException.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.tellstick.device.TellstickException; + +/** + * {@link TelldusLocalException} is used when there is exception communicating with Telldus local API. + * This exception extends the Telldus Core exception. + * + * @author Jan Gustafsson - Initial contribution + */ +@NonNullByDefault +public class TelldusLocalException extends TellstickException { + + public TelldusLocalException(Exception source) { + super(null, 0); + this.initCause(source); + } + + private static final long serialVersionUID = 3067179547449454711L; + + @Override + public @NonNull String getMessage() { + Throwable throwable = getCause(); + if (throwable != null) { + String localMessage = throwable.getMessage(); + if (localMessage != null) { + return localMessage; + } + } + return ""; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/LocalDataTypeValueDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/LocalDataTypeValueDTO.java new file mode 100644 index 0000000000..63bab55c26 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/LocalDataTypeValueDTO.java @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +import org.openhab.binding.tellstick.internal.live.xml.LiveDataType; + +/** + * Class used to deserialize JSON from Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class LocalDataTypeValueDTO { + + private String name; + private int scale; + private String value; + + public LiveDataType getName() { + return LiveDataType.fromName(name); + } + + public void setName(String name) { + this.name = name; + } + + public int getScale() { + return scale; + } + + public void setScale(int scale) { + this.scale = scale; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TelldusLocalResponseDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TelldusLocalResponseDTO.java new file mode 100644 index 0000000000..9f6d7726bd --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TelldusLocalResponseDTO.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +/** + * Class used to deserialize JSON from Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TelldusLocalResponseDTO { + + private String error; + private String status; + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalDeviceDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalDeviceDTO.java new file mode 100644 index 0000000000..7289dcd999 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalDeviceDTO.java @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +import org.tellstick.device.iface.Device; +import org.tellstick.enums.DeviceType; + +import com.google.gson.annotations.SerializedName; + +/** + * Class used to deserialize JSON from Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TellstickLocalDeviceDTO implements Device { + + @SerializedName("id") + private int deviceId; + private int methods; + private String name; + private int state; + private String statevalue; + private String type; + private String protocol; + private String model; + private boolean updated; + + public void setUpdated(boolean b) { + this.updated = b; + } + + public boolean isUpdated() { + return updated; + } + + @Override + public int getId() { + return deviceId; + } + + public void setId(int deviceId) { + this.deviceId = deviceId; + } + + public int getMethods() { + return methods; + } + + public void setMethods(int methods) { + this.methods = methods; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getUUId() { + return Integer.toString(deviceId); + } + + @Override + public String getProtocol() { + return protocol; + } + + @Override + public String getModel() { + return model; + } + + @Override + public DeviceType getDeviceType() { + return DeviceType.DEVICE; + } + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + + public String getStatevalue() { + return statevalue; + } + + public void setStatevalue(String statevalue) { + this.statevalue = statevalue; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalDevicesDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalDevicesDTO.java new file mode 100644 index 0000000000..275768de13 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalDevicesDTO.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; + +/** + * Class used to deserialize JSON from Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TellstickLocalDevicesDTO { + + @SerializedName("device") + private List devices = null; + + public List getDevices() { + return devices; + } + + public void setDevices(List devices) { + this.devices = devices; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorDTO.java new file mode 100644 index 0000000000..f8087fb928 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorDTO.java @@ -0,0 +1,130 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +import java.util.List; + +import org.openhab.binding.tellstick.internal.live.xml.LiveDataType; +import org.tellstick.device.iface.Device; +import org.tellstick.enums.DeviceType; + +import com.google.gson.annotations.SerializedName; + +/** + * Class used to deserialize JSON from Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TellstickLocalSensorDTO implements Device { + + private int battery; + private boolean updated; + private List data = null; + @SerializedName("id") + private int deviceId; + private String model; + private String name; + private String protocol; + private int sensorId; + + public int getBattery() { + return battery; + } + + public void setBattery(int battery) { + this.battery = battery; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + @Override + public int getId() { + return deviceId; + } + + public void setId(int id) { + this.deviceId = id; + } + + @Override + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getProtocol() { + return protocol; + } + + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + public void setUpdated(boolean b) { + this.updated = b; + } + + public boolean isUpdated() { + return updated; + } + + public boolean isSensorOfType(LiveDataType type) { + boolean res = false; + if (data != null) { + for (LocalDataTypeValueDTO val : data) { + if (val.getName() == type) { + res = true; + break; + } + } + } + return res; + } + + @Override + public DeviceType getDeviceType() { + return DeviceType.SENSOR; + } + + public int getSensorId() { + return sensorId; + } + + public void setSensorId(int sensorId) { + this.sensorId = sensorId; + } + + @Override + public String getUUId() { + return Integer.toString(deviceId); + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorEventDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorEventDTO.java new file mode 100644 index 0000000000..39e6744e9e --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorEventDTO.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +import org.openhab.binding.tellstick.internal.TellstickRuntimeException; +import org.tellstick.device.TellstickSensorEvent; +import org.tellstick.device.iface.TellstickEvent; +import org.tellstick.enums.DataType; + +/** + * This class is used for events for the telldus live sensors. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TellstickLocalSensorEventDTO extends TellstickSensorEvent implements TellstickEvent { + + private LocalDataTypeValueDTO dataType; + + public TellstickLocalSensorEventDTO(int sensorId, String data, LocalDataTypeValueDTO dataValue, String protocol, + String model, long timeStamp) { + super(sensorId, data, null, protocol, model, timeStamp); + this.dataType = dataValue; + } + + public LocalDataTypeValueDTO getDataTypeValue() { + return dataType; + } + + @Override + public DataType getDataType() { + throw new TellstickRuntimeException("Should not call this method"); + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorsDTO.java b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorsDTO.java new file mode 100644 index 0000000000..ff6e64f960 --- /dev/null +++ b/bundles/org.openhab.binding.tellstick/src/main/java/org/openhab/binding/tellstick/internal/local/dto/TellstickLocalSensorsDTO.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.tellstick.internal.local.dto; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; + +/** + * Class used to deserialize JSON from Telldus local API. + * + * @author Jan Gustafsson - Initial contribution + */ +public class TellstickLocalSensorsDTO { + + @SerializedName("sensor") + private List sensors = null; + + public List getSensors() { + return sensors; + } + + public void setSensors(List sensors) { + this.sensors = sensors; + } +} diff --git a/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/bridge.xml b/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/bridge.xml index da1ca16a0d..11f8e2b091 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/bridge.xml +++ b/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/bridge.xml @@ -6,7 +6,7 @@ - This bridge represents the telldus center on a local computer. +This bridge represents the Telldus center on a local computer. @@ -25,7 +25,7 @@ - +This bridge represents the telldus live cloud service. +This bridge represents the Telldus live cloud service. @@ -34,12 +34,10 @@ The private key from telldus - credentials The public key from telldus - @@ -48,7 +46,7 @@credentials The openauth token. The openauth token secret. -+ The refresh interval in ms which is used to poll Telldus Live. @@ -57,4 +55,27 @@+ + diff --git a/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/devices.xml b/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/devices.xml index 3e2fa9f1bc..f51e8f2d9d 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/devices.xml +++ b/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/devices.xml @@ -9,6 +9,7 @@This bridge represents the Telldus local API. + ++ + ++ + +The local IP address of the Tellstick. +network-address ++ + +The access token. ++ + +The refresh interval in ms which is used to poll Telldus local API. + +60000 +diff --git a/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/sensor.xml b/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/sensor.xml index 4a598a4324..5e1820371b 100644 --- a/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/sensor.xml +++ b/bundles/org.openhab.binding.tellstick/src/main/resources/OH-INF/thing/sensor.xml @@ -8,6 +8,7 @@ + @@ -91,14 +92,14 @@ + Number:Length The current rain rate -+ @@ -126,9 +127,9 @@ Number:Length Total rain -+ -- 2.47.3 Number:Power - -Current kWatt -+ + Current power +