From 1b90467bd4f8177b1ff1d46bc87017a621f104ae Mon Sep 17 00:00:00 2001 From: jsjames Date: Thu, 20 Feb 2025 09:32:03 -0800 Subject: [PATCH] [juicenet] Remove Juicenet binding due to drop of public API (#18299) * Remove Juicenet binding Signed-off-by: Jeff James --- CODEOWNERS | 1 - bom/openhab-addons/pom.xml | 5 - bundles/org.openhab.binding.juicenet/NOTICE | 13 - .../org.openhab.binding.juicenet/README.md | 268 ------------- .../doc/widget.png | Bin 37017 -> 0 bytes bundles/org.openhab.binding.juicenet/pom.xml | 16 - .../docs/JuiceNet API_client_12_11_2017.docx | Bin 94114 -> 0 bytes .../src/main/feature/feature.xml | 9 - .../internal/JuiceNetBindingConstants.java | 78 ---- .../internal/JuiceNetHandlerFactory.java | 69 ---- .../juicenet/internal/api/JuiceNetApi.java | 231 ----------- .../internal/api/JuiceNetApiException.java | 29 -- .../internal/api/dto/JuiceNetApiCar.java | 37 -- .../internal/api/dto/JuiceNetApiDevice.java | 30 -- .../dto/JuiceNetApiDeviceChargingStatus.java | 43 --- .../dto/JuiceNetApiDeviceLifetimeStatus.java | 29 -- .../api/dto/JuiceNetApiDeviceStatus.java | 51 --- .../internal/api/dto/JuiceNetApiInfo.java | 45 --- .../internal/api/dto/JuiceNetApiTouDay.java | 30 -- .../api/dto/JuiceNetApiTouSchedule.java | 27 -- .../config/JuiceNetBridgeConfiguration.java | 26 -- .../discovery/JuiceNetDiscoveryService.java | 64 ---- .../handler/JuiceNetBridgeHandler.java | 201 ---------- .../handler/JuiceNetDeviceHandler.java | 359 ------------------ .../src/main/resources/OH-INF/addon/addon.xml | 11 - .../resources/OH-INF/i18n/juicenet.properties | 98 ----- .../OH-INF/i18n/juicenet_it.properties | 98 ----- .../OH-INF/thing/juicenet-account.xml | 23 -- .../OH-INF/thing/juicenet-device.xml | 288 -------------- bundles/pom.xml | 1 - 30 files changed, 2180 deletions(-) delete mode 100644 bundles/org.openhab.binding.juicenet/NOTICE delete mode 100644 bundles/org.openhab.binding.juicenet/README.md delete mode 100644 bundles/org.openhab.binding.juicenet/doc/widget.png delete mode 100644 bundles/org.openhab.binding.juicenet/pom.xml delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/docs/JuiceNet API_client_12_11_2017.docx delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/feature/feature.xml delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetBindingConstants.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetHandlerFactory.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApi.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApiException.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiCar.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDevice.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceChargingStatus.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceLifetimeStatus.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceStatus.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiInfo.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouDay.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouSchedule.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/config/JuiceNetBridgeConfiguration.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/discovery/JuiceNetDiscoveryService.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetBridgeHandler.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetDeviceHandler.java delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/addon/addon.xml delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet.properties delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet_it.properties delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-account.xml delete mode 100644 bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-device.xml diff --git a/CODEOWNERS b/CODEOWNERS index b927bfb8487..44604919af1 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -183,7 +183,6 @@ /bundles/org.openhab.binding.jablotron/ @octa22 /bundles/org.openhab.binding.jeelink/ @vbier /bundles/org.openhab.binding.jellyfin/ @GiviMAD -/bundles/org.openhab.binding.juicenet/ @jsjames /bundles/org.openhab.binding.kaleidescape/ @mlobstein /bundles/org.openhab.binding.keba/ @kgoderis /bundles/org.openhab.binding.km200/ @Markinus diff --git a/bom/openhab-addons/pom.xml b/bom/openhab-addons/pom.xml index 71229846b00..56783211f63 100644 --- a/bom/openhab-addons/pom.xml +++ b/bom/openhab-addons/pom.xml @@ -901,11 +901,6 @@ org.openhab.binding.jellyfin ${project.version} - - org.openhab.addons.bundles - org.openhab.binding.juicenet - ${project.version} - org.openhab.addons.bundles org.openhab.binding.kaleidescape diff --git a/bundles/org.openhab.binding.juicenet/NOTICE b/bundles/org.openhab.binding.juicenet/NOTICE deleted file mode 100644 index 38d625e3492..00000000000 --- a/bundles/org.openhab.binding.juicenet/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -This content is produced and maintained by the openHAB project. - -* Project home: https://www.openhab.org - -== Declared Project Licenses - -This program and the accompanying materials are made available under the terms -of the Eclipse Public License 2.0 which is available at -https://www.eclipse.org/legal/epl-2.0/. - -== Source Code - -https://github.com/openhab/openhab-addons diff --git a/bundles/org.openhab.binding.juicenet/README.md b/bundles/org.openhab.binding.juicenet/README.md deleted file mode 100644 index fc727d62f9d..00000000000 --- a/bundles/org.openhab.binding.juicenet/README.md +++ /dev/null @@ -1,268 +0,0 @@ -# JuiceNet Binding - -The JuiceNet binding will interface with the cloud portal to get status and manage your JuiceBox EV charger(s). -In addition to getting the status of various items from the EV charger, it is also possible to start and stop charging sessions. - -## Supported Things - -This binding supports the following things: - -| thing | type | description | -|---------- |-------- |------------------------------ | -| JuiceNet Account | Bridge | This represents the cloud account to interface with the JuiceNet API. | -| JuiceBox EV Charger | Device | This interfaces to a specific JuiceBox EV charger associated with the JuiceNet account. | - -This binding should work with multiple JuiceBox EV chargers associated with the account, however it is currently only tested with a single EV charger. - -### Discovery - -Once a JuiceNet Account bridge has been created, any JuiceBox EV Chargers associated with this account will be discovered. - -### Thing Configuration - -The configuration required is to create a JuiceNet account thing and fill in the appropriate API token. -The API token can be found on the Account page at . - -A JuiceBox EV Charger requires a unitID which can also be found in the device settings at the JuiceNet web page. - -## Channels - -| channel | type | read-only | description | -|---------- |-------- |--------- | ------- | -| name | String | Y | Name of device.| -| chargingState | String | N | Current charging state (Start Charging, Smart Charging, Stop Charging). | -| state | String | Y | This is the current device state (Available, Plugged-In, Charging, Error, Disconnected). | -| message | String | Y | This is a message detailing the state of the EV charger. | -| override | Switch | N | Smart charging is overridden. Set to "OFF" to remove override. | -| chargingTimeLeft | Number:Time | Y | Charging time left (seconds). | -| plugUnplugTime | DateTime | Y | Last time of either plug-in or plug-out. | -| targetTime | DateTime | N | “Start charging” start time, or time to start when overriding smart charging. | -| unitTime | DateTime | Y | Current time on the unit. | -| temperature | Number:Temperature | Y | Current temperature at the unit. | -| currentLimit | Number:ElectricCurrent | N | Max charging current allowed. | -| current | Number:ElectricCurrent | Y | Current charging current. | -| voltage | Number:ElectricPotential | Y | Current voltage. | -| energy | Number:Energy | Y | Current amount of energy poured to the vehicle. | -| savings | Number | Y | Current session EV savings. | -| power | Number:Power | Y | Current charging power. | -| secondsCharging | Number:Time | Y | Charging time since plug-in time. | -| energyAtPlugin | Number:Energy | Y | Energy value at the plugging time. | -| energyToAdd | Number:Energy | N | Amount of energy to be added in current session. | -| lifetimeEnergy | Number:Energy | Y | Total energy delivered to vehicles during lifetime. | -| lifetimeSavings | Number | Y | EV driving saving during lifetime. | -| gasCost | Number | Y | Cost of gasoline used in savings calculations. | -| fuelConsumption | Number | Y | Miles per gallon used in savings calculations. | -| ecost | Number | Y | Cost of electricity from utility company. (currency/kWh) | -| energyPerMile | Number | Y | Energy per mile. | -| carDescription | String | Y | Car description of vehicle currently or last charged. | -| carBatterySize | Number:Energy | Y | Car battery pack size. | -| carBatteryRange | Number:Length | Y | Car range. | -| carChargingRate | Number:Power | Y | Car charging rate. | - -## Full Example - -### Things File - -If configuring the binding with manual configuration an example thing file looks like this: - -```java -Bridge juicenet:account:myaccount [ apiToken="xxxx-xxxx-xxxx-xxxx-xxxxx" ] { - Thing device JamesCharger [ unitID="xxxxxxx" ] -} -``` - -### Items File - -An example of an items file is here. - -```java -String JuiceNet_Name "Name" { channel="juicenet:device:myaccount:JamesCharger:name" } -String JuiceNet_State "Device State" { channel="juicenet:device:myaccount:JamesCharger:state" } -String JuiceNet_ChargingState "Charging State" { channel="juicenet:device:myaccount:JamesCharger:chargingState" } -String JuiceNet_Message "State Message" { channel="juicenet:device:myaccount:JamesCharger:message" } -Switch JuiceNet_Override "Override State" { channel="juicenet:device:myaccount:JamesCharger:override" } -DateTime JuiceNet_PlutUnplugTime "Plug/Unplug Time [%1$tB %1$te, %1$tY %1$tl:%1$tM %1$tp]" { channel="juicenet:device:myaccount:JamesCharger:plugUnplugTime" } -DateTime JuiceNet_TargetTime "Target Time [%1$tB %1$te, %1$tY %1$tl:%1$tM %1$tp]" { channel="juicenet:device:myaccount:JamesCharger:targetTime" } -Number:Time JuiceNet_ChargingTimeLeft "Charging Time Left [%.0f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:chargingTimeLeft" } -DateTime JuiceNet_UnitTime "Unit Time [%1$tB %1$te, %1$tY %1$tl:%1$tM %1$tp]" { channel="juicenet:device:myaccount:JamesCharger:unitTime" } -Number:Temperature JuiceNet_Temperature "Temperature [%.0f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:temperature" } -Number:ElectricCurrent JuiceNet_CurrentLimit "Current Limit [%d %unit%]" { channel="juicenet:device:myaccount:JamesCharger:currentLimit" } -Number:ElectricCurrent JuiceNet_Current "Current [%.1f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:current" } -Number:ElectricPotential JuiceNet_Voltage "Voltage [%d %unit%]" { channel="juicenet:device:myaccount:JamesCharger:voltage" } -Number:Energy JuiceNet_Energy "Current Energy [%.1f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:energy" } -Number:Power JuiceNet_Power "Charging Power [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:power" } -Number JuiceNet_Savings "Savings [$%.2f]" { channel="juicenet:device:myaccount:JamesCharger:savings" } -Number:Time JuiceNet_ChargingTime "Charging Time [%.0f %unit%]" { channel="jjuicenet:device:myaccount:JamesCharger:chargingTime" } -Number:Energy JuiceNet_EnergyToAdd "Energy to Add [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:energyToAdd" } -Number:Energy JuiceNet_EnergyAtPlugin "Energy at Plugin [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:energyAtPlugin" } -Number:Energy JuiceNet_LifetimeEnergy "Lifetime Energy [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:lifetimeEnergy" } -Number JuiceNet_GasCost "Gas Cost [$%.2f]" { channel="juicenet:device:myaccount:JamesCharger:gasCost" } -Number JuiceNet_FuelConsumption "Fuel consumption [%.1f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:fuelConsumption" } -Number JuiceNet_Ecost "Utility Energy Cost [$%.2f]" { channel="juicenet:device:myaccount:JamesCharger:ecost" } -Number JuiceNet_LifetimeSavings "Lifetime Savings [$%.2f]" { channel="juicenet:device:myaccount:JamesCharger:lifetimeSavings" } -Number:Power JuiceNet_EnergyPerMile "Energy Hours Per Mile [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:energyPerMile" } -String JuiceNet_CarDescription "Car Description" { channel="juicenet:device:myaccount:JamesCharger:carDescription" } -Number:Length JuiceNet_CarBatteryRange "Mileage Range [%d %unit%]" { channel="juicenet:device:myaccount:JamesCharger:carBatteryRange" } -Number:Energy JuiceNet_CarBatterySize "Car Battery Pack Size [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:carBatterySize" } -Number:Power JuiceNet_CarChargineRage "Car Charging Rate [%.2f %unit%]" { channel="juicenet:device:myaccount:JamesCharger:carChargingRate" } - -``` - -## Widget - -The following custom widget can be used with this binding. - -![JuiceBox Widget](doc/widget.png) - -```yaml -uid: widget_JuiceBox -tags: [] -props: - parameters: - - description: Prefix for the items with the data - label: Item prefix - name: prefix - required: false - type: TEXT - parameterGroups: [] -timestamp: May 10, 2021, 2:38:55 PM -component: f7-card -config: - title: =items[props.prefix + "_Name"].state - style: - border-radius: var(--f7-card-expandable-border-radius) - --f7-card-header-border-color: none -slots: - default: - - component: f7-card-content - slots: - default: - - component: f7-row - config: - class: - - display-flex - - align-content-stretch - - align-items-center - slots: - default: - - component: f7-gauge - config: - type: semicircle - size: 270 - value: =Number.parseFloat(items[props.prefix + "_CurrentEnergy"].state) / Number.parseFloat(items[props.prefix + "_CarBatteryPackSize"].state) - bg-color: transparent - border-bg-color: '=(items[props.prefix + "_DeviceState"].state === "charging") ? "#577543" : (items[props.prefix + "_DeviceState"].state === "plugged") ? "#8f6c2f" : "#595959"' - border-color: '=(items[props.prefix + "_DeviceState"].state === "charging") ? "#90d164" : (items[props.prefix + "_DeviceState"].state === "plugged") ? "#ed9c11" : "#adadad"' - borderWidth: 40 - value-text: =items[props.prefix + "_CurrentEnergy"].displayState - value-text-color: '=(items[props.prefix + "_DeviceState"].state === "charging") ? "#90d164" : (items[props.prefix + "_DeviceState"].state === "plugged") ? "#ed9c11" : "#adadad"' - value-font-size: 20 - value-font-weight: 500 - label-text: =items[props.prefix + "_DeviceState"].displayState - label-text-color: white - label-font-size: 18 - label-font-weight: 400 - noBorder: true - outline: true - - component: f7-row - config: - class: - - display-flex - - justify-content-center - - align-content-stretch - - align-items-center - - margin-left - slots: - default: - - component: f7-segmented - config: - strong: true - style: - width: 80% - slots: - default: - - component: oh-button - config: - text: Start - color: blue - size: 24 - active: =(items[props.prefix + "_ChargingState"].state === "start") - action: command - actionItem: =props.prefix + "_ChargingState" - actionCommand: start - - component: oh-button - config: - text: Smart - color: blue - size: 24 - active: =(items[props.prefix + "_ChargingState"].state === 'smart') - action: command - actionItem: =props.prefix + "_ChargingState" - actionCommand: smart - - component: oh-button - config: - text: Stop - color: blue - size: 24 - active: =(items[props.prefix + "_ChargingState"].state === "stop") - action: command - actionItem: =props.prefix + "_ChargingState" - actionCommand: stop - - component: f7-row - config: - class: - - display-flex - - justify-content-space-evenly - - align-content-stretch - - align-items-center - - height: 40px - style: - --f7-chip-font-size: 14px - --f7-chip-height: 28px - padding-top: 12px - slots: - default: - - component: f7-chip - config: - visible: =(items[props.prefix + "_DeviceState"].state === "charging") - text: '="Power: " + items[props.prefix + "_ChargingPower"].state' - iconF7: bolt_fill - media-bg-color: blue - bg-color: gray - label: hello - style: - padding-rightc: 12px - - component: f7-chip - config: - visible: =(items[props.prefix + "_DeviceState"].state === "charging") - text: '="Current: " + items[props.prefix + "_Current"].state' - iconF7: arrow_up_circl - media-bg-color: blue - bg-color: gray - - component: f7-chip - config: - text: '="Voltage: " + items[props.prefix + "_Voltage"].state' - iconF7: plusminus - media-bg-color: blue - bg-color: gray - - component: f7-chip - config: - visible: =(items[props.prefix + "_ChargingState"].state === 'smart') - text: '="Charge at: " + items[props.prefix + "_TargetTime"].displayState' - iconF7: clock - media-bg-color: blue - bg-color: gray - - component: f7-chip - config: - visible: =(items[props.prefix + "_DeviceState"].state === 'charging') - text: '="Charge Time Left: " + items[props.prefix + "_ChargingTimeLeft"].displayState' - iconF7: timer - media-bg-color: blue - bg-color: gray - - component: f7-card-footer - slots: - default: - - component: Label - config: - text: =items[props.prefix + "_CarDescription"].state -``` diff --git a/bundles/org.openhab.binding.juicenet/doc/widget.png b/bundles/org.openhab.binding.juicenet/doc/widget.png deleted file mode 100644 index 708e5b413d2d819ea054711c771f91cd168aff70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37017 zcmeFZ^;;ZG&^8L2B{(4j2ol`g-Q8i4T`V|@OM*+#1Sd#>ySr(s;aB2y6fIBh^ibW8W9=-0s^LjytD=a0tkkHfas3$6nJ9U ziu4@#N5oo63Zft-MGkRtw6L~=BOuVnni(6fC@|CanV1+G_YE^KpgFl~goZ|H82b%$ z40QB#j2L%ir6#?8{fhwm*AuPp2)XLt8f`Hm$**fz`^s#WO#S8_D(7FH*f;I=Ol%A# zZL1?_E84u}jJbc(h1!oKLxX`4$syk0t^^prT@0207v9lXjBRBOgh=zoMjSOn2+X!0`^MLXw zz4{w)uxd%5rD07*RA6kt^D#+?j+B-W$NLYz7imzcZ`Cj`ERMx5h$y-=s0avPdzQwK zs}O9>T@&LNZF6ItlScAt`se!yJ&w%X);+S=4L`M>KD}>zcz8fDHO4mT?l^3_dw38# zB2NY$IdibTgCikiYZ{z=I%5w8_z8pSC|IbdATR>=C&+_=VfJQWv3KHBPS;pb~3jR)R30_n;iI0gwo2z<&7X4o4dO^t2-B~qmv~Y zhk$?p8#^Z(CnpO~g2ma>!NtUb#le~Ce=7N>9%;CP+l2j{U1@83fIUDPqFj7D z!heI47Fkk zC^f)%xY*C}x{i1Kd`6cBPjr`S#k{@GS?OU~c_^V-r%Otbk~kXjYP|gqY0X0xpLc1S z`)QNs?$Y1!3JE!HjI=I$Tdog%-N-nKh=?eqMM3dL_~#O@MZM$`LN-SLk^g&Tp@>&Y z${`?P|8qTi?r*wA5!3e+EROK^m8FyY?7v$4LjaOvYJU_U_W`m`?1TO6*?zzxUz?;F3~>`x3^|qLLIbD0GcnwqB*CJE;~s;E+~*A?pskoc#^ zdj9^Luae_`_i0$Gqa_H*z16SA2^uhW^X79O_)z!X=*JqsI^Q@`pTzMf;WBG?vuwBu zAjC0hk5iKT!!!SJ)X*iW>*&&z8q<7cs4y4>@jqS}Q5ri3IAu?;GQjS4v#^xn(Ya&6 z|Ma_q2{n|I`Wj+3QDjO}`vCf-IZYsEhx`xqp%WVC;1Y}gZ-~`u@M4@K$u%{m^P}%`(pnu<-kN7k50ox<}DH^e#tod=RM7T zM2DV#(J;c2FgH(pkO2k$yQys)tB!{jlkO4+*~>+05Z{sqRr%|$fuDq^`KynZPnvQxNa?#mZs+M@m{!ukYy0Mb*=?|zc=vi3emwaznI-PtDzac|OD!!~Z zCGL!s>uYb1Wj_g$`_SB?CWWdda)t|iYEtYoQ*jqz=(z?D8Bmq-{93DGnzHEk;8SNY zY@^q@{!FjkgyimOgGlh8<-~5TtEXqezXeZ>7q zW?^5~hJlTQC3t`^V&#vx9SW&JMASa z-JG+`%nl7j(Vxil)sq*yJrp_HTS&xbzD#Mbn^SIFbYlt%4tAQiv|eZ^xACboY_+@T zyMMUdkg7B7cDmkcgj2%`*i|bPG&FK*_Cw?4m{}k04$yJQ$SUpKcJ!IGHG0Bc(9NHF z{|dO7ZVGsUT;lpn>{cy>??4HPtV=P;4gX^IEfA^BbqD`?Gxyn6*9*0}JvQ{!-sr-M zWpATt?aN3)u7Vl2tD^2S>k~RKfH0;ndAx zzU3@+D!F18x=dlMc=f3A{Pu%3@98Fm&$Pwd=MTYHBqebrLqp2D;knsDYH{0%r&4@9E1O zE1s%XCXIOgJA`Zs^X%rJy^vJIE9R$ix7tR{V40Nt-OYtI)cdIWK|@`gLq_pG`>4m>*=i~xKmcU*poC>L83sIKa}FKJ*7~N{;U@3&UJ4>DkyaqkRMqyjjbQ z8Urd?&-LcNI@2*pwNHtFF$s+AL#|HRbJEgYEu8z@oLA@X3ZtQ6XzbQw8YCTPs@;V| z#})=lfcSflz zHpTlcr2`m`7bL=OVj8N}WP|IvYB;@4t>7}xY2-hrI=0CyDnIlm&{u!Q#l@Wv*ieQg zFwM!u)%5kr=OgqDpPh`hXZhW(lG$8XW_aoeXkP5hMoTAeEwu{mEw^Wq`kZp)e|UG) zorp_HYIu+|UoCRQ5}roy)f+`(Ryv#X3)&C@Xi z!e4uBz1C~-s9ve@II6TsKOcp*Qvbr8iOm#RFwDxx<*=B(jm_ZHD@af;!Jt1#*FLl0?{oX@>M*Q z{hA}{J5QgHc7-okkowN6`dpu?OKB-3vaV(q$!wcd_7#)p{W3aOYK2y4_^Ovko6AE) zDRZd%t5W+!+?R9P>iu$(rhH1zeJ&OY%LLv(#mv*KwP4s8#%PewKO8H<7zVV|kOBHB zgr160YVJE-jrWCv*Xr5qR?|)eRW-ZM^;Y4~AGP}OeX(lVF!|;$l%E>up_EM86&u?E1PW!(AV5wQ7EZM6QeczR7HSeY@>R@LOS)y))jQH5@u z{zUKsBO~LcyhZT*@oKbKNz3E}78BgAClY8J|aF z>g3a=dD6m3`?Yoy6&0f$X>e#MzYXc%wlI3i+i#2zp~u}}XWAF8q7(D!;pwZ(?}WdJ zGkZAfjBZeY!{H6^y)W}<47r!}Ya1Jr;cHCsPG$DB4++^uD$-l=6yit7FWPFDaR>;C zXo`7o=Lm#uTI>mp5&vG~5Iw$8JrIXxH|eCmqy| zifYbaA63`1>y~_QxShoH*EaI}nBj4ZT3?9qyr;XHVVPVV0rcd_kB}|D0Ysr#ACIo; z*SC2Z8eZcTZc($+raX5wo0j=wX`buSu3WS4K4Osy7k$Dzj>!uxc+;n{ycBC_Uw6~! z)9ZG&^WlZ6aeJP4eqY$<8+hVyzLDQueA~^ww_D$`YOD8!DOrBubWHXx`3zBPaG6cI zkpAR{58z3d+xE-nN(ocC%pxgVcY+P3VH$YD_ckk5nJFnHaTTQ%ZF;)pZhQ0P=k*Vb zTVG6R_D*_;9T{yC?Orm?@7SHqw?7~_r#ZGqOs8a8#_o0u&xS*}5C8WoTFsCsa+ox7es1FLjfc5nB<*p^mcb_aKu0F7lOt zhL7V<l8EY?o*#Me$?8fl_e ze_q7jzkeob{7@+u_vEIR%&*J>!_aLGPTi@^_w&%NLAbkjdqikIuOkbAh{F^dRzsVR zvz%~Okk<2(wQdB4D|fUun8?JGzI)qGM^-Al|Hngf#l?^BnLt7uZYg1KwAekr{*eXa zV8)(!3%Tf64*c4~(l4|p z0mtBg9C`=M0S~;%uZks%j2BM(lISy0_ZvFb33WSj?j`zXCW{8(L(4LLrMhg4q)!cT zeZA_B8Eb#IBU>or`l^s2dhOyiPnugWD0bXOHBj;?1|pWzSPG5*O%ry_l1<>ydIsYW zrk<%`s{As+yGs)_87*>Ne~xx?x=#T|4Z`@0F#NUO9p=!D zg5c+nr!uH7GO3UHaRw)TeR~hZR!cUxSae@5HY?Ms50`!$=bxF=H634=>6;RQt>SWz zVQTH1mdj%CaHbhE<3A8pn$sr!YR@IH5IgUQ;!vOw2&+=@{!Jm`hY z>G{GwBs`v%dlO5D#ps_k+rJRy@(4TG%#ub_a_p^N);g(j@Ip>*u1>&QWn5{~RX+x= zdeipx%9P5+z9S*%b4&UaRzD;OBMc80mpiHc@{F3!-MIIyUw)bu-`ksXYSjb*a`7w7 zxk^VX-DA86b+?A;z*YM47GBy19Z~%mqVqeay2=LC+u|I4|3WS-Jwf+2ny!Gl#PzKG zkv2U&!kqZ5;wTRr>)m!ZfyTT9u2eD$!_A7h!%61gGbW0P;WhH%cv{Tf|3pq!EFegkUIcg4 zWDb~G<6)~X`ZocLB>oKYT`Kf}^q*O-_Zb1VbSCekS-?M$ng)<^OWUB_RccXp2~^k1_7Thae{ zJWA5%_5OqPxH|#^AyUwyVQ`)FN+V{|9&=sAhKc!Fh#hY@KCCVuH!pb^(rLhp8+;i{ zi&GMrqW!dw8s{zAGZLA?nTlKFMe$4Mi|g>g50BE$LVDB&i7$Ob;CCOz$(fWDJ<%E& zApy^6(N@;7OKD_4fUpD7Ogm_gv=aVE5+zH zJ>krwQj5O_->$5zl%(gQprN@npzZ)&dl%|YMjR$-rW>Y+l2i2sAzzti+Q}T(E}_PT zae!Gf9QGEANzW5cYwy&?I!-S;?Xee>5IsFfU#GWaRFJZ5gl}qq)ix!g^Fs?WlTnN- z(piS&5!t${j5GEZXPMr|t;4FKUq-V@0{af{J^|At)6Pwc2>hB38{4!X)J+0+JfmC# zH9+MY?sOO0qsjoZ=q7-dm#8iwODNQg%K{Q-m{zG_wIv9TZEEFHq;JBSzdn+S1f zQ+645%W~|e9+p8Hek(2>0?zp)MIVgE zSPhXlRTF2{`C4YYRv5q8UPVsV#C4$IH zJb0;;IIi&(u4M=V64QY(DwKj3MxuC$3hJTsN67B6VT;2D+kruWD!9|#C6KK{YDOJ- z?CE)avwc?y3Ew7Ao)bc2@OF=#ox#I3>;GyIuBQKS+`p);IM<9; z%uN;`+uG8vF7gDY1CoVEj45+&2r57j3*RA>K=t|FM`l@g!Rx|hON-{NRcJggZzwJ2 z{t^O5GK`;8&ig?E7M4Yj3LupVixkiD1e+Ha2{UPZQy(izk(+2dXB}>Y@G|LezQ+dU z{FoOw4HHSS+NPDaBUZeFBB1J$d`%87Inrti3(+KB2^^Il&+t&1v&)${LG>Jv`3VZY zX4#?DPvMFm#NZTVaf^2}=h0bRZ6+!sPlN*fWyNuwugo2oa)wxt7`5IvU@im0E|)_H zhwfDO01e2JbJO~NdMXR?z$w$>rPnz`K~$fTG8=X=*F?nI`2KZ~3KENo@NAZK8B2%4PX(AQLc%g+#Ah$q zk*_sZ{87Spo^St7izPvsq9YIYJ|2@ti{j8+UkBC1X-}(t-~l>CN(T_F%EwXwMX+ND zloj4n(tmJt!p62z0p;|C)SPYi^?(@rq>aaC%%jb&Xc33dPKVv(%JpN#LG9rMBur4C zs4a-F>^1zT^es71<1n4SZosf*=&MI-B4J{&mc<(Iih?`~8IIOSXYKg0X=P@Jm z^6r0oG2#q>K&q(JSSY!FUgV}Z^gad5=>@P{IAs!^14mR~!8F`_!;IZGRIosQRn)F? zjQkNQQx`o!Ty$_GAh`IWc?_BvLPWpMWUfT`?=Q6kZC~Q{x`I~Rr+t)PB`bfS`J#%+ zAko2rm?jhT)tCk4i?n#4uNw)8+_(Yz$taDne4akY1T|pFOi~!>gR$yo2VzttF7RVV zt!QyIqQRi6r*TdeprCH#&1w(&7bss;$mzd#`3Po6=8P3C28WP{|KbNqZ=#WpfkEG5 z5vRPJK*>^X(0CBZ+{QT&HM7Xh%-0x&5!p~?-*RPJ3DWvE2SyPi%S_TCdWy&obb0vT zW95SopFQ8?rA?qFC4MxCB9GR7HE2pymApw4<&5Cv#wsqv$B2Twy27+MUs}$$r`Sal zW3Ka{#<7bCd zpRbepqT7dShHAO)hL7zv7H;R%=;?=~CDgxk@idm3`)%E<1>p|}ebD~p5lDA@=m7e% z?csit<3>tO?n`?-g=I|?@aZ*r{Ca<3nxYfaloLE3s_w+sTQZ=S!)afMX8&!gu?vnC z&aL^z1tCcK#9f&@sONXh2CmK%V!@B01;;sxj3W$=8aw)05Pc)+zm{`f-?I{|?h;ZQV27UxF>H-$a)e?8RY$R8Q^$)C&*G4- zHZo*C#Ujkf_ruJbDcWJ-VHY`?<4ft-z4zF%xzBfn+J$_>*MSw|l0;+X!HnT0MdYnhW}@Us`u-WjkmJLS^ugrV zWf31Q$ZJ+j*W4tN9|h%-5m2tS`QxI-1+aOMyx|^&dJzQ-v|?o#GZH=(tHEeGs0Gc} zdQFlYyGjf}ch6;mv>$L@@-mAt)7mM*eFW zSgSo&ka_@)gK!Y0UdET)O6A8jw|_w6 zRPzyM;@oW{x-xU6{L8@OwoSc40 zdGF~BOzSMIbwvy+DKpoAy-rFV#>@@MDH@=&bH~0h2|84Yl&VuPd|=toU_cIKVUmnw zs&ur|8e;%PpgL~+o()@`h(IDh6sJ(0S!)Gd^Lu4NK%Fq6`s=mNog<6D8v5>gAkD_7 zG)-h}lLF(x3-(tMm0;!U?CfU(Olfl%t%HQbWqhImAC`XOE)U+^l`zx9$F*h0aPpE- zDKWI$KAR{3fB5>Lyedvh(<(CAh;nZcQSSX!_w4k~;qYk50LSU5;P>@{h!Nc@hw;2) zX?m>;Z^T8gWBTUzp2}=y)3fM3O0Q}4#OCwu_saYCO_2PH>iV*jwh%9Tx`#4IQ1O?5_Q!nQQ z)n(q&FQPFV2MB0WoG0@1dB_ z@NW^Vn_tn?e0*iSuZ(Kte^F>9X!Jq)$Mn>9u zZ0tiMz!<;Fj#rmc+$EFvtsr42lSADriJY)8R^6H8xyFLYWX~`F{hBDyF!+^jgB<8{ z0ANmxtl(soW;((~Q#W4PEhV>gob&CR$em1vKN@L@Hhp19GH=fTkw8XdP*6OC9_Pu@ z_oB>MBt(&>(hpcQ8Z-f76iW(OWgU{uFX8GEP3}l@r$PQLOLJ7}OzwcY?-YVRK@=sf zya5SUKF=up6ZsLz#lt7#_dFt!15v=;VDzy!Nvma%_K1uC9U$=GM?>JebM3L%WzCzh zJigB26#8D#VvqhbVLOYI6^Fl0FtNtnORa@TfUeaZCoDoG%v@9wus+e;b!;%M3d;|( zT~Fs5sY8yj4<}zXSC=?n2ftIiIZ4uGSKy*qfX@H!66Pq1vK zN62c5Vpd;Cyi4^5&;7jFQLpqT-zZ4S1=uPJu(hQcs!kWKhDzthhT_)@_kFr_7IJS# z1#ziMYw+>uI$tP4cXAjIKm#hL1}Z1kpYGkkouf!HZ9*c>2>dBt%DjZfJaPCj=RKM{ zySn<9kE~8n179DDKe})Wdbnpt;fH9Pf2jB%C@B1tWYfN zaiV1Raj%hLa=TlB5Cp2gj#0qG3GVEp+$c+H2F8Z}IJSHm^=IKbc(RDuJ$n;4C>jOR zQsNyXAe>++P%jbmPg=b5OAu&Dvg3<8g`+j%R3{ZUkdmKQRWVfV*d{{x&om7V3JwUQ zLO~v2wg#1x#S?H}dld}y0~_cEW_hS!(X9F9)fM5V4=r}uh6W%+U~4Hxo1}m6>qmO0 z{S_#mtersI+;c#)qKb^uvr)j{RQiHuj&kT)P<)jZVM*gwb5+Rf+GqN0SzLjTwbww^ zIrf%vuQxF*`n0klX@D(TrtGDIZ>8WO`)xde^XpzRoEoe?++ z3PHO6(Y~xKUDUC6oPT?NrfCz=iD_CBZFG3eM*)}Baam~#QW{8_zJ#?Op)<~hv_U6T zfDwJ*vG*T;deIBXxMOAil3x{QwK$+JFbh!{41m`&_ka4B-eP!O@27@D&0Y!|} ze+K8vt1sbRmegJNC?rCjK3I}QROns%~_bw+;?s)&_6cIl5V z8op60R+EoiS$ZT4`=b-$--4rXoiZ*xVlB`}L2j%C2r6>kiN2Ad94gT4iNZeoW;GA|ArpJ_%S`dkOLDj8h4!u(VaD3V>x+kAZi2H^gw8 zk1EzwBQjSOgYbCvG-Lo7wI_aX>XV5AxS18;y_x1Nrfty`}pXn>y2}tHP ze{R1du%UDg4ZFR9w?PxGubu|!Hokb-+|+dL=85xr0U`7wfEx~Hy54#=> zqk8a9L6=_-#?d<;eP7ncJMv{`i-Y@5Fg03Kc{Q_Mc&XJ{t(?{J$}72$x^na=Ud@3i z0!GEgv7QSqyPX|YjHGmVAIqMJ?EIj*T_a>0dwiM0mS^7T;$OtduiXXru8Pk&%rqsf zCI%Oa!tshm3mvr4j0Wng;(OPlYs11LdEUWFkFk8^Gb6Xn)3Q(d+$6MOq8f4etrW{9 z7!Wa#w(CqFW!GTkfcq(5t4`6E_W{1ReC#n^!;yJ$Td}wcbfLGy_LIZT=Lrx6L(jW# z0xOlmSat5haF1iN^v$sv$@%lQSn(TBjg?>6L~m`Ka(TAiTD(g4GD6PR$}eZmIde3h z43O#lqH=3B)w*ZhQPw4U@`gs@IunM(8#XAzbDcTQQ{Ww{QSwLbhQj2mMrqg4An|K< z5;I(o(|v}i*b*k68P{fw8@7pEb{(NU5aASvzzo}b5==36R!6`YH1*Y%7jhi~=5iHY zR3?#yYA#hcHJHY$E4Z!VCp@ijvDI8cT>aVd3d+pQ>o5CrT*Cf(@19%mG~}$ijaY0T z?_^0KJF4)5=0G0*{Mo9yTyrT!yGdhRu8l*DSjIrsqTAN|1Ga*t@KV^*p{T-Ev9*%l zq#?;)zHr*=KYxaZgH+RQK)oCqoj%2AksAokLiesxUVxicYjy9byOv*>Vvqw zd#A6`a-66Q?(+v>z>o)t4=x!*N+PaJi3A|Hsj3QAU#b0|IHFY){b-3h5>}v^+sVLP z4PW{5XP>X3UQtlm{N>K@ZpXy+$VD+z`Ali3+wSSGViZ-_mi5_c|J>T;Q`XJ^%4(6t zX6pgp+=Bz<_YVo;zxxs6YI_F+eLhZq6)}ORh@qnJs)O|N&@`E>b}V7bC2n*x^oGy- zzbVdrQg{}%B207oEI*9RHD5yb)x5nVHD)VAEbV<`sy4m0>~`*i>PjCLA|e&GxEhZn zQ+DLkT_gd{1A|%^*^VZM&y(VfI+Sf5s_>N??~!n5jJhfkVN^V-T6{ataoD~E)FV7v zYf9)fp^%GyxW`ixzA!FZ$^ExMbZtf-gZe~s&pXR@s05oG5OL&AHTSor_d-I(zjY(k zZ5L~0VA_z(4C+`y%RWWvXZ_J}va3!Z(bE+tv@Ks)$b6lvLvvcoXtGrru``SxcPICA zCIcq+Sz`HhQ!4D_O#%OSNLT9C2d0I73#o`x^{rA_Y_7~3&R0Ob9~H2?!#}_z35!pX z3NW8E1+wywNRy~y=KChfYW8yc#!Z+KW=fzM3}IRu(yyFGM87$x{^KTG_b6#s_;b09@dbzdJiS+O<&$2b-qj0 zt=rgmCFu4=`RbGX-3Lq5ny!;KHGHA5*EZ7L2gduDcTZidl7Mrk;49-&EEMqDpXrwY zJe@);Q0i*Cu5+wBQcbF&iy`}d~=0;+;|B?wku3|4?E-xr6huK26!$CN<`RgI^{6B132Y&pzH1J9$wz)BY zmo?twuMN|{$J%fNUnjIN`plrOujfvZNX26STkox#Umji&u$Zx+C`FN znHrF|uvG;(WZtHf^K)b2Te^oV0KC3!PWIQ#R#M8A+oS#Y6@Z}w>ZuG_a1Wa zD_~FP57JD@YRt(+VhO*oiNaaDVwjf0C;7GAWv!Tf9ftAw?XiO^YO=SY2|jgMIh?QP zKlOGxSM+_OL5g$HpdVd9|4kTxTDP@20=P})#hp0Hf?4yyTH`mhjid9t=!YA#O4*e99wjpY%k<&KDxTq%|&=9J*xULJ#UO7kl)| zxq+g?H%RSyLZMAjwbyGThWcDX+PbC2yH~81 zIb9OmJG{%F->pZ#zrus?1b0%nkU2sF&0Aae-u(LMp__;4sDGDd{&n?Ge%oDwQo#!2 z`BAmt)x#&N({@1(zKrSOFnVZfL6_!hBdkCD)%oYF1Jk?$cdVkMKcFi{_U6mX$saui z?)q)`EB95m{BVoOv-)$tPqQ1D$nItL)Ge2XYxQb&#&xqe*E;H#eaJjrL_2q#Yz`eY zlYi}lUa~X@=nFpL-GZ-AsR(325G+{57MVdq9_~{u`vIbh7(&Ls-_08)r@EiE$Jz)l_6X=$uAFE8hyQ7ijp$h3{$gujeut% zc(F67sjH5^OpOo`@7U06Vw2vXx%!d(#~$Q?;`c((*V)^{NDsn4a-=+lhHj zTXTuqChDocKgsO$Nl%TI+Ga>i112oE6_bLRG}1IBQaW35_gp7$1`YzLdLS_K2}CgX zRJntVm34&3U{r$PecP?uRJTzZ6ZwlG@&{r=N1@Uo!(VRa9DwvTENmI6d% z$xr$68BXYS(Zeslt)1r<-`=Z4mAS}gF)yRwGx^+@Zdd85=fQw1ff79ORqXxeCw zgaPocP%SI}&8dBLcNSM5qpAqV`}}ioa5?dIM8I+qNRfX%Sca!DoF<^Dy=EQ6=)H@b z@A>qwIvm&+seURaOGPx-+n;Kb}Z|_ zHNtU0~!ildkK{3<4!`%Yh zcDdqb{i`E@TFQn=``$sS$zqsDujNwvF&}-iW^jFCQccWkp`b7*UC4dAm_L|F$vQ(= zdefaVjLe7;B&n>Wu3^pJKwou%Gj>5T4Xy7v_?stp2K`yGJuW16ErytJ9}5r^=#*C*069mm9LnhQ;GGf&cg7yi2XeG_3&b7R~6i%_F7Law0?v^>{LeZ4`11cF=#&c-qo8M-Whzd1tYutKyGPzK~&|m8T-_Z z+mY2tD=~$*)Nm)cwy>vAz7l>a{nhJYyS(OVuW?Pa*86n4ciTQ9I=T>m5`4VBTz%%X zQ{L!N^alU#X8FOws0=4X%&$$+ZyKsy?KkuObg^-n$#xbg>7ytY zWj+D$sn6Gpw&`p}|Ep>#G+DCq^Z~)R)P)Nl<97$CMNZDHg%(b8pnu5YArCvmd{!9b zU6jxtR z*W;qq-A*z7R@8HoosoqFI>UZd-cRh?&@dOrIOn$eg9ArN=VE^m zI&paThUd=((KEP>V!R!;%+6Y(5zPACmXT+6+g;+V%5|H?rG}A&K{?pCT2gHc579Za z&GqgRv(K`*@LUp*oDZ9G-5d)5l9D%_X1vdLixb^0G7PxiP9)dQWWGD@w?Sc}p$P)g z9=C?L$`^K)=;8b$hEFj`a%zJ6wAG|j7EhargQFT&^WhSV^H8xqaDR8BJI9p!oJw|Ta63*@c3OX9kLlE* znlt$=@yWTURo!*A98r09OH0eTv5$NIF^-Q|t9Om}pN)-^p)aGG6G|In032%@&SHWs zU0kEXSo|sE_v?7obiv}hotg5|`oRxebW_)RyS-{+cX>Ij?Z*Ry)at)wsHeUYJGPB{ zQ%ZGI$ECXhUPi7u8x$CZP(A-ilX5#%tf@sWM_r_Zjw5VV9#U2P{=m5{- zbc%=`Jvs1fFI3O4?4ZzH%{{y3*r{nHoJjy{`tz+1l7Z)1{5JMli|_Afv2g<+B^Z~= zJu0;~p-T6qq4a3`;j304?c8P-04{xUXkCL{J1xCrh1Xk+S8``PAP|jox{?Udo|LtT zS+Dkdyq!;vem&n_Ev<2|H91-+>T^AI_`6e!M5cImvDw|M*=zBeZJ{?l}^1Y z`mak@)XTR+1cjC=keCq?!|j=;?U-uD+s&;E%)0H@_Y>Y446d$izXka6K{#OshTmUn zXefJM?3eN}RTg_HZh~)K3h*UF50UTAloR*widI9cDM!|AXDjmEmpns^+HTqGT|c+c z)OZEur@8I_gxWp`9enxh(6aTwFTdHLmrY+IwtFPafo@P|%R?PT4j zzw*nK5(9*jn|`MBtMkS&yD@ot`(dxe%eV8V#Wr8mgYWU#3?(f@*Ec8SCgF*rP>!bE zRehctW5Lm^8p&lJ(%<+lO9AhyJb(kss`0beaA*HEywY&V*BO_PPyv8FYL&lgd${+$?p=ORw@q(+D5?Y2hjU)p zJ7Fat2`pnR>}QIC@eJQxA8wA(n$6OXfz~I@r6E02cQqif!;6!9E?df5QDu!{eu^89 zdg_Izt!Lk%>1@T~lv08F?hgq7_cl+Pd4+|-p`O`aFQva(e7y3cVXYKH1P>K{^c+Nh zb{ZSZ>%}v?+p<5krG^||O7GvTh&-GXPF^_>Ya)JC7uOfreYP{(sC6FPr+pz6AlT?c zoD-`qAC2SRJ&?;EOZYb)$={z1`;A4lBm%aPmCw}kfAX5Mpup*=4c-uttMNC^7$^t0 zj_Bo)g8zbE>(GE`q&$!i`CkAoa10!3HXU643I`_#L^M$M_8;;(9>ipOrphu#1_tY$ z9D?)9FS(5plgYPt48oLwS&(|fcdu~%YP*90@he-u+>$AzuQIZvY{K1Nrx4G&6BAN4 zkI+`2g#-peJUsZ3PJ{?aS{#Zn6@#U=gT#4|PZ(L4^1pwVEGa4)Q>unw0qIs`6yyW( zKTD6V^0%-rP&#@CL=1;jSvvhDOk|3~qazAqjOn4n!P`NEp*bu*QrDrUcz<=aju-K( zcE1Sv3MnwS{UaMU8;(j?tpFu6GX|{0V)FDJL;BmNHcFqTe48?C+VkTQ|04-;zej&oCbh$;fTf7|CTWwa$3g6`>{-jleAeUw zS(*P*&r=?A*lBljuLhMr?JqWKnw#fE@LK zEJfZ&95n0wVh;Dnk6^ln)IV)LH=9Sjq=oO1pOvJ@0r<-w)n?Wk73p>GlLU*&Bw%y{RE~;f)rF$3o=B!#|Glt zspxG>KVAI%1^~(zT_!)ej0kK%Oid}**4D-+@|CuZdNZ?DR!m*V>uNVVsOWmZhaQ_r z=rg>r{`Ano3@^sktMycu8~et|&uYR7reT+(nh)xg@-cR+FIKivY%8;$cgk@e(bu~- zuM99*U7v2%Yp*0yprrYn&;8|g0f1ZaSp#)=o7MFAj0A}&jw8{<2b?W%q^3((Wd2Vt2f$XI#WhMwJS z7E zlKZHIrsLqi`Z1H;kU^eA&?O51oL*ae<2${(ST3#mOskSZ_;M(#aoH=iKsB|bjCl67 z52nc3sixvvV0k5Oy_!i?%+^1^T~jwCaAaRPNyQjp7^bOX9-Y%JYK-wa3*7Fn^O-67M(fZw?Bl zrnDYWnN7N?g0?vJ^L1fSuLLCNGF&M8Kd)zfdtX#k6zaDBqn~dQI#4p+?C$8RYem7b zk@|avMW2C=u6JjQRLCvz_V!NTo)EeIm~v~Xm@3REJ}#~c&66=K(7sw{s;auKwhvf0 zDsfqklCRDe9E*Wizy%oOaZ~mw00Pp~n>T6DNE_UM;*}e=2FrdVl2NPu-fA^YnZoCo zv2CmU`Yn>r*|c`afxK^LFsA0tOV-=4``Z(>Gj?)(&aGxsdxPe4w&|CxDE|+8Z~4~N zyKR9M3I$5>0;NE4x8g1>uEAZ3ySq~;65J{71W0iA7AfxT#ogWS`t5V}KKuR$_rraj z^$D_)l{c@edzuJu@BM z8Tfg_j%rJLYd7s(L{bZ7T>BUJQK1J$FsI@D-Q={SUE*Leb3RMQV>}x>yXEMyAcy_4 zz(;OBBHOvj?<-yhOi9_gt;cOU`h`+SDJd6-M;M%p>>j7zk`(xhZwK{_$^8<-w|tpOk}GFWeSinu@AJ{Z1P^_K*eNQqZ&lRzJ@ z)ebOZkx8X`r7_@m%D0ai2E&l~8kQ2*C(oBB3>#ks#xu4^rrF|-=lemPSj7oEfY@Bx zgY_^2*Zr2${F(@RaJpXz8X zicQFm z4sb8K;AA@f(FC;M<<%j4rB#jeb2?cC6<{j8$C^XayYsF3Y_|R{Vj%>%n)8+4zN6d* z!6SR51!!g@GwOFn=f5a%OP@u7f%KkCG?Yg$@f{N2voOfvIbhgMfZK>|a)O2fKyWlC=zNy|4kY1MJaR%!H zzakKj1PlFTg+cqU);SRNTzPoM0US}l5MRr*`sCptqEzkGqy^PQf) zyi@^A;%ECSG1wXlA6{57GSwf1{sPbig;`x^*D`o8)vtS@;i9_)>6gVu#{}j59=NBA zQEQ@9YvR6sjN4>BxcrN0M@Pp)lAAYC1nhs*l?i4Nz-Z*IzJ|4K$sGTrlzvb5^VbQ% zz%e>jZ@Xw!M)>(#z>)jQ^Ni^k2|$n%1mNC<$zM)2$QE6!HJ)6_0zLghX+OFVI5}uV zg@FBCqsMlF}&(1}tC>Wdu#a+hsoE+=Q)rro@V zL{KuPC;JT0l1BQ@^KEw2ra#@@mu6^k#X>18yI;X=26U&mv<D{k^#bfWq+!N+IlxHy4oui( zzZoR`+e=(M)87o02UsNgz{$?Zt~5i=!KYe_v?lP37R@4#!|;;xA;om z$Az^#%+DeX+RBP_wz(WHr9K^?Ly)CX4O;3yOfj2pUO z8QAyOdjuI-St9)e!>ZEJx7Gq8BI{X=>)wht+f>}0MKa5+X=xbO*8iNVhcf<-5EC@I zOSG*ZzbQ;&W1EE8Sq`%^mzfdQq|#X7aFG*GGN8aKw*xTt%q5Ug%&6!6qA&>SUCH?yrP7|h^`-20JYy9u^7aj<6 znMJI?lmc=XaBwNeITejRP{9AV*off&6Yn~)hb5GU@o0P%`GpI=%TTWP6_61FN|c=C z8f|iW`(d1LHHHS57gaA6N`G=4n))12?3hW z%`8O6m{(?q&Ao#ZB@uTa1f6h)^z@90sh&SxV|BW0VO8oUgF8A%2umOD#5QFj)V;|3)=y z)?-6&DQ|?+jass#zpTCPTg{O2Q_H3Awd%k==iXATge)RU(w z>;bGqWC;lNTz1F4@MUBbLCLx5KJQM-Q$Z%5#xxwCrY&b{aR(zFip!$y82?9wAxrZ9 z{h>|5+AJi)4M*I)HSCdYysr7DGcC1)peyR!rnXlB8`1ZSjQm=|4ef zE|VJ0lCfQ=d}m0ec3i;tLoq`!umbx=M=SJ|vsGa0EohMPu1{16{taHAb+y*a74pk- zW$FH~3?^+#8H>OJCLa^$xP!a9<2Is+pL`cEho{Jc#SCn*V0}|T2$3_A%O%b1Jp=DQ ze!P#Zi5xOJ`AB!j=fdUs@zLP?Cc;sD>(8u)xU&BItI~IUxl%6~e!5H-5JRfw>?5W-AunT31{(xjb4M%aM z6R5L99Uae_p+Wq3=dMYitr1rZ|W{qT=yozQ~SrW^u1xZ2q-a2R* zBxYgY4h%|yCeu5IkqEkIy$VLW8)xz7t5%=KUx~TK&$jD;A6$_L$gWioG_5_h+Oo<< z4=49J40+{s*Zk@u@1M=Df@2W9fPzuVHz!bd&hm(k`^GmPe5W}T_+$zvh4wAK>Q`v? z%h9C}PkSbwF37?c>$H+=y;qxjwoQsUFR!PZY!Ck)RU`_(fxSDHOL4U~slkowPzQ=o zzUt%rKE?Sv#$^BGC}EhHPGfhn+0v>3)o7}{RLx~XjJ>~C?TdkHQlj6)URg{%0zria zjItmQ%JvW z+ter4xDNM>qETvv!Ppb&R@&vfUzF$5w8G+jceh9L;rV=GRU_nMnnTQUN*0Q>GO)M{*ZJK~^7Si)g#Tqnf4{^)su-rile!zLB9lTbQJV$AyQv%q-Z^)TAwAs&}N5J`_?_} zg*s>aY>KPV?_P*}?VVD-b#}xOXmvugPtTADP+k1@gai8ueZhaM&~mSqxLmgi65dSG zL89}@bgT{1_luz3nc&FCoZCiCdRkgodhM{^ps(5X(B8fP5tk2gFyO%Q{RxTq+O_Fg zA(JZ={`HU#P>T&aRQP0k+j=q$r8%0fsnE{^3_xtIrK8G{+}p%jzq0sFDa|iw?IesG zU@I--g5``lN+aaB3at*-tOjJAPqrPVCJI+_hm4rN-FZDX?AP4R76Kqksog0GN|eW+ z*}<|a4Ht`SvB{C_uYfsF5x#*(@V4(6uIs@}@W=;uub^NcXfZ9cz$WH(`jMCCAuyou zr?S%pp5bSNpVn8<(+=+-pf^%exB8T;SLXv%=`J%f{pWcX_6;pgx8HU zSxw2GwCNgicV=12tH1X0kDjd^_NzibS+Jzc>a;}#GJjb3`QPA_nGpG8JA)XF*<6<%FdhTS(t3W`xZ)Fh~BG<0maAf~%I@2g| z31dnLUtPHC?i6K-I{m^?_)rkdZ&CSB{zhUKs?3|JI{wg|2J%6O^EsStVms?pG7$7Q z#iXL9Qi3S-hvz?aB!py$ltc;0%|m9BxA-{s7-x?e7KE7YhzST3@SRun>#R5huTFOM zo^FK9Wc}Rvu4?11&>4tA-Vwk)nTS`7cV`NiWCOTWskMjRfx3moXS5GX+5hSPc!%Y`hFt5XK?y{@|JRUvVq(BjBJVSW-?DaVm?nz z<~2`L1|?tOQcyeOb%iC9u{`bqU+tpOb^&w1fnRI$+K- zsV`)?P$xSPKlPBDzCV<@GkNbyn1t=grnAq1CB6d`ye1AR+H7kSkCwdy^!@J8m{3+T zj4hs95%<9mgBPLtt0<;EX~B&^%l*c*V7Y;ks*{nf5T`RNMC(0eh8vGR?(oyHBG>LizXEfKgz zhzU;<%=Ng}YY<;JVWmaO$XHZ6)x{B47K>s-oY?LvY=chc%8xtjoMq^i6pfovqYrIW37p8%$}6qZ*c{!T4rxdjCXe72V*lr#BVHm` z5nmzSz)xQ;NiBM@|JVU=Rl8ABQ*7T9@@z^azx}AI@yXmkLq2?0Yq0OK2ad0gzhc>FYQo2vFHm|t3_f~%JK5l? z5K0=TrbF`C@H5nN6)0+a$P_j%{kSOXM5&^u%ZVC5i&W*Kv^&w`m79XoESL>TP1V{j zksDe`=dvpr6-w>pR=~kn%Y>X`y}_~(|Hy0gAsch+avpL)8wyfw%8^RbZ&M*MipSAX zDJ^(MoWMW!%`aTP?Vcrc&$RFzO6o1xKPrgBh!;RU6|*fTi^ezw5^0Kz35q5+D>`Nt z?S3va|7kZZHlKl^(sFV}ah;3H+g&4FlPGg5%xl;wJ1IT*Zjpo=&@xn#1Ka`Shs31W zPco{6#E%hR$F?Zq!{azLw5vU<_LK5CCHaQa*wyjZXiGn|R=rO0-)=c4&Hm~u0@lKl zM93pYp$zorm_Ie4NAX@x#I&Zp0&M{BG{>a=jMi zhT~Kul9wf&vU-Kw)_)mnSqopxgRD_%cylunB;8WN_loxMJXyR%=9=v zzO8+b=7cW&1~8FK`h#JDG+!D&D*DsuxP`*&1X{|xgi+yB8)zo1e{q-aPzG$=dS{yA zK{833Td)ed&4XNl?(kqG9M8%`B#`HB5w1BM)}ijciiEj@mtOG>ONI}2fHr!%p=to3o!Tza3~sJ+p+ibBFR+Vr=rYt|4=3h_rkRF&W_8k*H7l*C$(ge*;s(Y+2|Wn&qIJKTS4RhKWYUxW|UjmZ*h z%+^|^VZ@-#Y#K@Dwk=Da+OrqDRDuLsZ-;~oe;yvv9c@X6f7)Ge6mXje)10fk{N;Uk znZ7FZl_uS^PmD-W{Hy4EeIIBYcP&M*B$~OS>KD&-I+@jZ%?K)15`y(?kf-N^CN8UGwTc}^TO*>B}no!G( zURcAt5oB&du!#=8EiJa$s9MSIRjpoGxJBE35Sxj(%CXkCJ|gr^V@iD|Y9UHhtsEl4 zQSx_Ij%bUJylC2-5X)<#@B~sa93sXk8&gyqxiA;p`y*9-Jb?;3!;9p5q zX;aBRn_VMu&_UI?vQbAqnH*gtZrKT#Fk#fMZu#6rS)5iVn&?Bs-ZB zyHmx5-T`2Gv9}T&NGuT3v(8BE$Ux3d%@BRDsk$|ddE3$ZoavZysF75@ZNZ`y~lzm%WrnlaHA`IN+&1tA;Vz@1_#Y(tHSI$ z=4Zp8rgV}afX(}#_4p*UoxV39uG+p!f4sG^23E-JjHnO6Pvn`@0^A<4arvPn@ASM~bs@*At3(t-GX zJk$e~018E1n-FS#-(td0-Aea@M<02rGCf1VFGNQGpuW24VIih~CpoEXYEbpH|C;A| zevHV+R8Ejg=(~IeRQ38{Ug@-U9HRJKUtWu4Efj7+#N8_&$SZ{M;$fo^xlK7a|M20?=L6ZV;ss} z2pN1Eyp)o76Z%WK`Y9RlU^8N2#`ggsEhYzs!=Q%bN9%LEhc7KbC?@tLE)E6D(}5o# zJtX!>wdjWj!oZs5P!HwK>m&X-L2^l*qnU=G&i37Pg2T_FBbTmU7sC+c&GKYD2<1&E zMUVNxC{+TEyG(V>xdOFM`+gA#j~?|Qt~-Y6Rp{30znb?lo`6{7UlYNcFzQA|EB7GU z<*Q+5>_;NPInY)Di=Mv`GS{pCRilh*R%fAeR)3fEx)>cu)!3s^^fA_CJ0VQKvQPT6 z!{1lw(jGu{+3JrfeLAde4fCuEQ#O7ZnR#QsVaX|<&6l46BqbH=^eLv!xu6!rFjK|; zCrbf)LrmmRLjPOjcAzDdA zm}brWS+E(v;@WR$dD+aPe75wjsu*$cGr|#Okr%7NPH1`eGC%m~*;cP()z3A5kbq!@ z%aX$omD&LSQ6aP=_qDgrQmZ%+y)t_#?=1c+qEDU3iX&T2x~V>_-$eYgVzEl8F(Wq# za^>TIn7f2Pip^M&5y7aeEszNlJE0dh?pDpIydSfY`r21RXJ_EXx}seV8q;xe9BS1t zYv3KxEi7qr$b&*+q}KY8KXeM+?IoVSHeX6zBDgApWx$^zu zS;95=u`^kNOwV zAAOaAuabhN6gm8MO*~|Dy*&44PQjf7k}y}aSdcIxH<~fTo5kLrIwYMvhHVi zev+VpWpRF}$V6S6SN-+r1?QlZa=rmn?=?Qrj{~{=q<)4UJu7|f?-jJ6dWFhoqCc>X zHjk*j6r zD$I)~HE`8h^LEHY&g0fk^slz*>TH*?&|z*DvpiiD+DPfZWSn>;41W=+2z1^Nd{21b zK!zH*;k;ynJUuHs^~7y$nu^Ldbfx4PYIXox&&so;e!uy~G)2Q)^93i1WJNVTE?LrV zxC8QP$}PQ)-;VHAE?0lCya^nGz&b`}))5}_o{7~1hmURzYxJ09%I|bAyBk=F9Br?% z-4yhxez7OZFI9uWeO@Qn?`Tw*O*T)XEecD)r0rLz*IV>jNBrviMP2nEcQSt zmHn+5i?t4w4{o@{Hbw0%Y%OlbO6B8#^Y>V(nzdS0MuzTm`{^W26=^u4$WmZ?L2K(l z`+NKN>h_^M$WcHGFB4E1H6hEpM_WNqhw)U)>HdHrqYb~MwX@P1rn%8>=k#x|W?|{~ zJI^()_ct1T3b_eP@6#dbbEAk?INeu5@!?J|VTgNe1DA|Z@kx-)ayadZUSVLi$$DG+ z{5P$4{`B+=!)$Cr2iXqSLyg-0TmSyCmnT^Qt>4t@mh<~x7mIqD%AY?ttAT=UQ4bO8 zQjgm6k%$!f@Y|=MGbM8co)_lMB3=Z<8@EbYiiU|Mb$TOp)|VUEttHnEI2gZ$^ySVz zq852Q$J6XkRRVU)@!eauJ?4W+b#mRaaVMbD)vvtvXzZ&ik0Dp-mLp54mm~2cB^?y= z)gpk6qTbG(NyX)Dl#O&k{DKlOlW9YC^5)=eh5wb#(b&epWG$JU`d#`A-fNH6*vWp8 zpZN-UR<)wCfS>!){a12|{EtUpM@w@JBQVbG*jF0#J_!7g>CpYQ;X#wZ;I3<02>I%6pZP?f2?eaqcH6{Id+8eEHd0hX!F~+)2z26*^@1fII?#CZF4q~^;_1yhM z(US<*NG-NYgLj`^@T4uJvyhme)vM3Aqk8U21k^jFJ5bDi=7Ti;Q5~%(f%s~px)j`z z`y9u9e0vdyf~Aa&<;zYtJQZtU_LFVu`zjhs6{GTuprPeq8t)!b9~>#?OUqNR6y8RF z^IOY^q<7c)&l-t|^;4cp%)RVL+?r6o7VzsKUo5pHWuqTw4TLEX9(}R?*9*cv7(H^C zYz(CZtVc1+I$aAA`6F9HGw$UyF9I1a-+59{3N}$>ioaCihwTU%1dlStU!v~#-P@vi^jeOeLt5*04(@VNp^r(=`A3{nT)(e^q=mQh zymiOA9y$3nu53THaRZ-O?)Ry`s`1ilK#!l!Kw@hgRP7rA`+3}Vrkm;U(rP~=0KSO7 zk1vqVzdN!M;+%RrvihAvGClBHpAHORVN9G~;7wI8wazZkZ03tKXlmS`<8&BgQ?;D) zrHUbaeI;l36`8|@nNXQt1D}Z3go1z=`5^Ljz zs<;ZZHm+z7{dL-A`Ui9rcCW>CvYyy{*xSSjgpnO!o!e!E^W7wxH*<>_GcmQ%9Sj1^ z2QwQLECVO3kjwytQA6Y*wbgG(y}D(F&Q&n<#GfPStxj6?#uim{B0I$$H(kr3KXrao z(zmz=b>_>^mJf@G`c)rw^7;wo*yn}cScWgk9d(_*TNE?1z?|#M+Xp@mj{AeX^TH~+ zvBHDw@%(I;uJ85DE5TDaQpKI(9sL&J#k}C8Z%ytOm&T5q-(w<~G?Yhl*9Ap1RSUIP z(ix(ae@g~*X!Q$!x8{x3;Y64a`3!lzXD86r{;ga{^tQ2<4*tt$N%^R*l30GjX>udj zCF6owWX|PU$Mpy2LY9+9eV_Y1))u;Pr{25w(V{;Bx?deGc7$e!-fXhceHY*u+7oH# zmtW)_nl9Rkn90r(sT@`^kT_)iQ`&>VfTq3O=uSr#b@P|C3OA^eHzh-F-h2g74npe z_sjLO#@P#Z00gqHjXbIZ+9iVtjQ{5S4{-qV^m_pC%_|v-Fwk;o|IP3IhtI(Zhs$BjO*n7{Ded~wPj8#W^w!%iOKMwQZ~q(p8+)eo(F3to))!odY+(>y;X zHm*;Lg}fzCBDyDJ$S5!SsqH{3V(#@Qde z`z$aJE)kYc7!WEB=+=BAXvRoOpJ|*wla;pORVfg4NHKP}C`x~bs0t{_Sm)VCf6jSPm{7*E&YBj;POVS*QZ0&x~3;|3=(8!OCJd9W8^TA-QWSH{S;K=T*1pPntk21{!73*dj|ddp;@H(- zn=aPhZ%c%VG_Rzq%V=uif|90BLtS5_-^NbI#l>fFZ&RPo1x@n0KKyM!pY@#ow+Sw2 zSRZdogtP#q(XS4DZ_UVo^skHv*UP(nH)a~f$JsL$RGZozWkJD4HBcG9HZ5ED>xqhK zB}*m2r-u;jQon9L5xs?`x{xecjC_N3lYH))(vl)w_jYRVTWfwLe(S9Akc~ydE~GQ= z7kxlDME_3%pgL$%t?gois`kAUE|Gu-X|Uv+#YTv2H16w7TJ{Y&p~P z)ReMxzuu&+#E;O)xwHIYK(JVAHm%+42^E<}YtXWs*hHDiH>VbtlpJRoS*>?P!j<~9 zvH`S#lAJ686^>+17PpsYmFo@WmgzL8XlVtjcc08&A0_N3nQzMQb2&t5`)7Zh+M zPOv8Rx^-pm7r%xl6MgmjfXtbJ71JN30K?$xTAU!jNF_2aw0tVNT%nm(?Qv|v!mfN) z;7K~OzE0vBF#c|usIW6N`Bk=}WGqyRuw#-4qV z0CA+A%UY+nRS!uiyO~@*>JCfgSZSW!GFzV&TK-^4wcY~qkH~?6x6OWn+06Q_a>2pw z7Jq-i)dCpq@r!tpM)&%rm))mK0mrmbC^Wrw5DZ4)aGG*hXxRxcnEfbdhOpe^9NJs? zJy@>E%J@DKpO%bF35AF~D%|z>iW^VKR29W5`P+D4A)EDM(-%IlJI#byFJK{AupX)wHVS(E}ovy~fIFKRT730)U z4B4j41V-!=Pe$`=6RmlQW=D!u8^^@g-*c${GJ6o?L37&6c72R7!y*sN=Z5|s8@ilY z2@1AOl16V{Jq_1guI?;a$i;lVKhl`KJgv`nhz}VEKiKuKBbF!rAhCK<=4#QBSM*w` zKs1>TbMQ;Yv+r)u%VWZm=#8OeNj14@RnC6m40xofaRTW1ly7+&yOXGP@aws2ze{@r zjA+u?eKyqs0>!JfY1BAN3Dq({OI4>k9v*sJF8dtI`D6J2VlPZ$9X*ZX&eP5PDyO-b zZ=uQ<|7w3ep1QdbgD*!I^qb5zA<&5keJxl zX+ylVwVWg5>uottX>@;@+vSp8raEl{m*5g2K6^=^QjFUo+ap7OXI5B|QcQ_ zl0BFw--4FS3KJv`_{)1I#2^GGZerkS(r>w$0H^%(gK3Y~kq?b-{zRay6i z+Pfg(s2sm8Scoq3GP#VswIi>FM*40%4Z+bugE90ASWk5i^~ij!0AG!sI;1Do=dXUd zkD699l}_hh`IeiaUM&wTI;1+_I;7dcW(rC-~wqdJr7B`I8e*HNKOl zo~A^e9F2taNB!xQyUl8$*h*dxsup8bE{m|ih!JZ>K}@MYM4acvw&KC9hjyD4vG2>1 z5>;O};vVRupcjH*uX>%myN@JLIW&#&a{bZ z>c{J1psz?|5+V-|4sE=MoTxIUNh)>{qRFFWIVsXpzWT3PN=$;+=(^Gg4L3XkEgGKF%6zDnQsxxv&$u;O>HO5d5_$@8Uc84viD$K!A1 zGQErUk%aa=%L#2tB683lDQ~wE4I}bw@d(WtvDOUZ!AMFh&_*wJ}8SGCNk zunkTYqgCY`t@=x4(latDcd~Ob^(YeY&BjEt-Rd|o|1icxc7(@NC-Vzp6%aeY z+v*JI%VHq;g@}mw{=%att#LJX>3;iKO*U1qxh9w{%VrJqtS2TZS)=n=OG~%b33TD5fxkh~DIW19o+~)Y&9>@L zTuf}t0#8hPKni3Yx6^_uqy7L^Q_#&>W@A@%p81@P%>uT8dyi#G-7m;9%4+gl#O9X$ ze3uWp6Y5cUdG=M4o9^|0hA#Uu9GMw3{V^5FML*&ni#2?m>Z_w&W7f7Po3>>+6%a

l(BSN(x^Eb3v261yi2AG#l(Vcr|!ur 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 u6#ByAvvGn7L!#)U?V` - - - 4.0.0 - - - org.openhab.addons.bundles - org.openhab.addons.reactor.bundles - 5.0.0-SNAPSHOT - - - org.openhab.binding.juicenet - - openHAB Add-ons :: Bundles :: JuiceNet Binding - diff --git a/bundles/org.openhab.binding.juicenet/src/main/docs/JuiceNet API_client_12_11_2017.docx b/bundles/org.openhab.binding.juicenet/src/main/docs/JuiceNet API_client_12_11_2017.docx deleted file mode 100644 index ff9a2ae378133a94aa7384eb0be7fd7d04a21d75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94114 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 - - mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features - - - openhab-runtime-base - mvn:org.openhab.addons.bundles/org.openhab.binding.juicenet/${project.version} - - diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetBindingConstants.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetBindingConstants.java deleted file mode 100644 index 574704ec19a..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetBindingConstants.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.openhab.core.thing.ThingTypeUID; - -/** - * The {@link JuiceNetBindingConstants} class defines common constants, which are - * used across the whole binding. - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetBindingConstants { - private static final String BINDING_ID = "juicenet"; - - // List of Bridge Type - public static final String BRIDGE = "account"; - - // List of all Device Types - public static final String DEVICE = "device"; - - // List of all Bridge Thing Type UIDs - public static final ThingTypeUID BRIDGE_THING_TYPE = new ThingTypeUID(BINDING_ID, BRIDGE); - - // List of all Thing Type UIDs - public static final ThingTypeUID DEVICE_THING_TYPE = new ThingTypeUID(BINDING_ID, DEVICE); - - // Device config parameter - public static final String PARAMETER_UNIT_ID = "unitID"; - - // Device properties - public static final String PROPERTY_NAME = "name"; - - // List of all Channel ids - public static final String CHANNEL_NAME = "name"; - public static final String CHANNEL_CHARGING_STATE = "chargingState"; - public static final String CHANNEL_STATE = "state"; - public static final String CHANNEL_MESSAGE = "message"; - public static final String CHANNEL_OVERRIDE = "override"; - public static final String CHANNEL_CHARGING_TIME_LEFT = "chargingTimeLeft"; - public static final String CHANNEL_PLUG_UNPLUG_TIME = "plugUnplugTime"; - public static final String CHANNEL_TARGET_TIME = "targetTime"; - public static final String CHANNEL_UNIT_TIME = "unitTime"; - public static final String CHANNEL_TEMPERATURE = "temperature"; - public static final String CHANNEL_CURRENT_LIMIT = "currentLimit"; - public static final String CHANNEL_CURRENT = "current"; - public static final String CHANNEL_VOLTAGE = "voltage"; - public static final String CHANNEL_ENERGY = "energy"; - public static final String CHANNEL_SAVINGS = "savings"; - public static final String CHANNEL_POWER = "power"; - public static final String CHANNEL_CHARGING_TIME = "chargingTime"; - public static final String CHANNEL_ENERGY_AT_PLUGIN = "energyAtPlugin"; - public static final String CHANNEL_ENERGY_TO_ADD = "energyToAdd"; - public static final String CHANNEL_LIFETIME_ENERGY = "lifetimeEnergy"; - public static final String CHANNEL_LIFETIME_SAVINGS = "lifetimeSavings"; - - public static final String CHANNEL_GAS_COST = "gasCost"; - public static final String CHANNEL_FUEL_CONSUMPTION = "fuelConsumption"; - public static final String CHANNEL_ECOST = "ecost"; - public static final String CHANNEL_ENERGY_PER_MILE = "energyPerMile"; - - public static final String CHANNEL_CAR_DESCRIPTION = "carDescription"; - public static final String CHANNEL_CAR_BATTERY_SIZE = "carBatterySize"; - public static final String CHANNEL_CAR_BATTERY_RANGE = "carBatteryRange"; - public static final String CHANNEL_CAR_CHARGING_RATE = "carChargingRate"; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetHandlerFactory.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetHandlerFactory.java deleted file mode 100644 index 4029478d4ad..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/JuiceNetHandlerFactory.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal; - -import static org.openhab.binding.juicenet.internal.JuiceNetBindingConstants.*; - -import java.util.Set; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; -import org.openhab.binding.juicenet.internal.handler.JuiceNetBridgeHandler; -import org.openhab.binding.juicenet.internal.handler.JuiceNetDeviceHandler; -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; - -/** - * The {@link JuiceNetHandlerFactory} is responsible for creating things and thing - * handlers. - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -@Component(configurationPid = "binding.juicenet", service = ThingHandlerFactory.class) -public class JuiceNetHandlerFactory extends BaseThingHandlerFactory { - - private static final Set SUPPORTED_THING_TYPES_UIDS = Set.of(BRIDGE_THING_TYPE, DEVICE_THING_TYPE); - private final HttpClientFactory httpClientFactory; - - @Activate - public JuiceNetHandlerFactory(@Reference HttpClientFactory httpClientFactory) { - this.httpClientFactory = httpClientFactory; - } - - @Override - public boolean supportsThingType(ThingTypeUID thingTypeUID) { - return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID); - } - - @Override - protected @Nullable ThingHandler createHandler(Thing thing) { - ThingTypeUID thingTypeUID = thing.getThingTypeUID(); - - if (thingTypeUID.equals(BRIDGE_THING_TYPE)) { - return new JuiceNetBridgeHandler((Bridge) thing, httpClientFactory.getCommonHttpClient()); - } else if (thingTypeUID.equals(DEVICE_THING_TYPE)) { - return new JuiceNetDeviceHandler(thing); - } - - return null; - } -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApi.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApi.java deleted file mode 100644 index deda05dd713..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApi.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.jetty.client.HttpClient; -import org.eclipse.jetty.client.api.ContentResponse; -import org.eclipse.jetty.client.api.Request; -import org.eclipse.jetty.client.util.StringContentProvider; -import org.eclipse.jetty.http.HttpHeader; -import org.eclipse.jetty.http.HttpStatus; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiDevice; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiDeviceStatus; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiInfo; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiTouSchedule; -import org.openhab.core.thing.ThingUID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; - -/** - * The {@link JuiceNetApi} is responsible for implementing the api interface to the JuiceNet cloud server - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApi { - private final Logger logger = LoggerFactory.getLogger(JuiceNetApi.class); - - private static final String API_HOST = "https://jbv1-api.emotorwerks.com/"; - private static final String API_ACCOUNT = API_HOST + "box_pin"; - private static final String API_DEVICE = API_HOST + "box_api_secure"; - private static final int REQUEST_TIMEOUT_MS = 10_000; - - private String apiToken = ""; - private HttpClient httpClient; - private ThingUID bridgeUID; - - public enum ApiCommand { - GET_ACCOUNT_UNITS("get_account_units", API_ACCOUNT), - GET_STATE("get_state", API_DEVICE), - SET_CHARGING_LIMIT("set_limit", API_DEVICE), - GET_SCHEDULE("get_schedule", API_DEVICE), - SET_SCHEDULE("set_schedule", API_DEVICE), - GET_INFO("get_info", API_DEVICE), - SET_OVERRIDE("set_override", API_DEVICE); - - final String command; - final String uri; - - ApiCommand(String command, String uri) { - this.command = command; - this.uri = uri; - } - } - - public JuiceNetApi(HttpClient httpClient, ThingUID bridgeUID) { - this.bridgeUID = bridgeUID; - this.httpClient = httpClient; - } - - public void setApiToken(String apiToken) { - this.apiToken = apiToken; - } - - public List queryDeviceList() throws JuiceNetApiException, InterruptedException { - JuiceNetApiDevice[] listDevices; - try { - JsonObject jsonResponse = postApiCommand(ApiCommand.GET_ACCOUNT_UNITS, null); - - JsonElement unitsElement = jsonResponse.get("units"); - if (unitsElement == null) { - throw new JuiceNetApiException("getDevices from Juicenet API failed, no 'units' element in response."); - } - - listDevices = new Gson().fromJson(unitsElement.getAsJsonArray(), JuiceNetApiDevice[].class); - } catch (JsonSyntaxException e) { - throw new JuiceNetApiException("getDevices from JuiceNet API failed, invalid JSON list."); - } catch (IllegalStateException e) { - throw new JuiceNetApiException("getDevices from JuiceNet API failed - did not return valid array."); - } - - return Arrays.asList(listDevices); - } - - public JuiceNetApiDeviceStatus queryDeviceStatus(String token) throws JuiceNetApiException, InterruptedException { - JuiceNetApiDeviceStatus deviceStatus; - try { - JsonObject jsonResponse = postApiCommand(ApiCommand.GET_STATE, token); - - deviceStatus = new Gson().fromJson(jsonResponse, JuiceNetApiDeviceStatus.class); - } catch (JsonSyntaxException e) { - throw new JuiceNetApiException("queryDeviceStatus from JuiceNet API failed, invalid JSON list."); - } catch (IllegalStateException e) { - throw new JuiceNetApiException("queryDeviceStatus from JuiceNet API failed - did not return valid array."); - } - - return Objects.requireNonNull(deviceStatus); - } - - public JuiceNetApiInfo queryInfo(String token) throws InterruptedException, JuiceNetApiException { - JuiceNetApiInfo info; - try { - JsonObject jsonResponse = postApiCommand(ApiCommand.GET_INFO, token); - - info = new Gson().fromJson(jsonResponse, JuiceNetApiInfo.class); - } catch (JsonSyntaxException e) { - throw new JuiceNetApiException("queryInfo from JuiceNet API failed, invalid JSON list."); - } catch (IllegalStateException e) { - throw new JuiceNetApiException("queryInfo from JuiceNet API failed - did not return valid array."); - } - - return Objects.requireNonNull(info); - } - - public JuiceNetApiTouSchedule queryTOUSchedule(String token) throws InterruptedException, JuiceNetApiException { - JuiceNetApiTouSchedule deviceTouSchedule; - try { - JsonObject jsonResponse = postApiCommand(ApiCommand.GET_SCHEDULE, token); - - deviceTouSchedule = new Gson().fromJson(jsonResponse, JuiceNetApiTouSchedule.class); - } catch (JsonSyntaxException e) { - throw new JuiceNetApiException("queryTOUSchedule from JuiceNet API failed, invalid JSON list."); - } catch (IllegalStateException e) { - throw new JuiceNetApiException("queryTOUSchedule from JuiceNet API failed - did not return valid array."); - } - - return Objects.requireNonNull(deviceTouSchedule); - } - - public void setOverride(String token, int energy_at_plugin, Long override_time, int energy_to_add) - throws InterruptedException, JuiceNetApiException { - Map params = new HashMap<>(); - - params.put("energy_at_plugin", Integer.toString(energy_at_plugin)); - params.put("override_time", Long.toString(override_time)); - params.put("energy_to_add", Integer.toString(energy_to_add)); - - postApiCommand(ApiCommand.SET_OVERRIDE, token, params); - } - - public void setCurrentLimit(String token, int limit) throws InterruptedException, JuiceNetApiException { - Map params = new HashMap<>(); - - params.put("amperage", Integer.toString(limit)); - - postApiCommand(ApiCommand.SET_OVERRIDE, token, params); - } - - public JsonObject postApiCommand(ApiCommand cmd, @Nullable String token) - throws InterruptedException, JuiceNetApiException { - Map params = new HashMap<>(); - - return postApiCommand(cmd, token, params); - } - - public JsonObject postApiCommand(ApiCommand cmd, @Nullable String token, Map params) - throws InterruptedException, JuiceNetApiException { - Request request = httpClient.POST(cmd.uri); - request.timeout(REQUEST_TIMEOUT_MS, TimeUnit.MILLISECONDS); - request.header(HttpHeader.CONTENT_TYPE, "application/json"); - - // Add required params - params.put("cmd", cmd.command); - params.put("device_id", bridgeUID.getAsString()); - params.put("account_token", apiToken); - - if (token != null) { - params.put("token", token); - } - - JsonObject jsonResponse; - try { - request.content(new StringContentProvider(new Gson().toJson(params)), "application/json"); - ContentResponse response = request.send(); - if (response.getStatus() != HttpStatus.OK_200) { - throw new JuiceNetApiException( - cmd.command + "from JuiceNet API unsuccessful, please check configuation. (HTTP code :" - + response.getStatus() + ")."); - } - - String responseString = response.getContentAsString(); - logger.trace("{}", responseString); - - jsonResponse = JsonParser.parseString(responseString).getAsJsonObject(); - JsonElement successElement = jsonResponse.get("success"); - if (successElement == null) { - throw new JuiceNetApiException( - cmd.command + " from JuiceNet API failed, 'success' element missing from response."); - } - boolean success = successElement.getAsBoolean(); - - if (!success) { - throw new JuiceNetApiException(cmd.command + " from JuiceNet API failed, please check configuration."); - } - } catch (IllegalStateException e) { - throw new JuiceNetApiException(cmd.command + " from JuiceNet API failed, invalid JSON."); - } catch (TimeoutException e) { - throw new JuiceNetApiException(cmd.command + " from JuiceNet API timeout."); - } catch (ExecutionException e) { - throw new JuiceNetApiException(cmd.command + " from JuiceNet API execution issue."); - } - - return jsonResponse; - } -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApiException.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApiException.java deleted file mode 100644 index 9bc4fd007c3..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/JuiceNetApiException.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -/** - * {@link JuiceNetApiException} implements an API Exception - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiException extends Exception { - private static final long serialVersionUID = 5421236828224242152L; - - public JuiceNetApiException(String message) { - super(message); - } -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiCar.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiCar.java deleted file mode 100644 index 5d4ec96f6e0..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiCar.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiCar } implements DTO for Car API call - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiCar { - @SerializedName("car_id") - public int carId; - public String description = ""; - @SerializedName("battery_size_wh") - public int batterySizeWH; - @SerializedName("battery_range_m") - public int batteryRangeM; - @SerializedName("charging_rate_w") - public int chargingRateW; - @SerializedName("model_id") - public String modelId = ""; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDevice.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDevice.java deleted file mode 100644 index 33a36893806..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDevice.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiDevice } implements DTO for Device Info API call - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiDevice { - public String name = ""; - public String token = ""; - @SerializedName("unit_id") - public String unitId = ""; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceChargingStatus.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceChargingStatus.java deleted file mode 100644 index eb38542aeef..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceChargingStatus.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiDeviceChargingStatus } implements DTO for device charging status - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiDeviceChargingStatus { - @SerializedName("amps_limit") - public int ampsLimit; - @SerializedName("amps_current") - public float ampsCurrent; - public int voltage; - @SerializedName("wh_energy") - public int whEnergy; - public int savings; - @SerializedName("watt_power") - public int wattPower; - @SerializedName("seconds_charging") - public int secondsCharging; - @SerializedName("wh_energy_at_plugin") - public int whEnergyAtPlugin; - @SerializedName("wh_energy_to_add") - public int whEnergyToAdd; - public int flags; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceLifetimeStatus.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceLifetimeStatus.java deleted file mode 100644 index 42ebf0606d1..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceLifetimeStatus.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiDeviceLifetimeStatus } implements DTO for Device Lifetime Status - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiDeviceLifetimeStatus { - @SerializedName("wh_energy") - public int whEnergy; - public int savings; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceStatus.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceStatus.java deleted file mode 100644 index 63da975285a..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiDeviceStatus.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiDeviceStatus } implements DTO for Device Status - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiDeviceStatus { - @SerializedName("ID") - public String id = ""; - @SerializedName("info_timestamp") - public Long infoTimestamp = (long) 0; - @SerializedName("show_override") - public boolean showOverride; - public String state = ""; - public JuiceNetApiDeviceChargingStatus charging = new JuiceNetApiDeviceChargingStatus(); - public JuiceNetApiDeviceLifetimeStatus lifetime = new JuiceNetApiDeviceLifetimeStatus(); - @SerializedName("charging_time_left") - public int chargingTimeLeft; - @SerializedName("plug_unplug_time") - public Long plugUnplugTime = (long) 0; - @SerializedName("target_time") - public Long targetTime = (long) 0; - @SerializedName("unit_time") - public Long unitTime = (long) 0; - @SerializedName("utc_time") - public Long utcTime = (long) 0; - @SerializedName("default_target_time") - public long defaultTargetTime = 0; - @SerializedName("car_id") - public int carId; - public int temperature; - public String message = ""; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiInfo.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiInfo.java deleted file mode 100644 index 3fc798021dd..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiInfo } implements DTO for Info - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiInfo { - public String name = ""; - public String address = ""; - public String city = ""; - public String zip = ""; - @SerializedName("country_code") - public String countryCode = ""; - public String ip = ""; - @SerializedName("gascost") - public int gasCost; - public int mpg; - public int ecost; - @SerializedName("whpermile") - public int whPerMile; - public String timeZoneId = ""; - @SerializedName("amps_wire_rating") - public int ampsWireRating; - @SerializedName("amps_unit_rating") - public int ampsUnitRating; - public JuiceNetApiCar[] cars = {}; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouDay.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouDay.java deleted file mode 100644 index 9cf4b87c8d8..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouDay.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -import com.google.gson.annotations.SerializedName; - -/** - * {@link JuiceNetApiTouDay } implements DTO for TOU settings - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiTouDay { - public int start; - public int end; - @SerializedName("car_ready_by") - public int carReadyBy; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouSchedule.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouSchedule.java deleted file mode 100644 index 36a4fc90e69..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/api/dto/JuiceNetApiTouSchedule.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.api.dto; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -/** - * {@link JuiceNetApiTouSchedule } implements DTO for TOU schedule - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetApiTouSchedule { - public String type = ""; - public JuiceNetApiTouDay weekday = new JuiceNetApiTouDay(); - public JuiceNetApiTouDay weenend = new JuiceNetApiTouDay(); -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/config/JuiceNetBridgeConfiguration.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/config/JuiceNetBridgeConfiguration.java deleted file mode 100644 index 1697bf5c133..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/config/JuiceNetBridgeConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.config; - -import org.eclipse.jdt.annotation.NonNullByDefault; - -/** - * The {@link JuiceNetBridgeConfiguration} class contains fields mapping thing configuration parameters. - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetBridgeConfiguration { - public String apiToken = ""; - public int refreshInterval = 60; -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/discovery/JuiceNetDiscoveryService.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/discovery/JuiceNetDiscoveryService.java deleted file mode 100644 index c90c15be858..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/discovery/JuiceNetDiscoveryService.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.discovery; - -import static org.openhab.binding.juicenet.internal.JuiceNetBindingConstants.*; - -import java.util.Set; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.openhab.binding.juicenet.internal.handler.JuiceNetBridgeHandler; -import org.openhab.core.config.discovery.AbstractThingHandlerDiscoveryService; -import org.openhab.core.config.discovery.DiscoveryResult; -import org.openhab.core.config.discovery.DiscoveryResultBuilder; -import org.openhab.core.thing.ThingTypeUID; -import org.openhab.core.thing.ThingUID; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.ServiceScope; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The {@link JuiceNetDiscoveryService} discovers all devices/zones reported by the FlumeTech Cloud. This requires the - * api - * key to get access to the cloud data. - * - * @author Jeff James - Initial contribution - */ -@Component(scope = ServiceScope.PROTOTYPE, service = JuiceNetDiscoveryService.class) -@NonNullByDefault -public class JuiceNetDiscoveryService extends AbstractThingHandlerDiscoveryService { - private final Logger logger = LoggerFactory.getLogger(JuiceNetDiscoveryService.class); - - private static final Set DISCOVERABLE_THING_TYPES_UIDS = Set.of(DEVICE_THING_TYPE); - - public JuiceNetDiscoveryService() { - super(JuiceNetBridgeHandler.class, DISCOVERABLE_THING_TYPES_UIDS, 0, false); - } - - @Override - protected synchronized void startScan() { - thingHandler.iterateApiDevices(); - } - - public void notifyDiscoveryDevice(String id, String name) { - ThingUID bridgeUID = thingHandler.getThing().getUID(); - - ThingUID uid = new ThingUID(DEVICE_THING_TYPE, bridgeUID, id); - - DiscoveryResult result = DiscoveryResultBuilder.create(uid).withBridge(bridgeUID) - .withProperty(PARAMETER_UNIT_ID, id).withLabel(name).build(); - thingDiscovered(result); - logger.debug("Discovered JuiceNetDevice {} - {}", uid, name); - } -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetBridgeHandler.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetBridgeHandler.java deleted file mode 100644 index 962d2c232d8..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetBridgeHandler.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.handler; - -import static org.openhab.binding.juicenet.internal.JuiceNetBindingConstants.*; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.jetty.client.HttpClient; -import org.openhab.binding.juicenet.internal.api.JuiceNetApi; -import org.openhab.binding.juicenet.internal.api.JuiceNetApiException; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiDevice; -import org.openhab.binding.juicenet.internal.config.JuiceNetBridgeConfiguration; -import org.openhab.binding.juicenet.internal.discovery.JuiceNetDiscoveryService; -import org.openhab.core.config.core.Configuration; -import org.openhab.core.thing.Bridge; -import org.openhab.core.thing.ChannelUID; -import org.openhab.core.thing.Thing; -import org.openhab.core.thing.ThingStatus; -import org.openhab.core.thing.ThingStatusDetail; -import org.openhab.core.thing.binding.BaseBridgeHandler; -import org.openhab.core.thing.binding.ThingHandler; -import org.openhab.core.thing.binding.ThingHandlerService; -import org.openhab.core.types.Command; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The {@link JuiceNetBridgeHandler} is responsible for handling commands, which are - * sent to one of the channels. - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetBridgeHandler extends BaseBridgeHandler { - - private final Logger logger = LoggerFactory.getLogger(JuiceNetBridgeHandler.class); - - private JuiceNetBridgeConfiguration config = new JuiceNetBridgeConfiguration(); - private final JuiceNetApi api; - - public JuiceNetApi getApi() { - return api; - } - - private @Nullable ScheduledFuture pollingJob; - private @Nullable JuiceNetDiscoveryService discoveryService; - - public JuiceNetBridgeHandler(Bridge bridge, HttpClient httpClient) { - super(bridge); - - this.api = new JuiceNetApi(httpClient, getThing().getUID()); - } - - @Override - public void handleCommand(ChannelUID channelUID, Command command) { - } - - @Override - public void initialize() { - config = getConfigAs(JuiceNetBridgeConfiguration.class); - - logger.trace("Bridge initialized: {}", Objects.requireNonNull(getThing()).getUID()); - - api.setApiToken(config.apiToken); - - updateStatus(ThingStatus.UNKNOWN); - // Bridge will go online after the first successful API call in iterateApiDevices. iterateApiDevices will be - // called when a child device attempts to goOnline and needs to retrieve the api token - - pollingJob = scheduler.scheduleWithFixedDelay(this::pollDevices, 10, config.refreshInterval, TimeUnit.SECONDS); - - // Call here in order to discover any devices. - iterateApiDevices(); - } - - @Override - public void dispose() { - logger.debug("Handler disposed."); - ScheduledFuture pollingJob = this.pollingJob; - if (pollingJob != null) { - pollingJob.cancel(true); - this.pollingJob = null; - } - } - - public void setDiscoveryService(JuiceNetDiscoveryService discoveryService) { - this.discoveryService = discoveryService; - } - - @Override - public void childHandlerInitialized(ThingHandler childHandler, Thing childThing) { - // Call here to set the Api Token for any newly initialized Child devices - iterateApiDevices(); - } - - /** - * Get the services registered for this bridge. Provides the discovery service. - */ - @Override - public Collection> getServices() { - return Set.of(JuiceNetDiscoveryService.class); - } - - public void handleApiException(Exception e) { - if (e instanceof JuiceNetApiException) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.toString()); - } else if (e instanceof InterruptedException) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.toString()); - Thread.currentThread().interrupt(); - } else { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.NONE, e.toString()); - } - } - - @Nullable - public Thing getThingById(String id) { - List childThings = getThing().getThings(); - - for (Thing childThing : childThings) { - Configuration configuration = childThing.getConfiguration(); - - String childId = configuration.get(PARAMETER_UNIT_ID).toString(); - - if (childId.equals(id)) { - return childThing; - } - } - - return null; - } - - // This function will query the list of devices from the API and then set the name/token in the child handlers. If a - // child does not exist, it will notify the Discovery service. If it is successful, it will ensure the bridge status - // is updated - // to ONLINE. - public void iterateApiDevices() { - List listDevices; - - try { - listDevices = api.queryDeviceList(); - } catch (JuiceNetApiException | InterruptedException e) { - handleApiException(e); - return; - } - - if (getThing().getStatus() != ThingStatus.ONLINE) { - updateStatus(ThingStatus.ONLINE); - } - - JuiceNetDiscoveryService discoveryService = this.discoveryService; - for (JuiceNetApiDevice dev : listDevices) { - Thing childThing = getThingById(dev.unitId); - if (childThing == null) { - if (discoveryService != null) { - discoveryService.notifyDiscoveryDevice(dev.unitId, dev.name); - } - } else { - JuiceNetDeviceHandler childHandler = (JuiceNetDeviceHandler) childThing.getHandler(); - if (childHandler != null) { - childHandler.setNameAndToken(dev.name, dev.token); - } - } - } - } - - private void pollDevices() { - List things = getThing().getThings(); - - for (Thing t : things) { - if (!t.getThingTypeUID().equals(DEVICE_THING_TYPE)) { - continue; - } - - JuiceNetDeviceHandler handler = (JuiceNetDeviceHandler) t.getHandler(); - if (handler == null) { - logger.trace("no handler for thing: {}", t.getUID()); - continue; - } - - handler.queryDeviceStatusAndInfo(); - } - } -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetDeviceHandler.java b/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetDeviceHandler.java deleted file mode 100644 index 4152ad147ff..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/java/org/openhab/binding/juicenet/internal/handler/JuiceNetDeviceHandler.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) 2010-2025 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.juicenet.internal.handler; - -import static org.openhab.binding.juicenet.internal.JuiceNetBindingConstants.*; - -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.time.temporal.ChronoField; -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; -import org.openhab.binding.juicenet.internal.api.JuiceNetApi; -import org.openhab.binding.juicenet.internal.api.JuiceNetApiException; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiCar; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiDeviceStatus; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiInfo; -import org.openhab.binding.juicenet.internal.api.dto.JuiceNetApiTouSchedule; -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.OnOffType; -import org.openhab.core.library.types.QuantityType; -import org.openhab.core.library.types.StringType; -import org.openhab.core.library.unit.ImperialUnits; -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; -import org.openhab.core.thing.ThingStatus; -import org.openhab.core.thing.ThingStatusDetail; -import org.openhab.core.thing.binding.BaseThingHandler; -import org.openhab.core.thing.binding.BridgeHandler; -import org.openhab.core.types.Command; -import org.openhab.core.types.RefreshType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The {@link JuiceNetDeviceHandler} is responsible for handling commands, which are - * sent to one of the channels. - * - * @author Jeff James - Initial contribution - */ -@NonNullByDefault -public class JuiceNetDeviceHandler extends BaseThingHandler { - - private final Logger logger = LoggerFactory.getLogger(JuiceNetDeviceHandler.class); - - // properties - private String name = ""; - - private String token = ""; - private long targetTimeTou = 0; - private long lastInfoTimestamp = 0; - - JuiceNetApiDeviceStatus deviceStatus = new JuiceNetApiDeviceStatus(); - JuiceNetApiInfo deviceInfo = new JuiceNetApiInfo(); - JuiceNetApiTouSchedule deviceTouSchedule = new JuiceNetApiTouSchedule(); - JuiceNetApiCar deviceCar = new JuiceNetApiCar(); - - public JuiceNetDeviceHandler(Thing thing) { - super(thing); - } - - public void setNameAndToken(String name, String token) { - logger.trace("setNameAndToken"); - this.token = token; - - if (!name.equals(this.name)) { - updateProperty(PROPERTY_NAME, name); - this.name = name; - } - - if (getThing().getStatus() != ThingStatus.ONLINE) { - goOnline(); - } - } - - @Override - public void initialize() { - logger.trace("Device initialized: {}", Objects.requireNonNull(getThing().getUID())); - Configuration configuration = getThing().getConfiguration(); - - String stringId = configuration.get(PARAMETER_UNIT_ID).toString(); - if (stringId.isEmpty()) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, - "@text/offline.configuration-error.id-missing"); - return; - } - - updateStatus(ThingStatus.UNKNOWN); - - // This device will go ONLINE on the first successful API call in queryDeviceStatusAndInfo - } - - private void handleApiException(Exception e) { - if (e instanceof JuiceNetApiException) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.toString()); - } else if (e instanceof InterruptedException) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.COMMUNICATION_ERROR, e.toString()); - Thread.currentThread().interrupt(); - } else { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.NONE, e.toString()); - } - } - - private void goOnline() { - logger.trace("goOnline"); - if (this.getThing().getStatus() == ThingStatus.ONLINE) { - return; - } - - if (token.isEmpty()) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, - "@text/offline.configuration-error.non-existent-device"); - return; - } - - try { - tryQueryDeviceStatusAndInfo(); - } catch (JuiceNetApiException | InterruptedException e) { - handleApiException(e); - return; - } - - updateStatus(ThingStatus.ONLINE); - } - - @Nullable - private JuiceNetApi getApi() { - Bridge bridge = getBridge(); - if (bridge == null) { - updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.OFFLINE.CONFIGURATION_ERROR, - "@text/offline.configuration-error.bridge-missing"); - return null; - } - BridgeHandler handler = Objects.requireNonNull(bridge.getHandler()); - - return ((JuiceNetBridgeHandler) handler).getApi(); - } - - @Override - public void handleCommand(ChannelUID channelUID, Command command) { - JuiceNetApi api = getApi(); - if (api == null) { - return; - } - - if (command instanceof RefreshType) { - switch (channelUID.getId()) { - case CHANNEL_NAME: - case CHANNEL_STATE: - case CHANNEL_MESSAGE: - case CHANNEL_OVERRIDE: - case CHANNEL_CHARGING_TIME_LEFT: - case CHANNEL_PLUG_UNPLUG_TIME: - case CHANNEL_TARGET_TIME: - case CHANNEL_UNIT_TIME: - case CHANNEL_TEMPERATURE: - case CHANNEL_CURRENT_LIMIT: - case CHANNEL_CURRENT: - case CHANNEL_VOLTAGE: - case CHANNEL_ENERGY: - case CHANNEL_SAVINGS: - case CHANNEL_POWER: - case CHANNEL_CHARGING_TIME: - case CHANNEL_ENERGY_AT_PLUGIN: - case CHANNEL_ENERGY_TO_ADD: - case CHANNEL_LIFETIME_ENERGY: - case CHANNEL_LIFETIME_SAVINGS: - case CHANNEL_CAR_DESCRIPTION: - case CHANNEL_CAR_BATTERY_SIZE: - case CHANNEL_CAR_BATTERY_RANGE: - case CHANNEL_CAR_CHARGING_RATE: - refreshStatusChannels(); - break; - case CHANNEL_GAS_COST: - case CHANNEL_FUEL_CONSUMPTION: - case CHANNEL_ECOST: - case CHANNEL_ENERGY_PER_MILE: - refreshInfoChannels(); - break; - } - - return; - } - - try { - switch (channelUID.getId()) { - case CHANNEL_CURRENT_LIMIT: - int limit = ((QuantityType) command).intValue(); - api.setCurrentLimit(Objects.requireNonNull(token), limit); - break; - case CHANNEL_TARGET_TIME: { - int energyAtPlugin = 0; - int energyToAdd = deviceCar.batterySizeWH; - - if (!(command instanceof DateTimeType)) { - logger.info("Target Time is not an instance of DateTimeType"); - return; - } - - ZonedDateTime datetime = ((DateTimeType) command).getZonedDateTime(ZoneId.systemDefault()); - Long targetTime = datetime.toEpochSecond() + datetime.get(ChronoField.OFFSET_SECONDS); - logger.debug("DateTime: {} - {}", datetime.toString(), targetTime); - - api.setOverride(Objects.requireNonNull(token), energyAtPlugin, targetTime, energyToAdd); - - break; - } - case CHANNEL_CHARGING_STATE: { - String state = ((StringType) command).toString(); - Long overrideTime = deviceStatus.unitTime; - int energyAtPlugin = 0; - int energyToAdd = deviceCar.batterySizeWH; - - switch (state) { - case "stop": - if (targetTimeTou == 0) { - targetTimeTou = deviceStatus.targetTime; - } - overrideTime = deviceStatus.unitTime + 31556926; - break; - case "start": - if (targetTimeTou == 0) { - targetTimeTou = deviceStatus.targetTime; - } - overrideTime = deviceStatus.unitTime; - break; - case "smart": - overrideTime = deviceStatus.defaultTargetTime; - break; - } - - api.setOverride(Objects.requireNonNull(token), energyAtPlugin, overrideTime, energyToAdd); - - break; - } - case CHANNEL_OVERRIDE: { - if (command instanceof OnOffType onOffCommand && OnOffType.OFF.equals(onOffCommand)) { - api.setOverride(Objects.requireNonNull(token), 0, ((long) 0), 0); - } - - break; - } - } - } catch (JuiceNetApiException | InterruptedException e) { - handleApiException(e); - return; - } - } - - private void tryQueryDeviceStatusAndInfo() throws JuiceNetApiException, InterruptedException { - String apiToken = Objects.requireNonNull(this.token); - JuiceNetApi api = getApi(); - if (api == null) { - return; - } - - deviceStatus = api.queryDeviceStatus(apiToken); - - if (deviceStatus.infoTimestamp > lastInfoTimestamp) { - lastInfoTimestamp = deviceStatus.infoTimestamp; - - deviceInfo = api.queryInfo(apiToken); - deviceTouSchedule = api.queryTOUSchedule(apiToken); - refreshInfoChannels(); - } - - int carId = deviceStatus.carId; - for (JuiceNetApiCar car : deviceInfo.cars) { - if (car.carId == carId) { - this.deviceCar = car; - break; - } - } - - refreshStatusChannels(); - } - - public void queryDeviceStatusAndInfo() { - logger.trace("queryStatusAndInfo"); - ThingStatus status = getThing().getStatus(); - - if (status != ThingStatus.ONLINE) { - goOnline(); - return; - } - - try { - tryQueryDeviceStatusAndInfo(); - } catch (JuiceNetApiException | InterruptedException e) { - handleApiException(e); - return; - } - } - - private void refreshStatusChannels() { - updateState(CHANNEL_STATE, new StringType(deviceStatus.state)); - - if (deviceStatus.targetTime <= deviceStatus.unitTime) { - updateState(CHANNEL_CHARGING_STATE, new StringType("start")); - } else if ((deviceStatus.targetTime - deviceStatus.unitTime) < TimeUnit.DAYS.toSeconds(2)) { - updateState(CHANNEL_CHARGING_STATE, new StringType("smart")); - } else { - updateState(CHANNEL_CHARGING_STATE, new StringType("stop")); - } - - updateState(CHANNEL_MESSAGE, new StringType(deviceStatus.message)); - updateState(CHANNEL_OVERRIDE, OnOffType.from(deviceStatus.showOverride)); - updateState(CHANNEL_CHARGING_TIME_LEFT, new QuantityType<>(deviceStatus.chargingTimeLeft, Units.SECOND)); - updateState(CHANNEL_PLUG_UNPLUG_TIME, new DateTimeType(Instant.ofEpochSecond(deviceStatus.plugUnplugTime))); - updateState(CHANNEL_TARGET_TIME, new DateTimeType(Instant.ofEpochSecond(deviceStatus.targetTime))); - updateState(CHANNEL_UNIT_TIME, new DateTimeType(Instant.ofEpochSecond(deviceStatus.utcTime))); - updateState(CHANNEL_TEMPERATURE, new QuantityType<>(deviceStatus.temperature, SIUnits.CELSIUS)); - updateState(CHANNEL_CURRENT_LIMIT, new QuantityType<>(deviceStatus.charging.ampsLimit, Units.AMPERE)); - updateState(CHANNEL_CURRENT, new QuantityType<>(deviceStatus.charging.ampsCurrent, Units.AMPERE)); - updateState(CHANNEL_VOLTAGE, new QuantityType<>(deviceStatus.charging.voltage, Units.VOLT)); - updateState(CHANNEL_ENERGY, new QuantityType<>(deviceStatus.charging.whEnergy, Units.WATT_HOUR)); - updateState(CHANNEL_SAVINGS, new DecimalType(deviceStatus.charging.savings / 100.0)); - updateState(CHANNEL_POWER, new QuantityType<>(deviceStatus.charging.wattPower, Units.WATT)); - updateState(CHANNEL_CHARGING_TIME, new QuantityType<>(deviceStatus.charging.secondsCharging, Units.SECOND)); - updateState(CHANNEL_ENERGY_AT_PLUGIN, - new QuantityType<>(deviceStatus.charging.whEnergyAtPlugin, Units.WATT_HOUR)); - updateState(CHANNEL_ENERGY_TO_ADD, new QuantityType<>(deviceStatus.charging.whEnergyToAdd, Units.WATT_HOUR)); - updateState(CHANNEL_LIFETIME_ENERGY, new QuantityType<>(deviceStatus.lifetime.whEnergy, Units.WATT_HOUR)); - updateState(CHANNEL_LIFETIME_SAVINGS, new DecimalType(deviceStatus.lifetime.savings / 100.0)); - - // update Car items - updateState(CHANNEL_CAR_DESCRIPTION, new StringType(deviceCar.description)); - updateState(CHANNEL_CAR_BATTERY_SIZE, new QuantityType<>(deviceCar.batterySizeWH, Units.WATT_HOUR)); - updateState(CHANNEL_CAR_BATTERY_RANGE, new QuantityType<>(deviceCar.batteryRangeM, ImperialUnits.MILE)); - updateState(CHANNEL_CAR_CHARGING_RATE, new QuantityType<>(deviceCar.chargingRateW, Units.WATT)); - } - - private void refreshInfoChannels() { - updateState(CHANNEL_NAME, new StringType(name)); - updateState(CHANNEL_GAS_COST, new DecimalType(deviceInfo.gasCost / 100.0)); - // currently there is no unit defined for fuel consumption - updateState(CHANNEL_FUEL_CONSUMPTION, new DecimalType(deviceInfo.mpg)); - updateState(CHANNEL_ECOST, new DecimalType(deviceInfo.ecost / 100.0)); - updateState(CHANNEL_ENERGY_PER_MILE, new DecimalType(deviceInfo.whPerMile)); - } -} diff --git a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/addon/addon.xml b/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/addon/addon.xml deleted file mode 100644 index cd2b7e91e41..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/addon/addon.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - binding - JuiceNet Binding - This is the binding supporting the JuiceNet EV charger. - local - - diff --git a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet.properties b/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet.properties deleted file mode 100644 index 31fe45e2494..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet.properties +++ /dev/null @@ -1,98 +0,0 @@ -# add-on - -addon.juicenet.name = JuiceNet Binding -addon.juicenet.description = This is the binding supporting the JuiceNet EV charger. - -# thing types - -thing-type.juicenet.account.label = JuiceNet Account -thing-type.juicenet.account.description = This is the account for which your device(s) are registered at home.juice.net. -thing-type.juicenet.device.label = JuiceBox Charger -thing-type.juicenet.device.description = JuiceBox EV Charger - -# thing types config - -thing-type.config.juicenet.account.apiToken.label = API Token -thing-type.config.juicenet.account.apiToken.description = API Token from the user profile page. (https://home.juice.net/Manage) -thing-type.config.juicenet.account.refreshInterval.label = Refresh Interval -thing-type.config.juicenet.account.refreshInterval.description = Interval the device is polled in seconds. -thing-type.config.juicenet.device.unitID.label = Unit ID -thing-type.config.juicenet.device.unitID.description = EV charger Unit ID from the JuiceNet webpage. (https://home.juice.net) - -# channel types - -channel-type.juicenet.carBatteryRange.label = Mileage Range -channel-type.juicenet.carBatteryRange.description = Car distance range. -channel-type.juicenet.carBatterySize.label = Car Battery Pack Size -channel-type.juicenet.carBatterySize.description = Car battery pack size. -channel-type.juicenet.carChargingRate.label = Car Charging Rate -channel-type.juicenet.carChargingRate.description = Car charging rate. -channel-type.juicenet.carDescription.label = Car Description -channel-type.juicenet.carDescription.description = Car description of vehicle currently or last charged. -channel-type.juicenet.chargingState.label = Charging State -channel-type.juicenet.chargingState.description = The charging state (Start Charging, Smart Charging, Stop Charging). -channel-type.juicenet.chargingState.state.option.start = Start Charging -channel-type.juicenet.chargingState.state.option.smart = Smart Charging -channel-type.juicenet.chargingState.state.option.stop = Stop Charging -channel-type.juicenet.chargingTime.label = Charging Time -channel-type.juicenet.chargingTime.description = Charging time since plug-in time. -channel-type.juicenet.chargingTimeLeft.label = Charging Time Left -channel-type.juicenet.chargingTimeLeft.description = Charging time left. -channel-type.juicenet.current.label = Current -channel-type.juicenet.current.description = Current charging current. -channel-type.juicenet.currentLimit.label = Current Limit -channel-type.juicenet.currentLimit.description = Max charging current allowed. -channel-type.juicenet.ecost.label = Utility Energy Cost -channel-type.juicenet.ecost.description = Cost of electricity from utility company. (currency / kWh) -channel-type.juicenet.energy.label = Current Energy -channel-type.juicenet.energy.description = Current power level of vehicle. -channel-type.juicenet.energyAtPlugin.label = Energy at Plugin -channel-type.juicenet.energyAtPlugin.description = Energy value at the plugging time. -channel-type.juicenet.energyPerMile.label = Energy Hours Per Mile -channel-type.juicenet.energyPerMile.description = Energy Hours Per Mile. -channel-type.juicenet.energyToAdd.label = Energy to Add -channel-type.juicenet.energyToAdd.description = Amount of energy to be added in current session. -channel-type.juicenet.fuelConsumption.label = Fuel consumption -channel-type.juicenet.fuelConsumption.description = Distance per volume (mpg) used in savings calculations. -channel-type.juicenet.gasCost.label = Gas Cost -channel-type.juicenet.gasCost.description = Cost of gasoline used in savings calculations. -channel-type.juicenet.lifetimeEnergy.label = Lifetime Energy -channel-type.juicenet.lifetimeEnergy.description = Total energy delivered to vehicles during lifetime. -channel-type.juicenet.lifetimeSavings.label = Lifetime Savings -channel-type.juicenet.lifetimeSavings.description = EV driving saving during lifetime. -channel-type.juicenet.message.label = State Message -channel-type.juicenet.message.description = This is a message detailing the state of the EV charger. -channel-type.juicenet.name.label = Name -channel-type.juicenet.name.description = Juice Box name. -channel-type.juicenet.override.label = Override State -channel-type.juicenet.override.description = Smart charging is overridden. -channel-type.juicenet.plugUnplugTime.label = Plug/Unplug Time -channel-type.juicenet.plugUnplugTime.description = Last time of either plug-in or plug-out. -channel-type.juicenet.plugUnplugTime.state.pattern = %1$tB %1$te, %1$tY %1$tl:%1$tM %1$tp -channel-type.juicenet.power.label = Charging Power -channel-type.juicenet.power.description = Current charging power. -channel-type.juicenet.savings.label = Savings -channel-type.juicenet.savings.description = Current session EV savings. -channel-type.juicenet.state.label = Device State -channel-type.juicenet.state.description = This is the current device state (Available, Plugged-In, Charging, Error, Disconnected). -channel-type.juicenet.state.state.option.standby = Available -channel-type.juicenet.state.state.option.plugged = Plugged-In -channel-type.juicenet.state.state.option.charging = Charging -channel-type.juicenet.state.state.option.error = Error -channel-type.juicenet.state.state.option.disconnect = Disconnected -channel-type.juicenet.targetTime.label = Target Time -channel-type.juicenet.targetTime.description = “Start charging” start time, or time to start when overriding smart charging. -channel-type.juicenet.targetTime.state.pattern = %1$tB %1$te, %1$tY %1$tl:%1$tM %1$tp -channel-type.juicenet.temperature.label = Temperature -channel-type.juicenet.temperature.description = Current temperature at the unit. -channel-type.juicenet.unitTime.label = Unit Time -channel-type.juicenet.unitTime.description = Current time on the unit. -channel-type.juicenet.unitTime.state.pattern = %1$tB %1$te, %1$tY %1$tl:%1$tM %1$tp -channel-type.juicenet.voltage.label = Voltage -channel-type.juicenet.voltage.description = Current voltage. - -# offline configuration errors - -offline.configuration-error.id-missing = Must include an id in the configuration for the device. -offline.configuration-error.non-existent-device = Device does not exist as part of this JuiceNet Account -offline.configuration-error.bridge-missing = The JuiceBox device must be associated with a JuiceNet Account bridge diff --git a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet_it.properties b/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet_it.properties deleted file mode 100644 index 156f8297428..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/i18n/juicenet_it.properties +++ /dev/null @@ -1,98 +0,0 @@ -# add-on - -addon.juicenet.name = Binding JuiceNet -addon.juicenet.description = Questo è il gestore che supporta il caricabatterie JuiceNet EV. - -# thing types - -thing-type.juicenet.account.label = Iscrizione JuiceNet -thing-type.juicenet.account.description = Questo è l'iscrizione per il quale i tuoi dispositivi sono registrati su home.juice.net. -thing-type.juicenet.device.label = Caricabatterie JuiceBox -thing-type.juicenet.device.description = Caricabatterie JuiceBox EV - -# thing types config - -thing-type.config.juicenet.account.apiToken.label = Chiave API -thing-type.config.juicenet.account.apiToken.description = Chiave API dalla pagina del profilo utente (https\://home.juice.net/Manage) -thing-type.config.juicenet.account.refreshInterval.label = Intervallo di aggiornamento -thing-type.config.juicenet.account.refreshInterval.description = Intervallo di tempo delle interrogazioni al dispositivo, in secondi. -thing-type.config.juicenet.device.unitID.label = ID unità -thing-type.config.juicenet.device.unitID.description = ID dell'unità caricabatterie EV dalla pagina web JuiceNet. (https\://home.juice.net) - -# channel types - -channel-type.juicenet.carBatteryRange.label = Distanza percorribile -channel-type.juicenet.carBatteryRange.description = Massima distanza percorribile dall'automobile. -channel-type.juicenet.carBatterySize.label = Dimensione pacco batteria auto -channel-type.juicenet.carBatterySize.description = Dimensione pacco batteria auto. -channel-type.juicenet.carChargingRate.label = Tariffa ricarica auto -channel-type.juicenet.carChargingRate.description = Tariffa ricarica auto. -channel-type.juicenet.carDescription.label = Descrizione auto -channel-type.juicenet.carDescription.description = Descrizione del veicolo attualmente in carica o dell'ultimo in carica. -channel-type.juicenet.chargingState.label = Stato ricarica -channel-type.juicenet.chargingState.description = Stato della ricarica (Ricarica iniziata, Ricarica intelligente, Ricarica completata). -channel-type.juicenet.chargingState.state.option.start = Ricarica iniziata -channel-type.juicenet.chargingState.state.option.smart = Ricarica intelligente -channel-type.juicenet.chargingState.state.option.stop = Ricarica completata -channel-type.juicenet.chargingTime.label = Tempo di ricarica -channel-type.juicenet.chargingTime.description = Tempo di ricarica dall'inizio. -channel-type.juicenet.chargingTimeLeft.label = Tempo di ricarica rimasto -channel-type.juicenet.chargingTimeLeft.description = Tempo di ricarica rimasto. -channel-type.juicenet.current.label = Corrente -channel-type.juicenet.current.description = Corrente di ricarica. -channel-type.juicenet.currentLimit.label = Limite corrente -channel-type.juicenet.currentLimit.description = Corrente di ricarica massima consentita. -channel-type.juicenet.ecost.label = Costo energia rivenditore -channel-type.juicenet.ecost.description = Costo dell'energia elettrica dal rivenditore (valuta / kWh) -channel-type.juicenet.energy.label = Livello potenza attuale -channel-type.juicenet.energy.description = Livello di potenza attuale del veicolo. -channel-type.juicenet.energyAtPlugin.label = Livello di potenza all'avvio -channel-type.juicenet.energyAtPlugin.description = Livello di potenza al momento dell'avvio. -channel-type.juicenet.energyPerMile.label = Ore di energia per miglia -channel-type.juicenet.energyPerMile.description = Ore di energia per miglia. -channel-type.juicenet.energyToAdd.label = Energia da caricare -channel-type.juicenet.energyToAdd.description = Quantità di energia da caricare durante la sessione corrente. -channel-type.juicenet.fuelConsumption.label = Consumo di carburante -channel-type.juicenet.fuelConsumption.description = Distanza per volume (mpg) utilizzata nei calcoli di risparmio energetico. -channel-type.juicenet.gasCost.label = Costo della benzina -channel-type.juicenet.gasCost.description = Costo della benzina utilizzata nei calcoli di risparmio energetico. -channel-type.juicenet.lifetimeEnergy.label = Energia totale -channel-type.juicenet.lifetimeEnergy.description = Energia totale fornita al veicolo durante la sua vita. -channel-type.juicenet.lifetimeSavings.label = Risparmio globale -channel-type.juicenet.lifetimeSavings.description = Risparmio ottenuto grazie alla "guida EV" durante l'intera la vita del veicolo. -channel-type.juicenet.message.label = Messaggio di stato -channel-type.juicenet.message.description = Questo è un messaggio che descrive lo stato del caricabatterie EV. -channel-type.juicenet.name.label = Nome -channel-type.juicenet.name.description = Nome Juice box. -channel-type.juicenet.override.label = Stato sovrascrittura -channel-type.juicenet.override.description = La ricarica intelligente è ignorata. -channel-type.juicenet.plugUnplugTime.label = Tempo Inizio/Scollegamento -channel-type.juicenet.plugUnplugTime.description = La durata dell'ultima carica, dall'inizio allo sollegamento. -channel-type.juicenet.plugUnplugTime.state.pattern = %1$tB %1$te, %1$tY %1$tl\:%1$tM %1$tp -channel-type.juicenet.power.label = Potenza di ricarica -channel-type.juicenet.power.description = Potenza di ricarica attuale. -channel-type.juicenet.savings.label = Risparmio -channel-type.juicenet.savings.description = Il risparmio EV ottenuto con la sessione corrente. -channel-type.juicenet.state.label = Stato del dispositivo -channel-type.juicenet.state.description = Stato attuale del dispositivo (Disponibile, Connesso, In carica, Errore, Disconnesso). -channel-type.juicenet.state.state.option.standby = Disponibile -channel-type.juicenet.state.state.option.plugged = Connesso -channel-type.juicenet.state.state.option.charging = In carica -channel-type.juicenet.state.state.option.error = Errore -channel-type.juicenet.state.state.option.disconnect = Disconnesso -channel-type.juicenet.targetTime.label = Orario obiettivo -channel-type.juicenet.targetTime.description = “Inizia la ricarica”\: ora d'inizio o ora d'inizio della sovrascrittura della ricarica intelligente. -channel-type.juicenet.targetTime.state.pattern = %1$tB %1$te, %1$tY %1$tl\:%1$tM %1$tp -channel-type.juicenet.temperature.label = Temperatura -channel-type.juicenet.temperature.description = Temperatura corrente dell'unità. -channel-type.juicenet.unitTime.label = Orario dell'unità -channel-type.juicenet.unitTime.description = Orario attuale dell'unità. -channel-type.juicenet.unitTime.state.pattern = %1$tB %1$te, %1$tY %1$tl\:%1$tM %1$tp -channel-type.juicenet.voltage.label = Tensione -channel-type.juicenet.voltage.description = Tensione attuale. - -# offline configuration errors - -offline.configuration-error.id-missing = Deve includere un Identificativo nella configurazione del dispositivo. -offline.configuration-error.non-existent-device = Il dispositivo non esiste come parte di questa registrazione JuiceNet -offline.configuration-error.bridge-missing = Il dispositivo JuiceBox deve essere associato a una registrazione "ponte" JuiceNet diff --git a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-account.xml b/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-account.xml deleted file mode 100644 index 40e76cf361d..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-account.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - This is the account for which your device(s) are registered at home.juice.net. - - - - - API Token from the user profile page. (https://home.juice.net/Manage) - - - - Interval the device is polled in seconds. - 60 - - - - diff --git a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-device.xml b/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-device.xml deleted file mode 100644 index e1249391953..00000000000 --- a/bundles/org.openhab.binding.juicenet/src/main/resources/OH-INF/thing/juicenet-device.xml +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - JuiceBox EV Charger - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - unitID - - - - - EV charger Unit ID from the JuiceNet webpage. (https://home.juice.net) - - - - - - String - - Juice Box name. - - - - - String - - The charging state (Start Charging, Smart Charging, Stop Charging). - - - - - - - - recommend - - - - String - - This is the current device state (Available, Plugged-In, Charging, Error, Disconnected). - - - - - - - - - - - - - String - - This is a message detailing the state of the EV charger. - - - - - Switch - - Smart charging is overridden. - - - - - Number:Time - - Charging time left. - Time - - - - - DateTime - - Last time of either plug-in or plug-out. - Time - - - - - DateTime - - “Start charging” start time, or time to start when overriding smart charging. - Time - - - - - DateTime - - Current time on the unit. - Time - - - - - Number:Temperature - - Current temperature at the unit. - Temperature - - - - - Number:ElectricCurrent - - Max charging current allowed. - - - - - Number:ElectricCurrent - - Current charging current. - - - - - Number:ElectricPotential - - Current voltage. - - - - - Number:Energy - - Current power level of vehicle. - - - - - Number - - Current session EV savings. - - - - - Number:Power - - Current charging power. - - - - - Number:Time - - Charging time since plug-in time. - Time - - - - - Number:Energy - - Energy value at the plugging time. - - - - - Number:Energy - - Amount of energy to be added in current session. - - - - - Number:Energy - - Total energy delivered to vehicles during lifetime. - - - - - Number - - EV driving saving during lifetime. - - - - - Number - - Cost of gasoline used in savings calculations. - - - - - Number - - Distance per volume (mpg) used in savings calculations. - - - - - Number - - Cost of electricity from utility company. (currency / kWh) - - - - - Number:Power - - Energy Hours Per Mile. - - - - - String - - Car description of vehicle currently or last charged. - - - - - Number:Energy - - Car battery pack size. - - - - - Number:Length - - Car distance range. - - - - - Number:Power - - Car charging rate. - - - - diff --git a/bundles/pom.xml b/bundles/pom.xml index 2cb3218ffd6..af78d0858f8 100644 --- a/bundles/pom.xml +++ b/bundles/pom.xml @@ -216,7 +216,6 @@ org.openhab.binding.jablotron org.openhab.binding.jeelink org.openhab.binding.jellyfin - org.openhab.binding.juicenet org.openhab.binding.kaleidescape org.openhab.binding.keba org.openhab.binding.km200