]> git.basschouten.com Git - openhab-addons.git/blob
67c9519832de40a27feb3e3ad4b087c4b72c4918
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.modbus.internal.handler;
14
15 import java.util.Collection;
16 import java.util.Optional;
17 import java.util.Set;
18
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;
30
31 /**
32  * Endpoint thing handler for serial slaves
33  *
34  * @author Sami Salonen - Initial contribution
35  */
36 @NonNullByDefault
37 public class ModbusSerialThingHandler
38         extends AbstractModbusEndpointThingHandler<ModbusSerialSlaveEndpoint, ModbusSerialConfiguration> {
39
40     public ModbusSerialThingHandler(Bridge bridge, ModbusManager manager) {
41         super(bridge, manager);
42     }
43
44     @Override
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!");
58         }
59
60         this.config = config;
61
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());
68
69         // Never reconnect serial connections "automatically"
70         poolConfiguration.setInterConnectDelayMillis(1000);
71         poolConfiguration.setReconnectAfterMillis(-1);
72
73         endpoint = new ModbusSerialSlaveEndpoint(port, baud, flowControlIn, flowControlOut, config.getDataBits(),
74                 stopBits, parity, encoding, config.isEcho(), config.getReceiveTimeoutMillis());
75     }
76
77     /**
78      * Return true if auto discovery is enabled in the config
79      */
80     @Override
81     public boolean isDiscoveryEnabled() {
82         if (config != null) {
83             return config.isDiscoveryEnabled();
84         } else {
85             return false;
86         }
87     }
88
89     @SuppressWarnings("null") // Since endpoint in Optional.map cannot be null
90     @Override
91     protected String formatConflictingParameterError() {
92         return String.format(
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>"));
96     }
97
98     @Override
99     public int getSlaveId() throws EndpointNotInitializedException {
100         ModbusSerialConfiguration config = this.config;
101         if (config == null) {
102             throw new EndpointNotInitializedException();
103         }
104         return config.getId();
105     }
106
107     @Override
108     public ThingUID getUID() {
109         return getThing().getUID();
110     }
111
112     @Override
113     public Collection<Class<? extends ThingHandlerService>> getServices() {
114         return Set.of(ModbusEndpointDiscoveryService.class);
115     }
116 }