DataParsers loaded from configuration, DataObjectQueue introduced
This commit is contained in:
parent
9b8df1b119
commit
bc8482b03c
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
MeasurementCollectorMqttReceiver-*
|
Binary file not shown.
Binary file not shown.
BIN
bin/de/hottis/MeasurementCollector/DataObjectQueue.class
Normal file
BIN
bin/de/hottis/MeasurementCollector/DataObjectQueue.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,3 +1,13 @@
|
||||
mqtt.broker = tcp://172.16.2.15:1883
|
||||
; mqtt.username = tron
|
||||
; mqtt.password = geheim123
|
||||
; mqtt.broker = tcp://172.16.2.15:1883
|
||||
mqtt.broker = tcp://eupenstrasse20.dynamic.hottis.de:2883
|
||||
mqtt.username = tron
|
||||
mqtt.password = geheim123
|
||||
|
||||
mbus.dataparser.1 = light,Light,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.2 = computer,Computer,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.3 = laundry,Laundry,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.4 = dryer,Dryer,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.5 = dishwasher,Dishwasher,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.6 = freezer,Freezer,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.7 = electricity,Total,de.hottis.MeasurementCollector.FinderThreePhasePowerMeter
|
||||
mbus.dataparser.8 = thermom.,null,de.hottis.MeasurementCollector.HottisFourChannelThermometer
|
||||
|
@ -5,6 +5,12 @@ import java.util.List;
|
||||
|
||||
import org.openmuc.jmbus.DataRecord;
|
||||
|
||||
public interface ADataParser {
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, String name, List<DataRecord> dataRecords);
|
||||
public abstract class ADataParser {
|
||||
protected String name;
|
||||
|
||||
public ADataParser(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
abstract public List<ADataObject> parse(LocalDateTime timestamp, List<DataRecord> dataRecords);
|
||||
}
|
||||
|
@ -1,15 +1,16 @@
|
||||
package de.hottis.MeasurementCollector;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.Properties;
|
||||
|
||||
public abstract class AMessageParser {
|
||||
private String topic;
|
||||
protected ConcurrentLinkedQueue<List<ADataObject>> queue;
|
||||
protected DataObjectQueue queue;
|
||||
protected Properties config;
|
||||
|
||||
public AMessageParser(String topic, ConcurrentLinkedQueue<List<ADataObject>> queue) {
|
||||
public AMessageParser(String topic, Properties config, DataObjectQueue queue) {
|
||||
this.topic = topic;
|
||||
this.config = config;
|
||||
this.queue = queue;
|
||||
}
|
||||
|
||||
|
11
src/de/hottis/MeasurementCollector/DataObjectQueue.java
Normal file
11
src/de/hottis/MeasurementCollector/DataObjectQueue.java
Normal file
@ -0,0 +1,11 @@
|
||||
package de.hottis.MeasurementCollector;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class DataObjectQueue extends ConcurrentLinkedQueue<List<ADataObject>> {
|
||||
public DataObjectQueue() {
|
||||
super();
|
||||
}
|
||||
}
|
@ -6,8 +6,12 @@ import java.util.List;
|
||||
|
||||
import org.openmuc.jmbus.DataRecord;
|
||||
|
||||
public class FinderOnePhasePowerMeter implements ADataParser {
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, String name, List<DataRecord> dataRecords) {
|
||||
public class FinderOnePhasePowerMeter extends ADataParser {
|
||||
public FinderOnePhasePowerMeter(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, List<DataRecord> dataRecords) {
|
||||
ArrayList<ADataObject> list = new ArrayList<ADataObject>();
|
||||
|
||||
ElectricEnergyDataObject tdo = new ElectricEnergyDataObject(timestamp, name,
|
||||
|
@ -6,8 +6,12 @@ import java.util.List;
|
||||
|
||||
import org.openmuc.jmbus.DataRecord;
|
||||
|
||||
public class FinderThreePhasePowerMeter implements ADataParser {
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, String name, List<DataRecord> dataRecords) {
|
||||
public class FinderThreePhasePowerMeter extends ADataParser {
|
||||
public FinderThreePhasePowerMeter(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, List<DataRecord> dataRecords) {
|
||||
ArrayList<ADataObject> list = new ArrayList<ADataObject>();
|
||||
|
||||
ElectricEnergyDataObject tdo = new ElectricEnergyDataObject(timestamp, name,
|
||||
|
@ -6,8 +6,12 @@ import java.util.List;
|
||||
|
||||
import org.openmuc.jmbus.DataRecord;
|
||||
|
||||
public class HottisFourChannelThermometer implements ADataParser {
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, String name, List<DataRecord> dataRecords) {
|
||||
public class HottisFourChannelThermometer extends ADataParser {
|
||||
public HottisFourChannelThermometer(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
public List<ADataObject> parse(LocalDateTime timestamp, List<DataRecord> dataRecords) {
|
||||
ArrayList<ADataObject> list = new ArrayList<ADataObject>();
|
||||
|
||||
TemperatureDataObject tdo = new TemperatureDataObject(timestamp, "Hedge", dataRecords.get(5).getScaledDataValue());
|
||||
|
@ -1,9 +1,12 @@
|
||||
package de.hottis.MeasurementCollector;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.openmuc.jmbus.DataRecord;
|
||||
import org.openmuc.jmbus.MBusMessage;
|
||||
@ -13,28 +16,55 @@ import com.json.parsers.JSONParser;
|
||||
import com.json.parsers.JsonParserFactory;
|
||||
|
||||
public class MBusParser extends AMessageParser {
|
||||
static final String DATA_PARSER_PROP = "mbus.dataparser";
|
||||
|
||||
static final String TOPIC = "IoT/Measurement/MeterbusHub";
|
||||
|
||||
private final JSONParser jsonParser;
|
||||
private final HottisFourChannelThermometer hottisFourChannelThermometer;
|
||||
private final FinderOnePhasePowerMeter finderOnePhasePowerMeter;
|
||||
private final FinderThreePhasePowerMeter finderThreePhasePowerMeter;
|
||||
|
||||
public MBusParser(ConcurrentLinkedQueue<List<ADataObject>> queue) {
|
||||
super(TOPIC, queue);
|
||||
private HashMap<String, ADataParser> dataParsers;
|
||||
|
||||
public MBusParser(Properties config, DataObjectQueue queue) {
|
||||
super(TOPIC, config, queue);
|
||||
JsonParserFactory jsonParserFactory = JsonParserFactory.getInstance();
|
||||
jsonParser = jsonParserFactory.newJsonParser();
|
||||
hottisFourChannelThermometer = new HottisFourChannelThermometer();
|
||||
finderOnePhasePowerMeter = new FinderOnePhasePowerMeter();
|
||||
finderThreePhasePowerMeter = new FinderThreePhasePowerMeter();
|
||||
dataParsers = new HashMap<String, ADataParser>();
|
||||
}
|
||||
|
||||
public void registerConfiguredDataParsers() throws MeasurementCollectorException {
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Enumeration<String> propNames = (Enumeration<String>) config.propertyNames();
|
||||
while (propNames.hasMoreElements()) {
|
||||
String propName = propNames.nextElement();
|
||||
if (propName.startsWith(DATA_PARSER_PROP)) {
|
||||
String[] parserConfigElements = config.get(propName).toString().split(",");
|
||||
String nameInMsg = parserConfigElements[0];
|
||||
String nameInDatabase = parserConfigElements[1];
|
||||
String dataParserClassName = parserConfigElements[2];
|
||||
|
||||
Class<?> klass = Class.forName(dataParserClassName);
|
||||
Constructor<?> constructor = klass.getConstructor(String.class);
|
||||
ADataParser dataParser = (ADataParser) constructor.newInstance(nameInDatabase);
|
||||
|
||||
dataParsers.put(nameInMsg, dataParser);
|
||||
System.out.println(dataParserClassName + " registered for " + nameInMsg + ", " + nameInDatabase);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new MeasurementCollectorException("Exception when registering configured data parsers", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(LocalDateTime timestamp, String msgPayload) {
|
||||
try {
|
||||
@SuppressWarnings("rawtypes")
|
||||
Map payloadMap = jsonParser.parseJson(msgPayload);
|
||||
@SuppressWarnings("rawtypes")
|
||||
String name = (String)(((Map)(payloadMap.get("metadata"))).get("name"));
|
||||
@SuppressWarnings("rawtypes")
|
||||
String mbusMsgTxt = (String)(((Map)(payloadMap.get("data"))).get("telegram"));
|
||||
String [] octetsTxt = mbusMsgTxt.split(" ");
|
||||
byte [] octets = new byte[octetsTxt.length];
|
||||
@ -47,37 +77,19 @@ public class MBusParser extends AMessageParser {
|
||||
variableDataStructure.decode();
|
||||
List<DataRecord> dataRecords = variableDataStructure.getDataRecords();
|
||||
|
||||
//for (DataRecord dataRecord : dataRecords) {
|
||||
// System.out.println(dataRecord.getScaledDataValue() + " " + dataRecord.getUnit().getUnit());
|
||||
//}
|
||||
|
||||
List<ADataObject> measurementItems;
|
||||
switch (name) {
|
||||
case "thermom.":
|
||||
measurementItems = hottisFourChannelThermometer.parse(timestamp, name, dataRecords);
|
||||
break;
|
||||
case "light":
|
||||
case "computer":
|
||||
case "freezer":
|
||||
case "dryer":
|
||||
case "laundry":
|
||||
case "dishwasher":
|
||||
measurementItems = finderOnePhasePowerMeter.parse(timestamp, name.substring(0,1).toUpperCase() + name.substring(1).toLowerCase(), dataRecords);
|
||||
break;
|
||||
case "electricity":
|
||||
measurementItems = finderThreePhasePowerMeter.parse(timestamp, "Total", dataRecords);
|
||||
break;
|
||||
default:
|
||||
System.out.println("unknown name");
|
||||
measurementItems = null;
|
||||
if (dataParsers.containsKey(name)) {
|
||||
List<ADataObject> measurementItems = dataParsers.get(name).parse(timestamp, dataRecords);
|
||||
|
||||
for (ADataObject ado : measurementItems) {
|
||||
System.out.println(ado);
|
||||
}
|
||||
|
||||
queue.add(measurementItems);
|
||||
System.out.println("Queue size: " + queue.size());
|
||||
} else {
|
||||
System.out.println("unknown name: " + name);
|
||||
}
|
||||
|
||||
for (ADataObject ado : measurementItems) {
|
||||
System.out.println(ado);
|
||||
}
|
||||
|
||||
queue.add(measurementItems);
|
||||
System.out.println("Queue size: " + queue.size());
|
||||
} catch (Exception e) {
|
||||
System.out.println("Exception when handling mbus message: " + e);
|
||||
}
|
||||
|
@ -1,8 +1,6 @@
|
||||
package de.hottis.MeasurementCollector;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
public class MeasurementCollector {
|
||||
static final String PROPS_FILENAME = "measurementCollector.props";
|
||||
@ -14,15 +12,14 @@ public class MeasurementCollector {
|
||||
final Properties config = new Properties();
|
||||
config.load(MeasurementCollector.class.getClassLoader().getResourceAsStream(PROPS_FILENAME));
|
||||
|
||||
|
||||
MqttReceiver mqttReceiver = new MqttReceiver(config);
|
||||
mqttReceiver.connect();
|
||||
|
||||
// TestParser testParser = new TestParser();
|
||||
// mqttReceiver.registerParser(testParser);
|
||||
DataObjectQueue queue = new DataObjectQueue();
|
||||
|
||||
ConcurrentLinkedQueue<List<ADataObject>> queue = new ConcurrentLinkedQueue<List<ADataObject>>();
|
||||
|
||||
MBusParser mbusParser = new MBusParser(queue);
|
||||
MBusParser mbusParser = new MBusParser(config, queue);
|
||||
mbusParser.registerConfiguredDataParsers();
|
||||
mqttReceiver.registerParser(mbusParser);
|
||||
|
||||
}
|
||||
|
@ -1,8 +1,7 @@
|
||||
package de.hottis.MeasurementCollector;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class MeasurementCollectorException extends Exception {
|
||||
private static final long serialVersionUID = -5819010697931904741L;
|
||||
|
||||
public MeasurementCollectorException(String msg, Throwable cause) {
|
||||
super(msg, cause);
|
||||
}
|
||||
|
@ -1,16 +0,0 @@
|
||||
package de.hottis.MeasurementCollector;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class TestParser extends AMessageParser {
|
||||
|
||||
public TestParser() {
|
||||
super("IoT/Watchdog");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(LocalDateTime timestamp, String msgPayload) {
|
||||
System.out.println(timestamp.toString() + " " + msgPayload);
|
||||
}
|
||||
|
||||
}
|
@ -1,3 +1,13 @@
|
||||
mqtt.broker = tcp://172.16.2.15:1883
|
||||
; mqtt.username = tron
|
||||
; mqtt.password = geheim123
|
||||
; mqtt.broker = tcp://172.16.2.15:1883
|
||||
mqtt.broker = tcp://eupenstrasse20.dynamic.hottis.de:2883
|
||||
mqtt.username = tron
|
||||
mqtt.password = geheim123
|
||||
|
||||
mbus.dataparser.1 = light,Light,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.2 = computer,Computer,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.3 = laundry,Laundry,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.4 = dryer,Dryer,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.5 = dishwasher,Dishwasher,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.6 = freezer,Freezer,de.hottis.MeasurementCollector.FinderOnePhasePowerMeter
|
||||
mbus.dataparser.7 = electricity,Total,de.hottis.MeasurementCollector.FinderThreePhasePowerMeter
|
||||
mbus.dataparser.8 = thermom.,null,de.hottis.MeasurementCollector.HottisFourChannelThermometer
|
||||
|
Loading…
x
Reference in New Issue
Block a user