From e8799ee5bd3a83447d1b510bc97808faf5125e65 Mon Sep 17 00:00:00 2001 From: dag81 Date: Tue, 4 Jun 2024 18:37:48 +0100 Subject: [PATCH] [linkTap] Initial Code Commit [linkTap] Initial code commit. Signed-off-by: dag81 --- bundles/org.openhab.binding.linktap/NOTICE | 13 + bundles/org.openhab.binding.linktap/README.md | 201 ++++++ .../Saved/LinkTapHandler.java | 559 ++++++++++++++ bundles/org.openhab.binding.linktap/pom.xml | 36 + .../src/main/feature/feature.xml | 10 + .../LinkTapBridgeConfiguration.java | 28 + .../LinkTapDeviceConfiguration.java | 27 + .../linktap/internal/BridgeManager.java | 81 +++ .../DeviceMetaDataUpdatedHandler.java | 25 + .../binding/linktap/internal/IBridgeData.java | 23 + .../internal/LinkTapBindingConstants.java | 200 +++++ .../LinkTapBridgeDiscoveryService.java | 248 +++++++ .../internal/LinkTapBridgeHandler.java | 496 +++++++++++++ .../internal/LinkTapDeviceConfiguration.java | 43 ++ .../LinkTapDeviceDiscoveryService.java | 103 +++ .../internal/LinkTapDeviceMetadata.java | 40 + .../linktap/internal/LinkTapHandler.java | 429 +++++++++++ .../internal/LinkTapHandlerFactory.java | 89 +++ .../linktap/internal/LookupWrapper.java | 90 +++ .../internal/PollingDeviceHandler.java | 334 +++++++++ .../internal/TransactionProcessor.java | 315 ++++++++ .../binding/linktap/internal/Utils.java | 39 + .../protocol/frames/AlertStateReq.java | 52 ++ .../linktap/protocol/frames/DeviceCmdReq.java | 56 ++ .../protocol/frames/DismissAlertReq.java | 85 +++ .../frames/EndpointDeviceResponse.java | 51 ++ .../protocol/frames/GatewayConfigResp.java | 73 ++ .../frames/GatewayDeviceResponse.java | 176 +++++ .../protocol/frames/GatewayEndDevListReq.java | 66 ++ .../linktap/protocol/frames/HandshakeReq.java | 52 ++ .../protocol/frames/HandshakeResp.java | 91 +++ .../protocol/frames/IPayloadValidator.java | 26 + .../linktap/protocol/frames/LockReq.java | 69 ++ .../protocol/frames/PauseWateringPlanReq.java | 51 ++ .../linktap/protocol/frames/RainData.java | 66 ++ .../protocol/frames/RainDataForecast.java | 51 ++ .../protocol/frames/SetDeviceConfigReq.java | 77 ++ .../protocol/frames/SetupWaterPlan.java | 148 ++++ .../protocol/frames/StartWateringReq.java | 67 ++ .../protocol/frames/TLGatewayFrame.java | 251 +++++++ .../linktap/protocol/frames/TimeDataResp.java | 32 + .../protocol/frames/WaterMeterStatus.java | 275 +++++++ .../frames/WateringSkippedNotification.java | 65 ++ .../protocol/frames/WirelessTestResp.java | 72 ++ .../http/CommandNotSupportedException.java | 50 ++ .../protocol/http/DeviceIdException.java | 53 ++ .../protocol/http/GatewayIdException.java | 53 ++ .../http/InvalidParameterException.java | 50 ++ .../http/NotTapLinkGatewayException.java | 51 ++ .../TransientCommunicationIssueException.java | 49 ++ .../linktap/protocol/http/WebServerApi.java | 501 +++++++++++++ .../protocol/servers/BindingServlet.java | 237 ++++++ .../protocol/servers/IHttpClientProvider.java | 26 + .../src/main/resources/OH-INF/addon/addon.xml | 28 + .../resources/OH-INF/i18n/linktap.properties | 3 + .../resources/OH-INF/thing/channel-types.xml | 223 ++++++ .../resources/OH-INF/thing/thing-types.xml | 108 +++ .../linktap/protocol/frames/Command0Test.java | 71 ++ .../protocol/frames/Command10Test.java | 64 ++ .../protocol/frames/Command11Test.java | 63 ++ .../protocol/frames/Command12Test.java | 62 ++ .../protocol/frames/Command13Test.java | 59 ++ .../protocol/frames/Command14Test.java | 60 ++ .../protocol/frames/Command15Test.java | 64 ++ .../protocol/frames/Command16Test.java | 71 ++ .../protocol/frames/Command17Test.java | 63 ++ .../protocol/frames/Command18Test.java | 62 ++ .../linktap/protocol/frames/Command1Test.java | 63 ++ .../linktap/protocol/frames/Command2Test.java | 59 ++ .../linktap/protocol/frames/Command3Test.java | 136 ++++ .../linktap/protocol/frames/Command5Test.java | 60 ++ .../linktap/protocol/frames/Command6Test.java | 63 ++ .../linktap/protocol/frames/Command7Test.java | 61 ++ .../linktap/protocol/frames/Command8Test.java | 96 +++ .../linktap/protocol/frames/Command9Test.java | 46 ++ bundles/pom.xml | 681 ++++++++++++++++++ 76 files changed, 8717 insertions(+) create mode 100644 bundles/org.openhab.binding.linktap/NOTICE create mode 100644 bundles/org.openhab.binding.linktap/README.md create mode 100644 bundles/org.openhab.binding.linktap/Saved/LinkTapHandler.java create mode 100644 bundles/org.openhab.binding.linktap/pom.xml create mode 100644 bundles/org.openhab.binding.linktap/src/main/feature/feature.xml create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/configuration/LinkTapBridgeConfiguration.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/configuration/LinkTapDeviceConfiguration.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/BridgeManager.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/DeviceMetaDataUpdatedHandler.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/IBridgeData.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapBindingConstants.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapBridgeDiscoveryService.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapBridgeHandler.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapDeviceConfiguration.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapDeviceDiscoveryService.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapDeviceMetadata.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapHandler.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LinkTapHandlerFactory.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/LookupWrapper.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/PollingDeviceHandler.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/TransactionProcessor.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/internal/Utils.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/AlertStateReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/DeviceCmdReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/DismissAlertReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/EndpointDeviceResponse.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/GatewayConfigResp.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/GatewayDeviceResponse.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/GatewayEndDevListReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/HandshakeReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/HandshakeResp.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/IPayloadValidator.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/LockReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/PauseWateringPlanReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/RainData.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/RainDataForecast.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/SetDeviceConfigReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/SetupWaterPlan.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/StartWateringReq.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/TLGatewayFrame.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/TimeDataResp.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/WaterMeterStatus.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/WateringSkippedNotification.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/frames/WirelessTestResp.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/CommandNotSupportedException.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/DeviceIdException.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/GatewayIdException.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/InvalidParameterException.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/NotTapLinkGatewayException.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/TransientCommunicationIssueException.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/http/WebServerApi.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/servers/BindingServlet.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/java/org/openhab/binding/linktap/protocol/servers/IHttpClientProvider.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/resources/OH-INF/addon/addon.xml create mode 100644 bundles/org.openhab.binding.linktap/src/main/resources/OH-INF/i18n/linktap.properties create mode 100644 bundles/org.openhab.binding.linktap/src/main/resources/OH-INF/thing/channel-types.xml create mode 100644 bundles/org.openhab.binding.linktap/src/main/resources/OH-INF/thing/thing-types.xml create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command0Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command10Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command11Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command12Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command13Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command14Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command15Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command16Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command17Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command18Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command1Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command2Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command3Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command5Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command6Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command7Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command8Test.java create mode 100644 bundles/org.openhab.binding.linktap/src/main/tests/org/openhab/binding/linktap/protocol/frames/Command9Test.java diff --git a/bundles/org.openhab.binding.linktap/NOTICE b/bundles/org.openhab.binding.linktap/NOTICE new file mode 100644 index 0000000000000..38d625e349232 --- /dev/null +++ b/bundles/org.openhab.binding.linktap/NOTICE @@ -0,0 +1,13 @@ +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.linktap/README.md b/bundles/org.openhab.binding.linktap/README.md new file mode 100644 index 0000000000000..d4ecb642f0239 --- /dev/null +++ b/bundles/org.openhab.binding.linktap/README.md @@ -0,0 +1,201 @@ +# LinkTap Binding + +This binding is for [LinkTap](https://www.link-tap.com/) devices. + +**This is for communication over a local area network, that prevents direct access to your gateway / openHAB instance from the internet. E.g. behind a router** + +The method of interaction this binding supports is: + +**Program and execution of the watering plan within the application** + +The currently supported capabilities include where supported by the gateway / device: + +- Time syncrhonisation to openHAB +- Child lock controls +- Monitoring and dismissal for device alarms (Water Cut, etc.) +- Monitoring of sensor states (Battery, Zigbee Signal, Flow Meters Statistics, etc.) +- Enable watering based on time duration / volume limits +- Shutdown of active watering + +## Requirements + +A LinkTap gateway device, in order for openHAB to connect to the system, as a bridge. + +## Connection options + +LinkTap supports MQTT and a direct interaction via HTTP. +This binding directly interact's with LinkTap's bridges using the Local HTTP API (HTTP). +The binding connects to the bridge's directly, and the Gateway is configured automatically to push updates to openHAB if +it has a HTTP configured server. (Note HTTPS is not supported). + +Should the Gateway device's not be able to connect to the binding it automatically falls-back to a polling +implementation (15 second cycle). The gateway supports 1 Local HTTP API, for an ideal behaviour the Gateway should be able to +connect to OpenHab on an HTTP port from its IP, and only a single OpenHab instance should be connected to a Gateway. + +It is recommended that you use **static IP's** for this binding, **for both openHAB and the Gateway device(s)**. + +## Supported Things + +This binding supports the follow thing types: + +| Thing | Thing Type | Thing Type UID | Discovery | Description | +|----------------|------------|----------------|--------------------|------------------------------------------| +| Bridge | Bridge | linkTapBridge | Manual / Automatic | A connection to a LinkTap Gateway device | +| LinkTap Device | Thing | linkTapDevice | Automatic | A end device such as the Q1 | + +**NOTE** This binding was developed and tested using a GW-02 gateway with a Q1 device. + +## Discovery + +### Gateways + +If mDNS has been enabled on the Gateway device via it's webpage, then the gateway(s) will be discovered, and appear in the inbox +when a manual scan is run when adding a LinkTap Gateway. It is however recommended to use **static IP addresses** and add the +gateways directly using the IP address. + +### Devices + +Once connected to a LinkTap gateway, the binding will listen for updates of new devices and add them, to the inbox. +If the gateway cannot publish to openHAB, then the gateway is checked every 2 minutes for new devices, and they are added to the inbox when discovered. + +## Binding Configuration + +### Bridge configuration parameters + +| Name | Type | Description | Recommended Values | Required | Advanced | +|------------|--------|-----------------------------------------------------------------------------------|--------------------|----------|----------| +| host | String | The hostname / IP address of the gateway device | | Yes | No | +| username | String | The username if set for the gateway device | | No | No | +| password | String | The password if set for the gateway device | | No | No | +| enableMDNS | Switch | On connection whether the mDNS responder should be enabled on the gateway device | ON | No | Yes | + +**NOTE** When enableMDNS is enabled, upon connection to the gateway option "Enable mDNS responder" is switched on + +### LinkTap Device configuration parameters + +It is recommended to use the Device Id, for locating devices. This can be found in the LinkTap mobile application under +Settings->TapLinker / ValveLinker, e.g. + +- ValueLinker_1 (D71BC52F004B1200_1-xxxx) + - has Device Id "ValveLinker_1" + - has Device Name D71BC52F004B1200_1 + +| Name | Type | Description | Recommended Values | Required | Advanced | +|--------------|--------|-----------------------------------------------------------------------|--------------------|----------|----------| +| deviceId | String | The Device Id for the device under the gateway | | Yes | No | +| deviceName | String | The name allocated to the device by the app. (Must be unique if used) | | Yes | No | +| enableAlerts | Switch | On connection whether the device should be configured to send alerts | ON | No | Yes | + +**NOTE** + +- a **deviceId** or a **deviceName must be provided** to communicate with the device +- **enableAlerts** allows the binding to **receive updates of Water Cut, and other alerts** conditions are detected for a LinkTap device. + +## Thing Configuration + +_Describe what is needed to manually configure a thing, either through the UI or via a thing-file._ +_This should be mainly about its mandatory and optional configuration parameters._ + +_Note that it is planned to generate some part of this based on the XML files within ```src/main/resources/OH-INF/thing``` of your binding._ + +### `sample` Thing Configuration + +| Name | Type | Description | Default | Required | Advanced | +|-----------------|---------|---------------------------------------|---------|----------|----------| +| host | text | Hostname or IP address of the device | N/A | yes | no | +| password | text | Password to access the device | N/A | yes | no | +| refreshInterval | integer | Interval the device is polled in sec. | 600 | no | yes | + +## Channels + +There are 3 different Area of channels: + +- RO Data (Read Only Data) + - These represent data published by the device +- Alerts + - These are switches that are set to ON by the device when an alert condition is detected, such as a Water Cut. + - The alert can be dismissed by setting the switch to OFF +- WR Data (Read Write Data) + - Provides the ability to read data + - Provides the ability to set a relevant state to the data +- W Data + - Provides parameter values for the named action, is stored within openHAB is not read from the device + - E.g. Start Immediate Watering + - Can be limited by a time duration - ohDurLimit + - If a flow meter is attached can be limited by a volume limit - ohVolLimit + + +| Name | Type | Description | Representation | Read/Write | Write Action | +|-------------------|---------------------------|---------------------------------------------------------------------------|----------------|------------|------------------------------------------------------------------------------------------------------------------------------| +| waterCut | Switch | Water cut-off alert | Alert | Write | Dismiss alert | +| shutdownFailure | Switch | The device has failed to close the valve | Alert | Write | Dismiss alert | +| highFlow | Switch | Unusually high flow rate detected alert | Alert | Write | Dismiss alert | +| lowFlow | Switch | Unusually low flow rate detected alert | Alert | Write | Dismiss alert | +| fallStatus | Switch | The device has fallen | Alert | Write | Dismiss alert | +| flmLinked | Switch | The device has a included flow meter | RO Data | Read | | +| rfLinked | Switch | Is the device RF linked | RO Data | Read | | +| signal | Number:Dimensionless | Reception Signal Strength | RO Data | Read | | +| battery | Number:Dimensionless | Battery Remaining Level | RO Data | Read | | +| flowRate | Number:VolumetricFlowRate | Current water flow rate | RO Data | Read | | +| volume | Number:Volume | Accumulated volume of current watering cycle | RO Data | Read | | +| ecoFinal | Switch | In ECO mode this is true when the final ON watering on segment is running | RO Data | Read | | +| remaining | Number:Time | Remaining duration of the current watering cycle | RO Data | Read | | +| duration | Number:Time | Total duration of current watering cycle | RO Data | Read | | +| activeWatering | Switch | Active watering status | RW Data | Write | True - Start immediate watering, False - Stops the current watering process, the next planned watering will run as scheduled | +| manualWatering | Switch | Manual watering mode status | RW Data | Write | False - Stops the current watering process, the next planned watering will run as scheduled | +| childLock | Text | The child lock mode | RW Data | Write | Unlocked - Button enabled, Partially locked -> 3 second push required, Completely locked -> Button disabled | +| ohDurLimit | Number:Time | Max duration allowed for the immediate watering | W Data | Write | Max Time duration for "Start immediate watering" | +| ohVolLimit | Number:Volume | Max Volume limit for immediate watering | W Data | Write | Max Volume for "Start immediate watering" | +| waterSkipDateTime | DateTime | Time when watering was skipped | RO Data | Read | | +| waterSkipPrev | Number:Length | Previous rainfall calculated when watering was skipped | RO Data | Read | | +| waterSkipNext | Number:Length | Future rainfall calculated when watering was skipped | RO Data | Read | | + +## Full Example + +_Provide a full usage example based on textual configuration files._ +_*.things, *.items examples are mandatory as textual configuration is well used by many users._ +_*.sitemap examples are optional._ + +### Thing Configuration + +- **Gateway Model**: GW_02 +- **Device Model**: Q1 + +```java +Bridge linktap:bridge:home "LinkTap GW02" [ host="192.168.0.21", enableMDNS=true ] { + Thing device TapValve1 "Outdoor Tap 1" [ id="D71BC52E985B1200_1", name="ValveLinker_1", enableAlerts=true ] + Thing device TapValve2 "Outdoor Tap 2" [ id="D71BC52E985B1200_2", name="ValveLinker_2", enableAlerts=true ] + Thing device TapValve3 "Outdoor Tap 3" [ id="D71BC52E985B1200_3", name="ValveLinker_3", enableAlerts=true ] + Thing device TapValve4 "Outdoor Tap 4" [ id="D71BC52E985B1200_4", name="ValveLinker_4", enableAlerts=true ] +} +``` + +### Item Configuration + +```java +Number:Dimensionless Tap1BatteryLevel "Tap 1 - Battery Level" ["Point"] { channel="linktap:device:home:tapValve1:battery",unit="%%" } +Number:Dimensionless Tap1SignalLevel "Tap 1 - Signal Level" ["Point"] { channel="linktap:device:home:tapValve1:signal",unit="%%" } +Switch Tap1RfLinked "Tap 1 - RF Linked" ["Point"] { channel="linktap:device:home:tapValve1:rfLinked"} +Switch Tap1FlmLinked "Tap 1 - FLM Linked" ["Point"] { channel="linktap:device:home:tapValve1:flmLinked"} +Switch Tap1WaterCutAlert "Tap 1 - Water Cut Alert" ["Point"] { channel="linktap:device:home:tapValve1:waterCut" } +Switch Tap1WaterFallAlert "Tap 1 - Fallen Alert" ["Point"] { channel="linktap:device:home:tapValve1:fallStatus" } +Switch Tap1WaterValveAlert "Tap 1 - Shutdown Failure Alert" ["Point"] { channel="linktap:device:home:tapValve1:shutdownFailure" } +Switch Tap1WaterLowFlowAlert "Tap 1 - Low Flow Alert" ["Point"] { channel="linktap:device:home:tapValve1:lowFlow" } +Switch Tap1WaterHighFlowAlert "Tap 1 - High Flow Alert" ["Point"] { channel="linktap:device:home:tapValve1:highFlow" } +String Tap1ChildLockMode "Tap 1 - Child Lock Mode" ["Point"] { channel="linktap:device:home:tapValve1:childLock" } +Number:VolumetricFlowRate Tap1FlowRate "Tap 1 - Flow Rate" ["Point"] { channel="linktap:device:home:tapValve1:flowRate",unit="l/min" } +Number:Volume Tap1WateringVolume "Tap 1 - Watering Volume" ["Point"] { channel="linktap:device:home:tapValve1:volume",unit="l" } +Switch Tap1FinalEcoSegment "Tap 1 - Final ECO Segment" ["Point"] { channel="linktap:device:home:tapValve1:ecoFinal" } +Switch Tap1Watering "Tap 1 - Watering" ["Point"] { channel="linktap:device:home:tapValve1:activeWatering" } +Switch Tap1ManualWatering "Tap 1 - Manual Watering" ["Point"] { channel="linktap:device:home:tapValve1:manualWatering" } +String Tap1WateringkMode "Tap 1 - Watering Mode"