This commit is contained in:
Wolfgang Hottgenroth 2020-09-07 17:47:37 +02:00
parent fc5b930d9e
commit 251769120e
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F
6 changed files with 218 additions and 57 deletions

View File

@ -0,0 +1,82 @@
package de.hottis.mbusMaster;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ConfigProperties extends Properties {
static final String DEFAULT_PROPS_FILENAME = "mbusMaster.props";
static final String PROPS_VERBOSE = "verbose";
static final String PRPOS_MAINCONFIGFILE = "mainConfigFile";
static final Logger logger = LogManager.getRootLogger();
private boolean overwriteVerbose;
public ConfigProperties() throws ConfigPropertiesException {
super();
String propsFilename = System.getProperty(PRPOS_MAINCONFIGFILE, DEFAULT_PROPS_FILENAME);
try {
try (FileInputStream propsFileInputStream = new FileInputStream(propsFilename)) {
load(propsFileInputStream);
}
logger.debug("Configuration loaded");
} catch (FileNotFoundException e) {
String msg = "Config file " + propsFilename + " not found";
logger.error(msg);
throw new ConfigPropertiesException(msg);
} catch (IOException e) {
String msg = "Error when reading config file " + propsFilename;
logger.error(msg);
throw new ConfigPropertiesException(msg, e);
}
String overwriteVerboseStr = System.getProperty(PROPS_VERBOSE, "no");
this.overwriteVerbose = ("yes".equalsIgnoreCase(overwriteVerboseStr) || "true".equalsIgnoreCase(overwriteVerboseStr));
}
public String getStringProperty(String key) throws ConfigPropertiesException {
String returnValue = this.getProperty(key);
if (returnValue == null) {
throw new ConfigPropertiesException(key + "not found");
}
return returnValue;
}
String getStringProperty(String key, String def) {
String returnValue;
try {
returnValue = this.getStringProperty(key);
} catch (ConfigPropertiesException e) {
returnValue = def;
}
return returnValue;
}
public boolean getBooleanProperty(String key) throws ConfigPropertiesException {
String v = this.getStringProperty(key);
return ("yes".equalsIgnoreCase(v) || "true".equalsIgnoreCase(v));
}
public boolean getBooleanProperty(String key, boolean def) {
boolean returnValue;
try {
returnValue = this.getBooleanProperty(key);
} catch (ConfigPropertiesException e) {
returnValue = def;
}
return returnValue;
}
public boolean isVerbose() {
return this.getBooleanProperty("verbose", false) || this.overwriteVerbose;
}
}

View File

@ -0,0 +1,21 @@
package de.hottis.mbusMaster;
import java.io.IOException;
public class ConfigPropertiesException extends Exception {
public ConfigPropertiesException() {
super();
}
public ConfigPropertiesException(String message, Throwable cause) {
super(message, cause);
}
public ConfigPropertiesException(String message) {
super(message);
}
public ConfigPropertiesException(Throwable cause) {
super(cause);
}
}

View File

@ -0,0 +1,28 @@
package de.hottis.mbusMaster;
import java.util.concurrent.BlockingQueue;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class DummyDequeuer extends Thread {
static final Logger logger = LogManager.getRootLogger();
private BlockingQueue<String> queue;
public DummyDequeuer(BlockingQueue<String> queue) {
super("DummyDequeuer");
this.queue = queue;
}
public void run() {
while(true) {
try {
String o = this.queue.take();
System.out.println("DummyDequeuer: " + o);
} catch (InterruptedException e) {
}
}
}
}

View File

@ -1,9 +1,11 @@
package de.hottis.mbusMaster;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -13,20 +15,13 @@ import org.openmuc.jmbus.MBusMessage;
import org.openmuc.jmbus.VariableDataStructure;
public class MbusMaster {
static final String PROPS_FILENAME = "mbusMaster.props";
static final Logger logger = LogManager.getRootLogger();
static boolean stopSignal = false;
public static void main(String[] args) throws Exception {
logger.info("MbusMaster starting");
/*
final Properties config = new Properties();
try (FileInputStream propsFileInputStream = new FileInputStream(PROPS_FILENAME)) {
config.load(propsFileInputStream);
}
logger.debug("Configuration loaded");
*/
final ConfigProperties config = new ConfigProperties();
/*
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
@ -35,50 +30,19 @@ public class MbusMaster {
logger.debug("Shutdown hook added");
*/
MbusgwChild mbusgw = new MbusgwChild(false);
mbusgw.start();
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();
MbusDevice[] devices = {
new FinderThreePhasePowerMeter("Total Electricity", (byte)80, 0),
new FinderOnePhasePowerMeter("Dryer", (byte)81, 0),
new FinderOnePhasePowerMeter("Laundry", (byte)82, 0),
new FinderOnePhasePowerMeter("Dishwasher", (byte)83, 0),
new FinderOnePhasePowerMeter("Light", (byte)84, 0),
new FinderOnePhasePowerMeter("Computer", (byte)85, 0),
new FinderOnePhasePowerMeter("Freezer", (byte)86, 0),
new FinderOnePhasePowerMeter("Fridge", (byte)87, 0)
};
int cnt = 0;
int errCnt = 0;
int successCnt = 0;
while (! stopSignal) {
cnt++;
for (MbusDevice device : devices) {
System.out.println("Querying " + device.getName() + " meter");
try {
mbusgw.sendRequest((byte)0x5b, device.getAddress());
byte[] frame = mbusgw.collectResponse();
device.parse(frame);
System.out.println(device);
MbusScheduledQuerier querier = new MbusScheduledQuerier(config, queue);
querier.start();
successCnt++;
} catch (IOException e) {
errCnt++;
logger.error("Error " + e.toString() + " in Meterbus dialog for device " + device.shortString());
}
}
// if (cnt >= 10) {
// break;
//}
System.out.println("--- " + cnt + " - " + successCnt + " - " + errCnt + " ---------------------------------------------------");
Thread.sleep(5*1000);
}
DummyDequeuer ddq = new DummyDequeuer(queue);
ddq.start();
logger.info("Stopping mbusgw process");
mbusgw.stop();
querier.join();
ddq.join();
logger.info("MbusMaster terminating");
}
}

View File

@ -1,21 +1,86 @@
package de.hottis.mbusMaster;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.BlockingQueue;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MbusScheduledQuerier {
public class MbusScheduledQuerier extends Thread {
static final Logger logger = LogManager.getRootLogger();
private ArrayList<MbusDevice> devices;
private boolean stopSignal = false;
private ConfigProperties config;
private BlockingQueue<String> queue;
public MbusScheduledQuerier(ConfigProperties config, BlockingQueue<String> queue) {
super("MbusScheduledQuerier");
this.config = config;
this.queue = queue;
public MbusScheduledQuerier() {
this.devices = new ArrayList<>();
this.devices.add(new FinderThreePhasePowerMeter("Total Electricity", (byte)80, 0));
this.devices.add(new FinderOnePhasePowerMeter("Dryer", (byte)81, 0));
this.devices.add(new FinderOnePhasePowerMeter("Laundry", (byte)82, 0));
this.devices.add(new FinderOnePhasePowerMeter("Dishwasher", (byte)83, 0));
this.devices.add(new FinderOnePhasePowerMeter("Light", (byte)84, 0));
this.devices.add(new FinderOnePhasePowerMeter("Computer", (byte)85, 0));
this.devices.add(new FinderOnePhasePowerMeter("Freezer", (byte)86, 0));
this.devices.add(new FinderOnePhasePowerMeter("Fridge", (byte)87, 0));
}
public void setStopSignal() {
this.stopSignal = true;
}
public void run() {
try {
MbusgwChild mbusgw = new MbusgwChild(config);
mbusgw.start();
}
int cnt = 0;
int errCnt = 0;
int successCnt = 0;
while (! this.stopSignal) {
cnt++;
for (MbusDevice device : this.devices) {
logger.info("Querying " + device.getName() + " meter");
try {
mbusgw.sendRequest((byte)0x5b, device.getAddress());
byte[] frame = mbusgw.collectResponse();
device.parse(frame);
logger.info("Got: " + device.toString());
this.queue.add(device.toString());
successCnt++;
} catch (IOException e) {
errCnt++;
logger.error("Error " + e.toString() + " in Meterbus dialog for device " + device.shortString());
}
}
logger.info("Cnt: " + cnt + ", SuccessCnt: " + successCnt + ", ErrCnt: " + errCnt);
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
}
}
logger.info("Stopping mbusgw process");
try {
mbusgw.stop();
} catch (InterruptedException | IOException e) {
logger.error("Problems to stop Meterbus Gateway process: " + e.toString() + ", however, terminating anyway");
}
} catch (IOException e) {
logger.error("Unable to start Meterbus Gateway process");
}
}
}

View File

@ -8,7 +8,6 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -16,17 +15,19 @@ import org.apache.logging.log4j.Logger;
public class MbusgwChild {
static final Logger logger = LogManager.getRootLogger();
static final String PROPS_VERBOSE = "verbose";
private ConfigProperties config;
private Process mbusgwProcess;
private InputStream processInput;
private OutputStream processOutput;
private boolean verbose;
private Thread stderrToLog;
public MbusgwChild(boolean verbose) {
this.verbose = verbose;
public MbusgwChild(ConfigProperties config) {
this.config = config;
this.verbose = this.config.isVerbose();
}
public void start() throws IOException {