]> git.basschouten.com Git - openhab-addons.git/blob
02c2a9d007c0d2ba366bbb8f0969a01fb54d7567
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.Collections;
17 import java.util.Optional;
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.setConnectTimeoutMillis(config.getConnectTimeoutMillis());
66         poolConfiguration.setInterTransactionDelayMillis(config.getTimeBetweenTransactionsMillis());
67
68         // Never reconnect serial connections "automatically"
69         poolConfiguration.setInterConnectDelayMillis(1000);
70         poolConfiguration.setReconnectAfterMillis(-1);
71
72         endpoint = new ModbusSerialSlaveEndpoint(port, baud, flowControlIn, flowControlOut, config.getDataBits(),
73                 stopBits, parity, encoding, config.isEcho(), config.getReceiveTimeoutMillis());
74     }
75
76     /**
77      * Return true if auto discovery is enabled in the config
78      */
79     @Override
80     public boolean isDiscoveryEnabled() {
81         if (config != null) {
82             return config.isDiscoveryEnabled();
83         } else {
84             return false;
85         }
86     }
87
88     @SuppressWarnings("null") // Since endpoint in Optional.map cannot be null
89     @Override
90     protected String formatConflictingParameterError() {
91         return String.format(
92                 "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.",
93                 endpoint, thing.getUID(), this.thing.getLabel(),
94                 Optional.ofNullable(this.endpoint).map(e -> e.getPortName()).orElse("<null>"));
95     }
96
97     @Override
98     public int getSlaveId() throws EndpointNotInitializedException {
99         ModbusSerialConfiguration config = this.config;
100         if (config == null) {
101             throw new EndpointNotInitializedException();
102         }
103         return config.getId();
104     }
105
106     @Override
107     public ThingUID getUID() {
108         return getThing().getUID();
109     }
110
111     @Override
112     public Collection<Class<? extends ThingHandlerService>> getServices() {
113         return Collections.singleton(ModbusEndpointDiscoveryService.class);
114     }
115 }