From 7df95c52b37ddff69199d3e3e58493da7280f91a Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Wed, 15 Nov 2017 16:50:49 +0100 Subject: [PATCH] changes --- .classpath | 1 + .../MeasurementCollector/ADataObject.class | Bin 0 -> 855 bytes .../MeasurementCollector/MBusParser.class | Bin 0 -> 3350 bytes .../MeasurementCollector.class | Bin 1544 -> 1688 bytes .../MeasurementCollectorException.class | Bin 501 -> 565 bytes .../MqttReceiver$Listener.class | Bin 1519 -> 1355 bytes .../MeasurementCollector/MqttReceiver.class | Bin 3678 -> 3678 bytes .../TemperatureDataObject.class | Bin 0 -> 947 bytes bin/measurementCollector.props | 6 +- libraries/quick-json-1.0.2.3.jar | Bin 0 -> 43369 bytes .../MeasurementCollector/ADataObject.java | 33 +++++++++++ .../MeasurementCollector/ADataParser.java | 10 ++++ .../HottisFourChannelThermometer.java | 20 +++++++ .../MeasurementCollector/MBusParser.java | 52 ++++++++++++++++++ .../MeasurementCollector.java | 31 +---------- .../MeasurementCollectorException.java | 2 + .../TemperatureDataObject.java | 20 +++++++ src/measurementCollector.props | 6 +- 18 files changed, 147 insertions(+), 34 deletions(-) create mode 100644 bin/de/hottis/MeasurementCollector/ADataObject.class create mode 100644 bin/de/hottis/MeasurementCollector/MBusParser.class create mode 100644 bin/de/hottis/MeasurementCollector/TemperatureDataObject.class create mode 100644 libraries/quick-json-1.0.2.3.jar create mode 100644 src/de/hottis/MeasurementCollector/ADataObject.java create mode 100644 src/de/hottis/MeasurementCollector/ADataParser.java create mode 100644 src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java create mode 100644 src/de/hottis/MeasurementCollector/MBusParser.java create mode 100644 src/de/hottis/MeasurementCollector/TemperatureDataObject.java diff --git a/.classpath b/.classpath index a306a2f..9855d06 100644 --- a/.classpath +++ b/.classpath @@ -4,5 +4,6 @@ + diff --git a/bin/de/hottis/MeasurementCollector/ADataObject.class b/bin/de/hottis/MeasurementCollector/ADataObject.class new file mode 100644 index 0000000000000000000000000000000000000000..556693abcbfd13eb1dfe52170831aebfff4db5bd GIT binary patch literal 855 zcma)4%T60X5UknV*w}2a*(4<7#p?nFu@@pm0wG02IhiDqk)<5R_Q(v{hqXJ4#AoGz zkT~Q6_$Wm8jAJ>E1DBcU>h9|5+P%BK{RQ9vTXlE>oso*qb7OQFpDI~ag-TUsPVyvC zLz5Trr_a*JZ-Wbp>Iekd7xGfZiOj~aLj@W}r>ZnEod~RUZJv?1n-66|?dpu8LxCWZ zsS=1>iKXb7LT6*j)h=aHsZyZjvX#+Ed@3iDYV`CtlZKQDeE2ha^e@#M;`ALJGyRdy zv^f^o-*yH65jfX5m9^6+(I@#xHQ{49#8X59{`OA40fFZso}k9Bl@N6-uymcNuT?rw z#hDx=c2%~ZFAL4_6b#I{rbYL5W@vEkpxNTE%{| znc%C*Z_&+OUKK<2Me|zixu0U6zjv@fHu&^c`S92kdU@=Ly@{Bzi}oE7F386vI$MPN zpqTqwog1_}yVrQu*}KMzpSJiVoe=^$7wKe$+_;2Sgsi(Ztl~9AL}14X`{Kbo<_+G` z?FPTIG742)_h2DDtrR0GC?6 AvH$=8 literal 0 HcmV?d00001 diff --git a/bin/de/hottis/MeasurementCollector/MBusParser.class b/bin/de/hottis/MeasurementCollector/MBusParser.class new file mode 100644 index 0000000000000000000000000000000000000000..7751f98b9797d9c1ef5c7672c418bf3c3aa3d661 GIT binary patch literal 3350 zcma)8X?Gjd8Gf$q_>SZ;aTM%CA&Y@FvEn!iTLN+j!43&>ZO6pMEu<92(v3Vunh}~& z61N0sSwksHDP1UAXldF)m#`>F+mq8T{ZPJgPWc1(QupETldx&y0bINvu~GFI&kfP z<*NzK`WqKu8&VQI#KOt~ETq81cJvCwg39aE30&K#o}q=RZx_=eR=M9mpMX(PzLmFp zs|{&fC$WnK2+%n%X5xC>K-{pbx}1x=JUlhSYtf%txn$rbV$88hN@9;d$8xwExP|-L zssU!!@KsS2DptwBtpcJuj@`J;#D3h)JL8p$HZ5;kY&p6#siTWbM{98m;tq)ex?T&H zEbI8HpeiN~;t&nMk4*x>I-sB4(tHIWAcZ*kN~R_4li4FO9=P?IPKY+M;* z-SZf1JSZ`<6m+wmuSzD0C=tkRmFhdg;A}TNM*j7gOJ$Y%C0y2|j++ou168}2SCu#% zJf!K8i8}_*gpVo%VdBQgFe^9S52sfSf^aKgk%%n~tHnV8D6g)9bOgA299 zgFwZPw2Ft9oeag6T*c)lkKqv$kK!@15naBU-9TV-Ly#RPmOQ;rb3efo5|0aPXpr+r zN-KSGdB~AJI^?HKJfj5+-wjvecoxq|{8V6Vkm;p0F!3|pk7QYwrRZqHykO!*yu`I> z%Nq^A!6tUEftSfgcbv?rvTwUi_larcbWdAOzQ}&st#4{~DQv$P5{iQkiC@l}3^28D zl+3B=n9a9T7D$H3Xh6_xxh1bKX3Z8|i=~T~!x5=eH=a76HMeS6x-jAuCN!F3Zq8S} z7mU|7U@amdln`h-IzSGz`JZLTkrH;n25g|)Q^Z6x*m*o^avF$Cbx00;)HFERm`B*W z^8pD(9MG{SsDJ?&Rb7DaX`opfKSDaJGXn|z&3>I-~!Z11gM{YTh%E)d?#Zvrj+c2Zpz zm8|1@J+^SAD?EyBngw@axCYl!G5ZO=9U5qw;@NiYUf%v8Htwil>u6tM$3^UH!oQJD z+!&2^XIlCaH!mz_7M52fS0(n=urJe^Y`yd^BO{x48)va0DLaj1Yo~F2N5=&WtijwP zFHJmQ2)%ge%-sKzGAS=zz?~T*Y1A;9i6vt-9MPZ2OgtICh z&M|u66Z{XaFn*oGA!ZHO#2jsAzP4Zwzx$cDL(JI-vu5$Ph^;t|Z8(J<5?BhS(Tg+K zf&cRN6YRvNeCd3~SB=j7^FjG8Q_IzyF~9f~ejQl7jNhChdn(f2GvlxROWf9K(xA2#LQ-?3PFeUk=`v_&^XubJ&IU iFB6c+N{mZ3aLE+mhB+E(UJ%w=U+JRN4{56jAAJFRG?hyL literal 0 HcmV?d00001 diff --git a/bin/de/hottis/MeasurementCollector/MeasurementCollector.class b/bin/de/hottis/MeasurementCollector/MeasurementCollector.class index 0d268c976164e4eda134bab7da7b731deda75c87..df80c965948a729205d40b6641527b50c4a12107 100644 GIT binary patch delta 207 zcmeC+nZYY?>ff$?3=9k=4B_kyOpFZ1lNlL}H#(nYW@BgYWMt3;auxWTN{a&$i;7c= zxEMSb_$KqQ?BUH#f{8IQXis8PWCp64e1K&E=RO8z23DYf9+NX!Eo62xctmbz@Umjj zk!0D%;Ia`Y!NkB1B()g0Ca+^v^mb$rV{m7XU=RSi0j!b1o52Uj6JW4l@MZ90U}R8d kP-O6D2mtCdW)NivWC#LU;mE+w5X=z5zyg#H1)CZM0N?s0*Z=?k delta 127 zcmbQi+rcAn>ff$?3=9k=3_M&+t RWAJ0}2b#sm5CAqK5CCeD6QKYA diff --git a/bin/de/hottis/MeasurementCollector/MeasurementCollectorException.class b/bin/de/hottis/MeasurementCollector/MeasurementCollectorException.class index b4f6ebe44bc82898a8d3fd14458c69d5f00f73db..9a2e8c39401b205291b8c58c073ba7dc2db140c3 100644 GIT binary patch delta 195 zcmey$yp@IP)W2Q(7#J8#7$hfh#p($Zrxs-<=7gmd6=&w>g?hR$GBA2EGVnU*=M|SE z=9Ppc=9H$guD9DU^XMc^>4~Y1YuhJ>*a&1YF>nD%E+EYSR>;P{4P+@mlriuy@B(>24Geq?{6IrMECB{VplU`2 KAs~;5K^Op>Ne#&W diff --git a/bin/de/hottis/MeasurementCollector/MqttReceiver$Listener.class b/bin/de/hottis/MeasurementCollector/MqttReceiver$Listener.class index 7a93753907519545625c5883c213a55a34411656..5eeadad797dc76f70284381d2c0b4c98cc211327 100644 GIT binary patch delta 251 zcmXAjO-=$)5QM)sJu>>3#Z!#K_y@|LFd&ZNKVHJE_i*PS$U6yY$b!JB KqE*jmdJIdt8zVXZ delta 433 zcmZvY$w~u35Qe{=Q74Xr#tk(tNnE0d%NTc!`@RK4!LtJnF%qLBqv*+J2=fZQfD1u9 zh-ZBS&mP4G5X3gQN&kUcdXHc*{l@(-?KXl@@iJ3D>8F%BPsthzTOO1HT(C zsVFs=Vb;A=J3Ue64Hj6uzfq&&I)N$!f_F63wC3?g9xxv1>dn*pLiCa0zC4q8=5FO9 zg=%?L77UGeXp%edQ6p=CB7|D%q>?z6SVk0XE38VV!kSbH>ukuZ%bt+4tDEo(oK9GL diff --git a/bin/de/hottis/MeasurementCollector/MqttReceiver.class b/bin/de/hottis/MeasurementCollector/MqttReceiver.class index d1d5592a90640bcc404f909a7218cdda84182ff6..993fb3db03ccf34ea06f2e816c8ce81dfce2946f 100644 GIT binary patch delta 131 zcmca7b5CZ&Uv6Dx1{MZI1_1^Y1{nrb1`P%^24eV+LUc69zd3Q=mRGpc+%44hsfLAan%kb7in*2w7ZOOUX?&TPduQ&s=bkgaet-W7pb1k$g3vsX=EPIV3e3I~LFh|Ix~lEj zwj3+ZHwV(0N?$0x=m;eaMrWMYkR;TvsoY<@Clm(V{`>CX{@}x5_tV?%F`?8u6X(LT zg?nlqDc^EWTZDYua|0z@H57IzGsqHF)q(*b{nBzR^@?EDX7$Q)q}lVv!sd2zz)|aO z;EpjQB-`GJ)UkrK9CQ>2jsJl#h8orh>oMt2S+@B`1e3m)>L{WdA>JUY)Qq8yO>Akn zNhmG`?0DhGmN`_gP0-Gx;SN3%HfkMXiS6uFD?+@L!)@GQ#A&Dq&*w~Iv1S%5PdU#l zL(Nk<2={Whk18P>$eFAGi$4d92jL-FkwAr><;r)VGm`#5Fx|+bNZ6t9ttg%+lWJly z#IxQt{$KfX*yC(u8Jp}(36+1E$bPxPVGh(`*JH)FX?ga3S${^-KNyV&Cj!c)#C(D(x~h4W+p literal 0 HcmV?d00001 diff --git a/bin/measurementCollector.props b/bin/measurementCollector.props index 81c10be..7cb4554 100644 --- a/bin/measurementCollector.props +++ b/bin/measurementCollector.props @@ -1,3 +1,3 @@ -mqtt.broker = tcp://eupenstrasse20.dynamic.hottis.de:2883 -mqtt.username = tron -mqtt.password = geheim123 +mqtt.broker = tcp://172.16.2.15:1883 +; mqtt.username = tron +; mqtt.password = geheim123 diff --git a/libraries/quick-json-1.0.2.3.jar b/libraries/quick-json-1.0.2.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..5b1af44f35d0c6757bd711247ac687ba722c2385 GIT binary patch literal 43369 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 TBn1tP8Tip4KtsbwMSlA~{|kd% literal 0 HcmV?d00001 diff --git a/src/de/hottis/MeasurementCollector/ADataObject.java b/src/de/hottis/MeasurementCollector/ADataObject.java new file mode 100644 index 0000000..16d3445 --- /dev/null +++ b/src/de/hottis/MeasurementCollector/ADataObject.java @@ -0,0 +1,33 @@ +package de.hottis.MeasurementCollector; + +import java.time.LocalDateTime; +import java.util.Map; + +public abstract class ADataObject { + private LocalDateTime timestamp; + private String name; + private Map values; + + public ADataObject(LocalDateTime timestamp, String name) { + this.timestamp = timestamp; + this.name = name; + } + + public void setValues(Map values) { + this.values = values; + } + + abstract public String getTableName(); + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public Map getValues() { + return values; + } + + public String getName() { + return name; + } +} diff --git a/src/de/hottis/MeasurementCollector/ADataParser.java b/src/de/hottis/MeasurementCollector/ADataParser.java new file mode 100644 index 0000000..d109410 --- /dev/null +++ b/src/de/hottis/MeasurementCollector/ADataParser.java @@ -0,0 +1,10 @@ +package de.hottis.MeasurementCollector; + +import java.time.LocalDateTime; +import java.util.List; + +import org.openmuc.jmbus.DataRecord; + +public interface ADataParser { + public List parse(LocalDateTime timestamp, String name, List dataRecords); +} diff --git a/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java b/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java new file mode 100644 index 0000000..2dede56 --- /dev/null +++ b/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java @@ -0,0 +1,20 @@ +package de.hottis.MeasurementCollector; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.openmuc.jmbus.DataRecord; + +public class HottisFourChannelThermometer implements ADataParser { + public List parse(LocalDateTime timestamp, String name, List dataRecords) { + ArrayList list = new ArrayList(); + + TemperatureDataObject tdo = new TemperatureDataObject(timestamp, "Hedge", dataRecords.get(5).getScaledDataValue()); + list.add(tdo); + + tdo = new TemperatureDataObject(timestamp, "House", dataRecords.get(7).getScaledDataValue()); + + return list; + } +} diff --git a/src/de/hottis/MeasurementCollector/MBusParser.java b/src/de/hottis/MeasurementCollector/MBusParser.java new file mode 100644 index 0000000..f321780 --- /dev/null +++ b/src/de/hottis/MeasurementCollector/MBusParser.java @@ -0,0 +1,52 @@ +package de.hottis.MeasurementCollector; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +import org.openmuc.jmbus.DataRecord; +import org.openmuc.jmbus.MBusMessage; +import org.openmuc.jmbus.VariableDataStructure; + +import com.json.parsers.JSONParser; +import com.json.parsers.JsonParserFactory; + +public class MBusParser extends AMessageParser { + + static final String TOPIC = "IoT/Measurement/MeterbusHub"; + + private final JSONParser jsonParser; + + public MBusParser() { + super(TOPIC); + JsonParserFactory jsonParserFactory = JsonParserFactory.getInstance(); + jsonParser = jsonParserFactory.newJsonParser(); + } + + @Override + public void execute(LocalDateTime timestamp, String msgPayload) { + try { + Map payloadMap = jsonParser.parseJson(msgPayload); + String name = (String)(((Map)(payloadMap.get("metadata"))).get("name")); + String mbusMsgTxt = (String)(((Map)(payloadMap.get("data"))).get("telegram")); + String [] octetsTxt = mbusMsgTxt.split(" "); + byte [] octets = new byte[octetsTxt.length]; + for (int i = 0; i < octetsTxt.length; i++) { + octets[i] = (byte)(Integer.parseInt(octetsTxt[i], 16) & 0xff); + } + + MBusMessage mbusMsg = MBusMessage.decode(octets, octets.length); + VariableDataStructure variableDataStructure = mbusMsg.getVariableDataResponse(); + variableDataStructure.decode(); + List dataRecords = variableDataStructure.getDataRecords(); + + for (DataRecord dataRecord : dataRecords) { + System.out.println(dataRecord.getScaledDataValue() + " " + dataRecord.getUnit().getUnit()); + } + } catch (Exception e) { + System.out.println("Exception when handling mbus message: " + e); + } + + } + +} diff --git a/src/de/hottis/MeasurementCollector/MeasurementCollector.java b/src/de/hottis/MeasurementCollector/MeasurementCollector.java index 91b6f84..f31f048 100644 --- a/src/de/hottis/MeasurementCollector/MeasurementCollector.java +++ b/src/de/hottis/MeasurementCollector/MeasurementCollector.java @@ -18,34 +18,9 @@ public class MeasurementCollector { TestParser testParser = new TestParser(); mqttReceiver.registerParser(testParser); + MBusParser mbusParser = new MBusParser(); + mqttReceiver.registerParser(mbusParser); + } -/* -import org.openmuc.jmbus.DataRecord; -import org.openmuc.jmbus.MBusMessage; -import org.openmuc.jmbus.VariableDataStructure; -import java.util.List; - - // String txtMsg = "68 38 38 68 08 54 72 21 00 13 00 2E 19 24 02 43 00 00 00 8C 10 04 97 84 16 00 8C 11 04 97 84 16 00 02 FD C9 FF 01 DF 00 02 FD DB FF 01 0D 00 02 AC FF 01 1B 00 82 40 AC FF 01 00 00 1A 16"; - String txtMsg = "68 61 61 68 08 21 72 00 00 00 00 00 00 01 00 B5 00 00 00 01 24 08 01 25 10 01 26 0D 02 27 01 01 05 67 C8 44 C0 3C 05 67 34 E9 0C 41 05 67 B7 F3 9A 41 05 67 71 86 25 41 0F E0 7A 32 00 B5 99 04 00 73 98 02 00 00 00 00 00 A6 06 00 00 A2 C3 7F 3F A5 BA 7F 3F 85 A7 7F 3F E7 F9 7F 3F CD CC CC 3D E8 03 00 00 12 16"; - String [] octetsTxt = txtMsg.split(" "); - byte [] octets = new byte[octetsTxt.length]; - System.out.println("Start"); - for (int i = 0; i < octetsTxt.length; i++) { - System.out.println(octetsTxt[i]); - octets[i] = (byte)(Integer.parseInt(octetsTxt[i], 16) & 0xff); - } - System.out.println("End"); - - MBusMessage mbusMsg = MBusMessage.decode(octets, octets.length); - //System.out.println("MBusMessage: " + mbusMsg.toString()); - VariableDataStructure variableDataStructure = mbusMsg.getVariableDataResponse(); - variableDataStructure.decode(); - List dataRecords = variableDataStructure.getDataRecords(); - - for (DataRecord dataRecord : dataRecords) { - System.out.println(dataRecord.getScaledDataValue() + " " + dataRecord.getUnit().getUnit()); - } - } -*/ } diff --git a/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java b/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java index 0039b9b..0a4dc20 100644 --- a/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java +++ b/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java @@ -1,6 +1,8 @@ package de.hottis.MeasurementCollector; public class MeasurementCollectorException extends Exception { + private static final long serialVersionUID = -5819010697931904741L; + public MeasurementCollectorException(String msg, Throwable cause) { super(msg, cause); } diff --git a/src/de/hottis/MeasurementCollector/TemperatureDataObject.java b/src/de/hottis/MeasurementCollector/TemperatureDataObject.java new file mode 100644 index 0000000..1a9969f --- /dev/null +++ b/src/de/hottis/MeasurementCollector/TemperatureDataObject.java @@ -0,0 +1,20 @@ +package de.hottis.MeasurementCollector; + +import java.time.LocalDateTime; +import java.util.HashMap; + +public class TemperatureDataObject extends ADataObject { + static final String TEMPERATURE_KEY = "temperature"; + static final String TABLE_NAME = "temperature"; + + public TemperatureDataObject(LocalDateTime timestamp, String name, double temperature) { + super(timestamp, name); + HashMap values = new HashMap(); + values.put(TEMPERATURE_KEY, temperature); + setValues(values); + } + + public String getTableName() { + return TABLE_NAME; + } +} diff --git a/src/measurementCollector.props b/src/measurementCollector.props index 81c10be..7cb4554 100644 --- a/src/measurementCollector.props +++ b/src/measurementCollector.props @@ -1,3 +1,3 @@ -mqtt.broker = tcp://eupenstrasse20.dynamic.hottis.de:2883 -mqtt.username = tron -mqtt.password = geheim123 +mqtt.broker = tcp://172.16.2.15:1883 +; mqtt.username = tron +; mqtt.password = geheim123