diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 2c4088b..919ce1f 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,7 +1,7 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 748cfc4..065fadc 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -2,6 +2,7 @@
+
diff --git a/pom.xml b/pom.xml
index 0b79a47..4a49413 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,10 +15,45 @@
jackson-databind
2.11.1
+
+
+ com.google.guava
+ guava
+ 30.1.1-jre
+
com.ghgande
j2mod
2.7.0
+
+ org.junit.jupiter
+ junit-jupiter
+ RELEASE
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter
+ RELEASE
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter
+ RELEASE
+ test
+
+
+ org.projectlombok
+ lombok
+ 1.18.22
+ provided
+
+
+
+ 11
+ 11
+
diff --git a/src/main/java/home/automation/Main.java b/src/main/java/home/automation/Main.java
index 0eb53b5..e350997 100644
--- a/src/main/java/home/automation/Main.java
+++ b/src/main/java/home/automation/Main.java
@@ -3,6 +3,10 @@ package home.automation;
import com.ghgande.j2mod.modbus.ModbusIOException;
import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
import com.ghgande.j2mod.modbus.procimg.Register;
+import home.automation.modbus.ModbusRtuTcpRepository;
+import home.automation.modbus.Registry;
+import home.automation.modbus.SDMService;
+import home.automation.modbus.configuration.JsonFileBasedConfiguration;
import java.io.IOException;
import java.net.InetAddress;
@@ -10,32 +14,9 @@ import java.net.UnknownHostException;
public class Main {
- public static void main(String[] args) {
- try {
- InetAddress byName = InetAddress.getByName("192.168.0.65");
- ModbusTCPMaster modbusRTUTCPTransport = new ModbusTCPMaster("192.168.0.65", 502);
- modbusRTUTCPTransport.connect();
- for (int i = 0; i < 1; i++) {
- int ref = 4065;
- Register[] regs = modbusRTUTCPTransport.readMultipleRegisters(1, 4065, 75);
- for (Register reg : regs) {
- float v = reg.toShort();
- if (v < 0) {
- System.out.println(ref + " " + -(v + 32768)/10);
- } else {
- System.out.println(ref + " " + reg.getValue()/10.0);
- }
- ref++;
- }
- }
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ModbusIOException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
+ public static void main(String[] args) throws Exception {
+ SDMService service = new SDMService(new ModbusRtuTcpRepository(new JsonFileBasedConfiguration()));
+ final Registry registry = service.get(4070);
+ System.out.println(registry);
}
}
diff --git a/src/main/java/home/automation/ModbusRtuTcpRepository.java b/src/main/java/home/automation/ModbusRtuTcpRepository.java
deleted file mode 100644
index b76a6ae..0000000
--- a/src/main/java/home/automation/ModbusRtuTcpRepository.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package home.automation;
-
-public class ModbusRtuTcpRepository {
-}
diff --git a/src/main/java/home/automation/RegisterFactory.java b/src/main/java/home/automation/RegisterFactory.java
deleted file mode 100644
index d3e9f00..0000000
--- a/src/main/java/home/automation/RegisterFactory.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package home.automation;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import java.util.Optional;
-
-
-public class RegisterFactory {
- private static final ObjectMapper mapper = new ObjectMapper();
-
- Optional create(String json) {
- try {
- return Optional.of(mapper.readValue(json, RegistryMapping.class));
- } catch (JsonProcessingException e) {
- return Optional.empty();
- }
- }
-}
diff --git a/src/main/java/home/automation/RegistryMapping.java b/src/main/java/home/automation/RegistryMapping.java
deleted file mode 100644
index 0dc6afc..0000000
--- a/src/main/java/home/automation/RegistryMapping.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package home.automation;
-
-public class RegistryMapping {
- private final int registry;
- private final String desc;
-
- public RegistryMapping(int registry, String desc) {
- this.registry = registry;
- this.desc = desc;
- }
-
- public int getRegistry() {
- return registry;
- }
-
- public String getDesc() {
- return desc;
- }
-}
-
diff --git a/src/main/java/home/automation/RegistryReader.java b/src/main/java/home/automation/RegistryReader.java
deleted file mode 100644
index 642626c..0000000
--- a/src/main/java/home/automation/RegistryReader.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package home.automation;
-
-public class RegistryReader {
-}
diff --git a/src/main/java/home/automation/Root.java b/src/main/java/home/automation/Root.java
deleted file mode 100644
index 15ada61..0000000
--- a/src/main/java/home/automation/Root.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package home.automation;
-
-import java.util.List;
-
-public class Root{
- public List registry_mapping;
-}
-
diff --git a/src/main/java/home/automation/SDMService.java b/src/main/java/home/automation/SDMService.java
deleted file mode 100644
index 2b70f06..0000000
--- a/src/main/java/home/automation/SDMService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package home.automation;
-
-import com.ghgande.j2mod.modbus.ModbusException;
-import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
-import com.ghgande.j2mod.modbus.procimg.Register;
-
-import java.net.InetAddress;
-
-public class SDMService {
-
- private final InetAddress address;
- private final ModbusTCPMaster modbusConnection;
- private final int port;
-
- public SDMService(InetAddress address, int port) throws Exception {
- this.address = address;
- this.port = port;
- this.modbusConnection = initConnection();
- }
-
- public Register[] read(RegistryMapping mapping) {
- try {
- return modbusConnection.readMultipleRegisters(mapping.getRegistry(), 1);
- } catch (ModbusException e) {
- e.printStackTrace();
- }
- return new Register[0];
- }
-
- private ModbusTCPMaster initConnection() throws Exception {
- ModbusTCPMaster modbusRTUTCPTransport = new ModbusTCPMaster(address.getHostAddress(), port);
- modbusRTUTCPTransport.connect();
- return modbusRTUTCPTransport;
- }
-
-}
diff --git a/src/main/java/home/automation/modbus/ModbusRtuTcpRepository.java b/src/main/java/home/automation/modbus/ModbusRtuTcpRepository.java
new file mode 100644
index 0000000..7339ef9
--- /dev/null
+++ b/src/main/java/home/automation/modbus/ModbusRtuTcpRepository.java
@@ -0,0 +1,80 @@
+package home.automation.modbus;
+
+import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster;
+import com.ghgande.j2mod.modbus.procimg.Register;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import home.automation.modbus.configuration.ConfigurationStrategy;
+import home.automation.modbus.configuration.RegistryConfiguration;
+import home.automation.modbus.configuration.RegistryMapping;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+public class ModbusRtuTcpRepository {
+ private final LoadingCache repositoryCache;
+ private final ConfigurationStrategy config;
+
+ public ModbusRtuTcpRepository(ConfigurationStrategy config) throws Exception {
+ this.config = config;
+
+ CacheLoader loader = configureCacheLoader(config);
+ repositoryCache = CacheBuilder.newBuilder()
+ .refreshAfterWrite(5, TimeUnit.SECONDS)
+ .build(loader);
+
+ final List allRegisters = config.getConfig().get().getRegistry_mapping().stream().map(RegistryMapping::getRegistry).collect(Collectors.toList());
+ //loader.loadAll(allRegisters);
+ }
+
+ private CacheLoader configureCacheLoader(ConfigurationStrategy config) {
+ return new CacheLoader<>() {
+ @Override
+ public Registry load(Integer registerNumber) throws Exception {
+ final RegistryConfiguration registryConfiguration = config.getConfig().get();
+ final String address = registryConfiguration.getAddress();
+ final int port = registryConfiguration.getPort();
+
+ final ModbusTCPMaster modbusTCPMaster = new ModbusTCPMaster(address, port);
+ modbusTCPMaster.connect();
+ final Register[] registers = modbusTCPMaster.readMultipleRegisters(registerNumber, 1);
+
+
+ final Optional registryMeasurement = Arrays.stream(registers).findFirst().map(register -> Registry.builder()
+ .registry(registerNumber)
+ .desc(registryConfiguration.getRegistry_mapping()
+ .stream()
+ .filter(elem -> elem.getRegistry().equals(registerNumber))
+ .findFirst()
+ .map(RegistryMapping::getDesc)
+ .orElse("Uknow registry number"))
+ .value(normalizeRegistryValue(register))
+ .build());
+ return registryMeasurement.orElse(null);
+ }
+ };
+ }
+
+ private String normalizeRegistryValue(Register reg) {
+ float v = reg.toShort();
+ if (v < 0) {
+ return String.valueOf(-(v + 32768) / 10);
+ } else {
+ return String.valueOf((reg.getValue() / 10.0));
+ }
+ }
+
+ public List getAll() {
+ return (List) repositoryCache.asMap().values();
+ }
+
+ public Registry get(int register) throws ExecutionException {
+ return repositoryCache.get(register);
+ }
+}
diff --git a/src/main/java/home/automation/modbus/Registry.java b/src/main/java/home/automation/modbus/Registry.java
new file mode 100644
index 0000000..75181ca
--- /dev/null
+++ b/src/main/java/home/automation/modbus/Registry.java
@@ -0,0 +1,16 @@
+package home.automation.modbus;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Builder
+@AllArgsConstructor
+public class Registry {
+ private Integer registry;
+ private String desc;
+ private String value;
+}
diff --git a/src/main/java/home/automation/modbus/SDMService.java b/src/main/java/home/automation/modbus/SDMService.java
new file mode 100644
index 0000000..47d9bb8
--- /dev/null
+++ b/src/main/java/home/automation/modbus/SDMService.java
@@ -0,0 +1,23 @@
+package home.automation.modbus;
+
+import home.automation.modbus.configuration.RegistryMapping;
+
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+public class SDMService {
+
+ private final ModbusRtuTcpRepository repository;
+
+ public SDMService(ModbusRtuTcpRepository repository) throws Exception {
+ this.repository = repository;
+ }
+
+ public List readAll() {
+ return repository.getAll();
+ }
+
+ public Registry get(int register) throws ExecutionException {
+ return repository.get(register);
+ }
+}
diff --git a/src/main/java/home/automation/modbus/configuration/ConfigurationStrategy.java b/src/main/java/home/automation/modbus/configuration/ConfigurationStrategy.java
new file mode 100644
index 0000000..59249c2
--- /dev/null
+++ b/src/main/java/home/automation/modbus/configuration/ConfigurationStrategy.java
@@ -0,0 +1,21 @@
+package home.automation.modbus.configuration;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.Optional;
+
+public interface ConfigurationStrategy {
+ static final ObjectMapper mapper = new ObjectMapper();
+ public Optional getConfig() throws IOException;
+
+ default Optional create(String json) {
+ try {
+ return Optional.of(mapper.readValue(json, RegistryConfiguration.class));
+ } catch (JsonProcessingException e) {
+ return Optional.empty();
+ }
+ }
+
+}
diff --git a/src/main/java/home/automation/modbus/configuration/JsonFileBasedConfiguration.java b/src/main/java/home/automation/modbus/configuration/JsonFileBasedConfiguration.java
new file mode 100644
index 0000000..c346931
--- /dev/null
+++ b/src/main/java/home/automation/modbus/configuration/JsonFileBasedConfiguration.java
@@ -0,0 +1,20 @@
+package home.automation.modbus.configuration;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+import java.util.Optional;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+public class JsonFileBasedConfiguration implements ConfigurationStrategy {
+ private final String CONFIGURATION_NAME = "registryMapping.json";
+
+ @Override
+ public Optional getConfig() throws IOException {
+ final InputStream resource = Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIGURATION_NAME);
+ Objects.requireNonNull(resource, "Configuration file not present please check the path:" + System.getProperty("usr.dir"));
+ String jsonConfiguration = new String(resource.readAllBytes(), UTF_8);
+ return create(jsonConfiguration);
+ }
+}
diff --git a/src/main/java/home/automation/modbus/configuration/RegistryConfiguration.java b/src/main/java/home/automation/modbus/configuration/RegistryConfiguration.java
new file mode 100644
index 0000000..4b61cb2
--- /dev/null
+++ b/src/main/java/home/automation/modbus/configuration/RegistryConfiguration.java
@@ -0,0 +1,40 @@
+package home.automation.modbus.configuration;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.ToString;
+
+import java.util.List;
+
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.*;
+
+@JsonInclude(NON_EMPTY)
+@ToString
+public class RegistryConfiguration {
+ private String address;
+ private Integer port;
+ private List registry_mapping;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public List getRegistry_mapping() {
+ return registry_mapping;
+ }
+
+ public void setRegistry_mapping(List registry_mapping) {
+ this.registry_mapping = registry_mapping;
+ }
+}
diff --git a/src/main/java/home/automation/modbus/configuration/RegistryMapping.java b/src/main/java/home/automation/modbus/configuration/RegistryMapping.java
new file mode 100644
index 0000000..4c0deab
--- /dev/null
+++ b/src/main/java/home/automation/modbus/configuration/RegistryMapping.java
@@ -0,0 +1,26 @@
+package home.automation.modbus.configuration;
+
+import lombok.ToString;
+
+@ToString
+public class RegistryMapping {
+ private Integer registry;
+ private String desc;
+
+ public void setRegistry(Integer registry) {
+ this.registry = registry;
+ }
+
+ public Integer getRegistry() {
+ return registry;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+}
+
diff --git a/registryMapping.json b/src/main/resources/registryMapping.json
similarity index 100%
rename from registryMapping.json
rename to src/main/resources/registryMapping.json
diff --git a/src/test/java/home/automation/modbus/configuration/JsonFileBasedConfigurationTest.java b/src/test/java/home/automation/modbus/configuration/JsonFileBasedConfigurationTest.java
new file mode 100644
index 0000000..f6c41d0
--- /dev/null
+++ b/src/test/java/home/automation/modbus/configuration/JsonFileBasedConfigurationTest.java
@@ -0,0 +1,17 @@
+package home.automation.modbus.configuration;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.util.Optional;
+
+class JsonFileBasedConfigurationTest {
+
+ @Test
+ public void GivenFileConfigurationStrategy_When_getConfig_Then_MappedClassShoudlBeCreated() throws IOException {
+ ConfigurationStrategy configuration = new JsonFileBasedConfiguration();
+ final Optional config = configuration.getConfig();
+ assert (config.isPresent());
+ System.out.println(config.get());
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/registryMapping.json b/src/test/resources/registryMapping.json
new file mode 100644
index 0000000..51bb67a
--- /dev/null
+++ b/src/test/resources/registryMapping.json
@@ -0,0 +1,50 @@
+{
+ "address": "192.168.0.62",
+ "port": 502,
+ "registry_mapping": [
+ {
+ "registry": 4065,
+ "desc": "External temperature"
+ },
+ {
+ "registry": 4070,
+ "desc": "Temp in"
+ },
+ {
+ "registry": 4071,
+ "desc": "Temp out"
+ },
+ {
+ "registry": 4072,
+ "desc": "Temp pc out"
+ },
+ {
+ "registry": 4067,
+ "desc": "Temp co"
+ },
+ {
+ "registry": 4202,
+ "desc": "Set Temp co"
+ },
+ {
+ "registry": 4069,
+ "desc": "Temp cwu"
+ },
+ {
+ "registry": 4203,
+ "desc": "Set Temp cwu"
+ },
+ {
+ "registry": 4066,
+ "desc": "Tem wew"
+ },
+ {
+ "registry": 4201,
+ "desc": "Set Temp wew"
+ },
+ {
+ "registry": 4199,
+ "desc": "Temp zsr"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/target/classes/Main.class b/target/classes/Main.class
deleted file mode 100644
index cbd8902..0000000
Binary files a/target/classes/Main.class and /dev/null differ
diff --git a/test.com.iml b/test.com.iml
deleted file mode 100644
index 78b2cc5..0000000
--- a/test.com.iml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file