2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.modbus.internal.handler;
15 import java.util.Collection;
16 import java.util.Optional;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.binding.modbus.discovery.internal.ModbusEndpointDiscoveryService;
21 import org.openhab.binding.modbus.handler.EndpointNotInitializedException;
22 import org.openhab.binding.modbus.internal.ModbusConfigurationException;
23 import org.openhab.binding.modbus.internal.config.ModbusTcpConfiguration;
24 import org.openhab.core.io.transport.modbus.ModbusManager;
25 import org.openhab.core.io.transport.modbus.endpoint.EndpointPoolConfiguration;
26 import org.openhab.core.io.transport.modbus.endpoint.ModbusTCPSlaveEndpoint;
27 import org.openhab.core.thing.Bridge;
28 import org.openhab.core.thing.ThingUID;
29 import org.openhab.core.thing.binding.ThingHandlerService;
32 * Endpoint thing handler for TCP slaves
34 * @author Sami Salonen - Initial contribution
37 public class ModbusTcpThingHandler
38 extends AbstractModbusEndpointThingHandler<ModbusTCPSlaveEndpoint, ModbusTcpConfiguration> {
40 public ModbusTcpThingHandler(Bridge bridge, ModbusManager manager) {
41 super(bridge, manager);
45 protected void configure() throws ModbusConfigurationException {
46 ModbusTcpConfiguration config = getConfigAs(ModbusTcpConfiguration.class);
48 String host = config.getHost();
50 throw new ModbusConfigurationException("host must be non-null!");
54 endpoint = new ModbusTCPSlaveEndpoint(host, config.getPort(), config.getRtuEncoded());
56 EndpointPoolConfiguration poolConfiguration = new EndpointPoolConfiguration();
57 this.poolConfiguration = poolConfiguration;
58 poolConfiguration.setConnectMaxTries(config.getConnectMaxTries());
59 poolConfiguration.setAfterConnectionDelayMillis(config.getAfterConnectionDelayMillis());
60 poolConfiguration.setConnectTimeoutMillis(config.getConnectTimeoutMillis());
61 poolConfiguration.setInterConnectDelayMillis(config.getTimeBetweenReconnectMillis());
62 poolConfiguration.setInterTransactionDelayMillis(config.getTimeBetweenTransactionsMillis());
63 poolConfiguration.setReconnectAfterMillis(config.getReconnectAfterMillis());
66 @SuppressWarnings("null") // since Optional.map is always called with NonNull argument
68 protected String formatConflictingParameterError() {
70 "Endpoint '%s' has conflicting parameters: parameters of this thing (%s '%s') are different from some other thing's parameter. Ensure that all endpoints pointing to tcp slave '%s:%s' have same parameters.",
71 endpoint, thing.getUID(), this.thing.getLabel(),
72 Optional.ofNullable(this.endpoint).map(e -> e.getAddress()).orElse("<null>"),
73 Optional.ofNullable(this.endpoint).map(e -> String.valueOf(e.getPort())).orElse("<null>"));
77 public int getSlaveId() throws EndpointNotInitializedException {
78 ModbusTcpConfiguration localConfig = config;
79 if (localConfig == null) {
80 throw new EndpointNotInitializedException();
82 return localConfig.getId();
86 public ThingUID getUID() {
87 return getThing().getUID();
91 * Returns true if discovery is enabled
94 public boolean isDiscoveryEnabled() {
96 return config.isDiscoveryEnabled();
103 public Collection<Class<? extends ThingHandlerService>> getServices() {
104 return Set.of(ModbusEndpointDiscoveryService.class);