Add support for adding and removing zwave nodes via software. Support secondary z-wave controllers.

This commit is contained in:
MarkBryanMilligan
2021-10-28 21:45:56 -05:00
parent 88933a2286
commit f5066c541f
28 changed files with 346 additions and 87 deletions

View File

@@ -33,11 +33,7 @@
<groupId>com.neuronrobotics</groupId>
<artifactId>nrjavaserial</artifactId>
<version>5.2.1</version>
</dependency>
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.5.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hid4java</groupId>

View File

@@ -28,11 +28,11 @@ public class MHZ19BCO2Sensor implements ICO2Sensor {
private InputStream is;
private OutputStream os;
private MHZ19BCO2Sensor(String _port) {
public MHZ19BCO2Sensor(String _port) {
this(_port, DEFAULT_TIMEOUT);
}
private MHZ19BCO2Sensor(String _port, int _timeout) {
public MHZ19BCO2Sensor(String _port, int _timeout) {
try {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(_port);
serialPort = portIdentifier.open("co2port", 2000);

View File

@@ -0,0 +1,16 @@
package com.lanternsoftware.thermometer.config;
import com.lanternsoftware.util.dao.annotations.DBSerializable;
@DBSerializable
public class EnvironmentConfig {
private String co2serialPort;
public String getCo2serialPort() {
return co2serialPort;
}
public void setCo2serialPort(String _co2serialPort) {
co2serialPort = _co2serialPort;
}
}

View File

@@ -0,0 +1,39 @@
package com.lanternsoftware.thermometer.config.dao;
import com.lanternsoftware.thermometer.config.EnvironmentConfig;
import com.lanternsoftware.util.dao.AbstractDaoSerializer;
import com.lanternsoftware.util.dao.DaoEntity;
import com.lanternsoftware.util.dao.DaoProxyType;
import com.lanternsoftware.util.dao.DaoSerializer;
import java.util.Collections;
import java.util.List;
public class EnvironmentConfigSerializer extends AbstractDaoSerializer<EnvironmentConfig>
{
@Override
public Class<EnvironmentConfig> getSupportedClass()
{
return EnvironmentConfig.class;
}
@Override
public List<DaoProxyType> getSupportedProxies() {
return Collections.singletonList(DaoProxyType.MONGO);
}
@Override
public DaoEntity toDaoEntity(EnvironmentConfig _o)
{
DaoEntity d = new DaoEntity();
d.put("co2serial_port", _o.getCo2serialPort());
return d;
}
@Override
public EnvironmentConfig fromDaoEntity(DaoEntity _d)
{
EnvironmentConfig o = new EnvironmentConfig();
o.setCo2serialPort(DaoSerializer.getString(_d, "co2serial_port"));
return o;
}
}

View File

@@ -2,7 +2,14 @@ package com.lanternsoftware.thermometer.context;
import com.lanternsoftware.thermometer.DS18B20Thermometer;
import com.lanternsoftware.thermometer.HidThermometer;
import com.lanternsoftware.thermometer.ICO2Sensor;
import com.lanternsoftware.thermometer.IThermometer;
import com.lanternsoftware.thermometer.MHZ19BCO2Sensor;
import com.lanternsoftware.thermometer.config.EnvironmentConfig;
import com.lanternsoftware.util.LanternFiles;
import com.lanternsoftware.util.NullUtils;
import com.lanternsoftware.util.ResourceLoader;
import com.lanternsoftware.util.dao.DaoSerializer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
@@ -10,18 +17,25 @@ import java.util.ArrayList;
import java.util.List;
public class Globals implements ServletContextListener {
private static EnvironmentConfig config;
public static List<IThermometer> thermometers = new ArrayList<>();
public static ICO2Sensor co2Sensor;
@Override
public void contextInitialized(ServletContextEvent sce) {
config = DaoSerializer.parse(ResourceLoader.loadFile(LanternFiles.OPS_PATH + "environment.json"), EnvironmentConfig.class);
IThermometer t = new HidThermometer();
if (t.isConnected())
thermometers.add(t);
thermometers.addAll(DS18B20Thermometer.devices());
if ((config != null) && NullUtils.isNotEmpty(config.getCo2serialPort()))
co2Sensor = new MHZ19BCO2Sensor(config.getCo2serialPort());
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
thermometers.forEach(IThermometer::shutdown);
if (co2Sensor != null)
co2Sensor.shutdown();
}
}

View File

@@ -0,0 +1,19 @@
package com.lanternsoftware.thermometer.servlet;
import com.lanternsoftware.thermometer.context.Globals;
import com.lanternsoftware.util.servlet.LanternServlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/co2")
public class CO2Servlet extends LanternServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
if (Globals.co2Sensor == null)
resp.setStatus(404);
else
setResponseEntity(resp, "application/json", "{\"ppm\": "+ Globals.co2Sensor.getPPM() + "}");
}
}

View File

@@ -1,45 +0,0 @@
package com.lanternsoftware.thermometer.servlet;
import com.lanternsoftware.util.NullUtils;
import org.apache.commons.io.IOUtils;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
public abstract class ThermoServlet extends HttpServlet {
public static void setResponseHtml(HttpServletResponse _response, String _sHtml) {
setResponseEntity(_response, "text/html", _sHtml);
}
public static void setResponseEntity(HttpServletResponse _response, String _sContentType, String _sEntity) {
setResponseEntity(_response, 200, _sContentType, _sEntity);
}
public static void setResponseEntity(HttpServletResponse _response, String _sContentType, byte[] _btData) {
setResponseEntity(_response, 200, _sContentType, _btData);
}
public static void setResponseEntity(HttpServletResponse _response, int _iStatus, String _sContentType, String _sEntity) {
setResponseEntity(_response, _iStatus, _sContentType, NullUtils.toByteArray(_sEntity));
}
public static void setResponseEntity(HttpServletResponse _response, int _iStatus, String _sContentType, byte[] _btData) {
OutputStream os = null;
try {
_response.setStatus(_iStatus);
_response.setCharacterEncoding("UTF-8");
_response.setContentType(_sContentType);
if ((_btData != null) && (_btData.length > 0)) {
_response.setContentLength(_btData.length);
os = _response.getOutputStream();
os.write(_btData);
} else
_response.setContentLength(0);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(os);
}
}
}

View File

@@ -0,0 +1 @@
com.lanternsoftware.thermometer.config.dao.EnvironmentConfigSerializer

View File

@@ -11,7 +11,7 @@
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/tomcat/log/thermo.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/opt/currentmonitor/log/thermo.%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<fileNamePattern>/opt/tomcat/log/thermo.%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>20</maxHistory>
</rollingPolicy>

View File

@@ -0,0 +1,10 @@
package com.lanternsoftware.thermometer;
import com.lanternsoftware.util.LanternFiles;
import com.lanternsoftware.util.dao.generator.DaoSerializerGenerator;
public class GenerateEnvironmentSerializers {
public static void main(String[] args) {
DaoSerializerGenerator.generateSerializers(LanternFiles.SOURCE_PATH, true, null);
}
}