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.Collections;
17 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.ModbusSerialConfiguration;
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.ModbusSerialSlaveEndpoint;
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 serial slaves
34 * @author Sami Salonen - Initial contribution
37 public class ModbusSerialThingHandler
38 extends AbstractModbusEndpointThingHandler<ModbusSerialSlaveEndpoint, ModbusSerialConfiguration> {
40 public ModbusSerialThingHandler(Bridge bridge, ModbusManager manager) {
41 super(bridge, manager);
45 protected void configure() throws ModbusConfigurationException {
46 ModbusSerialConfiguration config = getConfigAs(ModbusSerialConfiguration.class);
47 String port = config.getPort();
48 int baud = config.getBaud();
49 String flowControlIn = config.getFlowControlIn();
50 String flowControlOut = config.getFlowControlOut();
51 String stopBits = config.getStopBits();
52 String parity = config.getParity();
53 String encoding = config.getEncoding();
54 if (port == null || flowControlIn == null || flowControlOut == null || stopBits == null || parity == null
55 || encoding == null) {
56 throw new ModbusConfigurationException(
57 "port, baud, flowControlIn, flowControlOut, stopBits, parity, encoding all must be non-null!");
62 EndpointPoolConfiguration poolConfiguration = new EndpointPoolConfiguration();
63 this.poolConfiguration = poolConfiguration;
64 poolConfiguration.setConnectMaxTries(config.getConnectMaxTries());
65 poolConfiguration.setAfterConnectionDelayMillis(config.getAfterConnectionDelayMillis());
66 poolConfiguration.setConnectTimeoutMillis(config.getConnectTimeoutMillis());
67 poolConfiguration.setInterTransactionDelayMillis(config.getTimeBetweenTransactionsMillis());
69 // Never reconnect serial connections "automatically"
70 poolConfiguration.setInterConnectDelayMillis(1000);
71 poolConfiguration.setReconnectAfterMillis(-1);
73 endpoint = new ModbusSerialSlaveEndpoint(port, baud, flowControlIn, flowControlOut, config.getDataBits(),
74 stopBits, parity, encoding, config.isEcho(), config.getReceiveTimeoutMillis());
78 * Return true if auto discovery is enabled in the config
81 public boolean isDiscoveryEnabled() {
83 return config.isDiscoveryEnabled();
89 @SuppressWarnings("null") // Since endpoint in Optional.map cannot be null
91 protected String formatConflictingParameterError() {
93 "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 serial port '%s' have same parameters.",
94 endpoint, thing.getUID(), this.thing.getLabel(),
95 Optional.ofNullable(this.endpoint).map(e -> e.getPortName()).orElse("<null>"));
99 public int getSlaveId() throws EndpointNotInitializedException {
100 ModbusSerialConfiguration config = this.config;
101 if (config == null) {
102 throw new EndpointNotInitializedException();
104 return config.getId();
108 public ThingUID getUID() {
109 return getThing().getUID();
113 public Collection<Class<? extends ThingHandlerService>> getServices() {
114 return Collections.singleton(ModbusEndpointDiscoveryService.class);