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