From bc8482b03c3522efdabcac804bfca6329b8eb679 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Thu, 16 Nov 2017 11:45:50 +0100 Subject: [PATCH] DataParsers loaded from configuration, DataObjectQueue introduced --- .gitignore | 1 + .../MeasurementCollector/ADataParser.class | Bin 408 -> 651 bytes .../MeasurementCollector/AMessageParser.class | Bin 1035 -> 822 bytes .../DataObjectQueue.class | Bin 0 -> 493 bytes .../FinderOnePhasePowerMeter.class | Bin 1628 -> 1612 bytes .../FinderThreePhasePowerMeter.class | Bin 1635 -> 1619 bytes .../HottisFourChannelThermometer.class | Bin 1677 -> 1647 bytes .../MeasurementCollector/MBusParser.class | Bin 5533 -> 6163 bytes .../MeasurementCollector.class | Bin 1886 -> 1818 bytes .../MeasurementCollectorException.class | Bin 565 -> 501 bytes .../MeasurementCollector/TestParser.class | Bin 1110 -> 0 bytes bin/measurementCollector.props | 16 ++- .../MeasurementCollector/ADataParser.java | 10 +- .../MeasurementCollector/AMessageParser.java | 9 +- .../MeasurementCollector/DataObjectQueue.java | 11 ++ .../FinderOnePhasePowerMeter.java | 8 +- .../FinderThreePhasePowerMeter.java | 8 +- .../HottisFourChannelThermometer.java | 8 +- .../MeasurementCollector/MBusParser.java | 94 ++++++++++-------- .../MeasurementCollector.java | 11 +- .../MeasurementCollectorException.java | 3 +- .../MeasurementCollector/TestParser.java | 16 --- src/measurementCollector.props | 16 ++- 23 files changed, 127 insertions(+), 84 deletions(-) create mode 100644 .gitignore create mode 100644 bin/de/hottis/MeasurementCollector/DataObjectQueue.class delete mode 100644 bin/de/hottis/MeasurementCollector/TestParser.class create mode 100644 src/de/hottis/MeasurementCollector/DataObjectQueue.java delete mode 100644 src/de/hottis/MeasurementCollector/TestParser.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5887986 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +MeasurementCollectorMqttReceiver-* diff --git a/bin/de/hottis/MeasurementCollector/ADataParser.class b/bin/de/hottis/MeasurementCollector/ADataParser.class index 34b01e90ba88f6e27ce3b159ee2a6c1d3c319a0e..927f512a985d32a3e2ede1141ec70d718b76b871 100644 GIT binary patch delta 324 zcmZWjJx{_=6g{^eAf-@5@nh4Cq6rHd#>K=qG%k`ZP7iJHnNmzCuFS+Rbn|aG7!wD7 zfd9llVLUCP!@KvK`_4V*zM3z#^Zonz1z>=~+__p>iJC@&cJQd4RX|D_4{{Qwvfpsyvj~tk&yQsnym|Z`tLC|zzqayGEokZ7*={QP9Y8;nAvpW@s zD%Axad7G(~J?OdMG{{>$m&x{%O6OD$^V_3*?aQj@KdYs6OmmahGrLG2GKj0#Vy%%~ zk{j$!?}P8;9gVkAz`-9* CwK!b> delta 109 zcmeBXox#j?>ff$?3=9k=4BQjBJUCek5{rsc85w*hCon2-=OpH(>j#$Ct)0(T}{*|zDQJ}4g~B`G`rDb0snLo-iJXF z>uGR4k8agG*6NNKhkB;tfxu&a9IB dK>dwCk!9!0M()j55~1+61UAv3S)iMTWI(AvFt8(NYfkcJG zfgiw+Ld@C)8s!k7YUTC3zL}kGXMg_s{sX{E>@`pkcrhjaBsE55{xQic*EFNV4AMBJ z(4^WwI;Jd>5xtW-Bi(=_uzo5pq#w&9^50HQIZU8t(sLCGc)>s4&}fxJJ$8P`DJOyb z(wQ3-`(c`dxz=3DAN&;qm7LM^y^UsAbEu+38a|Og{2$Q%jo3hCrXMV8@s%{P?4)2^78-HttjGf1b@LKW*S?qEZp+U|^-5ZH84L)}XE zTr{vEu*SDQZ}QoM^hi!(Cf^IvP{w1amDR6}jyX}8fWMU7x%pvkx978cJpYq%B_cB_ z$7rkFS>#=yL6;QfhL3b`&8bl{@{5FghcsfXw+OTZw1#P}Lwc=jL!0wMePCzS*<%i> z{4grKm=cy8O9)$=h1Ierm^_#LrR6SG*>lFa#jSO}@%Q`+UU&ZrTVL2z#WwFACjtW< zhBjeAtGLgW-4ccec*q(jD9VaLvV|*n#Inmpt*?O=TLd2C3GcSB&wuNyb-%*<%tECo aS1*hkMTrtzD@*XpeTrusC$LjQ@BRiA<`2FA diff --git a/bin/de/hottis/MeasurementCollector/DataObjectQueue.class b/bin/de/hottis/MeasurementCollector/DataObjectQueue.class new file mode 100644 index 0000000000000000000000000000000000000000..8fd22a8d0fa12241f7e6a72a049c365204d85d33 GIT binary patch literal 493 zcmb7B!AiqG5PjRGjfvH2@dvzV4~?L=hJr*qMMWyTZ<4`oO|!7s^}l)&Joo{AlsE~Z z;zea)-n`+>?!4L8x91lCXBheD2uuo!mfBiXM^_|kXJ}28O>|jOZncRnq?I?>ipi}b zM?O4(@k&0*$XQiJxvp|&47WtdXPT<&fr?fy(2rH6>`b70bi5Go5?xS;E`kAi=nD*4 zP1kOnk-3vuNdlu(=dxT#qZ|b zb=Ns^Y|q(i+ME7CYp+?d>H^xv{*Ei5B4%I&ks9rX9-B*4|$1RQt`XVhQ=5gD=BFx}SS&C$k(~%9v)#O4RO9Jto{dU81 z>yFnZDq$)TDJ&1*Rs@!ZylY}IQK?vUi7DJQ_#*d$6ZQGW-|91Q%ol<}XfDoEr+Q4S z@Egfwdx(Ar>yoDoZ{u_th*M7wT~wn~^bfY?41sY>ur|p%1((8^-w|aWQ0`-DyNBso zAF1tZ<`a&u9_&>upVGRxvz0&P43#9nEc3v;D6=M*wZgN= zv`0vWbcJEw1znld`(z^n9^fI#qSUJelsK@67}nUTaryJb2Db9K4NvG2c*?4R^}jeL BUC{sl delta 612 zcmYjOO-~b16g_w5%?zD+ErOU6A}o)&7ch#QVS`ATjJhL z^OpPqcN&v6N@85AF>&w0jeo;ZxPH&&O z;~=6E9;-6tomg!>Yz56-wN6DkiBQ>xE~*1jRNv{Ta4d|plVfUI8_7Aih^&Q6gj5{r zC=43jYH%1zTt-fvXnBz*WYsH?wQY=IOyVlW)o*P+H;E|=*9d*vJla3nY1AdAd6|-) z9>`!Wid#@?`hw|66j4&I^<`Hy{TG~kc=i7wdePti&{yb~VDPatP_!z)3GO_u#MPMT z!hRQzCBJ42CXnQB*&`r@LGCyhhFD}c=AMs5zOtOjeeDz%wz^1{#VImdvvURg16&QC zG1|eE&M_tmRzHA=E@sPyD_o<4`At{6WeuJEz}JiP99B=VYl>qg`7aNm!roD)YR~Uq zCU(Yk+=z45n0JfwMc8dDuwH`e9o$7p@W??Ki+qO)6Vhk2duOyN1k2QTs$uCbD4%AP diff --git a/bin/de/hottis/MeasurementCollector/FinderThreePhasePowerMeter.class b/bin/de/hottis/MeasurementCollector/FinderThreePhasePowerMeter.class index 5cf45e6d6f7a6b6e9f8d73278bb3041756ed62d5..a2ec1906057ec146838edda5eceb0e6707d62664 100644 GIT binary patch delta 596 zcmY*VO;1xn6g@NZ+Sk60v{gZi6)K4IlPZF>Eff?MgrFOfBFkrJNKI1=v~JmHST>XR zH`GYlD2W=EZd~{WBrg3A#`7M2#Lc~P?mhRObLYGMs$-vjzIzW~4l6dKK)H8P4%)B; zvb~dW6P1D9VSIWxz46$6>K0pWd#CuIv)63zR5Nt}Yh`!4;Xom*5kRo_vTeSoWH|7| z-P>;nRLwn=G7m*Y9Qv;#@hp15V_p~@;1 z;zo17qj3cj=7mgISIIRWMAC6EiEA3uNSkkRW+98bjhsO2pVQUd?xR*iqktKK$hME_ zZmUaclwWm_z;(~g4YRIF!JC@DFmIl#wKqT1nmFLEK++ixW3-8C#F9Cf%?%KG?e`r< z$FD}n)QAv|oU(|{5Rvbl#vL?=ID2PVlQ`$^{DctafaPPH-x^@#{xK3;x$F@RF6Gr* zT$cEV$v&p~$mC=3{|f^YD^?+4^)b6yc*P}(R)A3of`TE6#VIz+SfX4F!@j+_Q^CLX tmT`-H;hDf~lxZ!*JYPYT3rh%N0gJFW{^v4}w)C4;;gI6+9d;$|{sJH+TWtUU delta 587 zcmZWmO-~w86g_u77?^obtQI=075tzo3PVwAOAFGJg$s=f6OGG3h`|tS6x{j?OeAmF zMbmXRZA>6)Vq6<{Zo2QPf1>G~u`wpy-23jm=bdxjeYfJ5Ft7idUjmrNhpt(PM|a&r z*J-+~9cQh&Tiq& zY`ure0-uU3?wKmx3H~$1(#T`ZH(KUTUtoh??==>g iFU0W;-sYk4z(N7^L7C zyXCYS_J+UTY&WV_T|imfbv+$2E*OX)+CAQzR@%-7Patu=K_If{>>p6926>SQ-U>^6 z3U}YdQDS^B;fjEqv+61)1S-r9-Ye!S4QaM6d2Yjt;W{!ZCIv=Ao{rya*(=Qh-@pyr zWOKvw1@W+LXeToYzbw7n7iBA zZh3X5)gdf_YC2N5H2}OVU=z7mu32>*W4L3Wg1a<1t~&@mA8WnQa6dSa=T3z3QXGPx z1l|Wxt}3f1tR?=V`9dGsaj5HD_3$)Cr-2yj`mSAEP;~{TlNN~oxjt6-7g1E%OJgS7%u#87|%z;^y_z(+F@Ra)S Sssq=vGuLyv1Qw}EsQm@IifxJj delta 582 zcmZ9IO-mb56o%h3b7#iPOw!c&6^$lZt)FpHzp82ds)AC~NZYF4pUS`{~5JQ`RRzk=hn$PWIou!?loQ*gV@={5N4nj^efjS?Et;vS6~{k73#%^g}4{6c#XuTG2TE+LuLq9Uplk@`}BMv`IU zKk7LY71x}svIWrWPqBDrkiRK}B)fcMo6m^&rc)J*CsX#p7~cB!YZ%AE1Z$Ts(|E^$ h0W9G?CLuT~g(*z)@62$&p-RnGsSivM=D4e1{t@nCS#|&b diff --git a/bin/de/hottis/MeasurementCollector/MBusParser.class b/bin/de/hottis/MeasurementCollector/MBusParser.class index 53c74d447c12fbdb74b9e927bbbad9f530f8abf8..1bdb0468363241b54d81f05820c46af8b2641ce4 100644 GIT binary patch literal 6163 zcmb_gd3+pI9sj;$lbP&JX}f8XE^X=3Qku=tg@UDQYPC&+Ny$Z%2GS~ZvO7(--HYAX zUJ59pf})6u0v><|6>pGkTUrWugMtSlUf>0a7oK=<#qXP$-JOuF=^uWQOy0ctz2EQm ze!uVUc<;fN?mhJJX4T5jE4G~j>-vmbP9HbyB?5CctQ%gpZE)SDp{`Ba1~&~13ix|>=)3fALQjo{hs2Kw#K6z!8D?6;giy{%o|j3>g~dTydm&yc2W zC_bLjO09cZ$xs_gQajdCLhYJ(DsHY7=xKKGAIzpRM%IiQxsI6_N`3=l zJLt6w@kG-Ol!68JeZFLITyzp%J;DRl{t|AtHO@DWgB195b@R`dES*`+L(-Ju#wZ2s7!#~FOzqr@<}7BOWitr=tP%-4FU}n2{fFC*AR~>V~^RD zuyP#f(r#yGi_(pm+SB3S{0)LqD?BiRl{rXIwC8V zNyMqca<>i+d1$LkFK5n+ZO|3Go)J;DLuW$I{h{E;I>TG*e+{T*tLiZ-u~=5i_z97?*0e442c7yJR&U z*gi8nOUT%VH_PmK#c_~7qT)&_9V})QBNil9f?n*y+cdl#S1}XnnT(N&vDa{0#}VLm z!xXhURJ=o=s?B1x*^77KS_SWBJ-4 zjnz6Gp1E1vW52J9*3G7>uzF2c1U4i`BS6n&U) zrgzIC!oscKLq)}{*e?lYBO)`NlkJ-9S7hli62^E|PpbGDJ;G4@1|CrG&0?QrIi@FN8skP*!-M#iM5@$~bM#UL1$#n0 zUOa^FD0rBuJe?g6vmZ_+^U?4Qc{;F8C(emO!*}sLW{;Q=Wz)<4rg`i7o>1@qT*Er? z5FXL+13b!v$ih?XM;&vt7j_?2b4(PAm#!_)Y^g5Oc)GC<@P4S&EN>D)N`M%^mnjZ?PJ zwIcwD!n@ulo1#Ss$v$) zbE!nwwP`|6#S*eG$tVf3HE7fDQ8Q#PAuS-Ww!^~OZT6@fbzI8n_Nt}P| zx)q0<$Gi&hD34Q4E?`z}*yS9`q<>1`$@`89D=SAb11n~w0VfLQxYW1c&pswuzA_NScifAsjfYZIG;1)#$ z=)IwIJ{vX8i_4?#?DBDSh13?OGFYm4ljOmC)S#Ac3g4=r^4;rt_rWjE+txQ8qe(Z{ z8vD7LT?OXx*}$1S$0W57ff@PxzvHSp9?yy$3@!3eZ zz(Pt~1P!N<(_;Pv(azZxn-^9f%r|nCr%FnaBgQxN)JT6eUSVmm3L(y%!>=CFtd{zS zN6FpGnL^85h!n7Oc+OC+Z58_S!w-oT!fQJwN)pAtBM*;6F;2LUloxn|#6Z;uoN3eR-e|_sgeDK~o zti9fb+i?^3B(1fPegMmWiqql4a_+I2HVe@{Ewn=`&L!1a+N+B*n`x~H+R3D)K0^B2 zu!@|{!KZ1P1Bh4_&X5bO<5*b5NAY3ON?%^ZaV_l`X1%!?x6s08^E`Gd=RA}W!^b$P zp{#BAI7hXVco9Bu`>EpuJ@YBbtfNdH|2{*`pQXGYx!JNl#~FL&=SwTU zz;9n9RREqB;8W1~Jg%GMdZCb*kDEBe9k`QEy142EDnww4GimyzbmEu#+x>?R<46@< zeAIu;8Fka0{`*SPUoK781ZwYDV0WTD>R4)XPB&Q3ax*!xA zKl`!D!CJlW^1B7H;->}urEeO)wHL%m_9qKnqCw0rp=*p$58leuVLg4cfmrF{8!uJ( z(?_rB{GY)2*u^`NOF44|`f)Wb!1dTfFAw8>`u+j_e}q_g9HV#+TUdg(iUwX#1aPr9 zgB)aB-@vOlI;C*aDQ*y_h{fE`)wo6k#i`5%xAVGY2}eF^tBR%K zG~Pr9&}5;r+Cpa|<=gbjO7t??BqpzgGRckC5sHdfuAp1NQR~^Qh>#*$xQE6`UJ3DL tvNC~!hZH=f;A#F+>t}%aNyaB(J_9{4$t%<95}g$ZO%S4$YE_B0{{r*o*2Mq- literal 5533 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 diff --git a/bin/de/hottis/MeasurementCollector/MeasurementCollector.class b/bin/de/hottis/MeasurementCollector/MeasurementCollector.class index 9318cbf58b44265e98a6c9c4c382a4ea89bebbd5..13d4fa5bb92e7a5eff9fd4462a32be91e81ab875 100644 GIT binary patch delta 319 zcmYk1%`O9R6vco4&P*{zRfMJsABlxj5y>U+`h*HnUJ+F5%CW92Qn zKw=@*79PPUtcOzrHhkgn;n#BX4qvx~NyU&#TRraQs5KP?nG3F4JTxl8L@U zL70A2k&Vdu-Rd*8@@h7zK4H60tbz%`6rzMNj6p}7m<1$|#w1oSgB+45VHPIlNE`fm w*oHmq(-x<_iUTn6&!dJzgeZ}~5$e=kf`((*P;oNsXH&mogG7c?B11U)0mhbg*8l(j diff --git a/bin/de/hottis/MeasurementCollector/MeasurementCollectorException.class b/bin/de/hottis/MeasurementCollector/MeasurementCollectorException.class index 9a2e8c39401b205291b8c58c073ba7dc2db140c3..7293159324a7ae82114e58c748626cce54308a27 100644 GIT binary patch delta 132 zcmdnW@|BtE)W2Q(7#J8#7(^y=#ZH`V&&J8az{uhJ>*a&1YF>nD%E+EYSRK^BW#tmdCK$J1?Fz^C-Kn)Ch4E#VtKr8_UL7-|z L1|cAii9r|uoUaYb 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~Y1YL`;GM;vquw+Si=$X#+JKy=vH>ZF9{rU}H8LJkC7;1s=_LVU*@zw=TQY|78n>7`N zqG^=&8X_^9Tqi46Qk2ipL@Pwb<1cO zw`#6T+%yivo{U9c+bCkx!7#=cCad+c%3ZXdDJ$0r`X!Bag>G;v#!#uNCJ(o{mf5~{ zSTOrCVVJL9;=`G3K7%E`iDqhubE#L|$VhlO|3_{_gLeK!vP!stn--=R#`{DcB}POJ zrg4jGRjHw-y2(;`o7BFcwgiuS3%41j`Vw<*KBO`Xgtl=Pu7!K2h(SdTW^tdPXjIoG zhKXuzP^FEBn6vQcyvDqggU6^+`-ePC#l{}PT)+7ny9YF4{)Ln?7%gI+fw?wju;^e3 z9t{(3w?!P#6!!C+UgChXUZ;LWK|If~Y~cmN_1uy3UO9M~4Tsgv> parse(LocalDateTime timestamp, String name, List dataRecords); +public abstract class ADataParser { + protected String name; + + public ADataParser(String name) { + this.name = name; + } + + abstract public List parse(LocalDateTime timestamp, List dataRecords); } diff --git a/src/de/hottis/MeasurementCollector/AMessageParser.java b/src/de/hottis/MeasurementCollector/AMessageParser.java index 05313b8..2f54681 100644 --- a/src/de/hottis/MeasurementCollector/AMessageParser.java +++ b/src/de/hottis/MeasurementCollector/AMessageParser.java @@ -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> queue; + protected DataObjectQueue queue; + protected Properties config; - public AMessageParser(String topic, ConcurrentLinkedQueue> queue) { + public AMessageParser(String topic, Properties config, DataObjectQueue queue) { this.topic = topic; + this.config = config; this.queue = queue; } diff --git a/src/de/hottis/MeasurementCollector/DataObjectQueue.java b/src/de/hottis/MeasurementCollector/DataObjectQueue.java new file mode 100644 index 0000000..2d61e8e --- /dev/null +++ b/src/de/hottis/MeasurementCollector/DataObjectQueue.java @@ -0,0 +1,11 @@ +package de.hottis.MeasurementCollector; + +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; + +@SuppressWarnings("serial") +public class DataObjectQueue extends ConcurrentLinkedQueue> { + public DataObjectQueue() { + super(); + } +} diff --git a/src/de/hottis/MeasurementCollector/FinderOnePhasePowerMeter.java b/src/de/hottis/MeasurementCollector/FinderOnePhasePowerMeter.java index 005713a..a2be8c6 100644 --- a/src/de/hottis/MeasurementCollector/FinderOnePhasePowerMeter.java +++ b/src/de/hottis/MeasurementCollector/FinderOnePhasePowerMeter.java @@ -6,8 +6,12 @@ import java.util.List; import org.openmuc.jmbus.DataRecord; -public class FinderOnePhasePowerMeter implements ADataParser { - public List parse(LocalDateTime timestamp, String name, List dataRecords) { +public class FinderOnePhasePowerMeter extends ADataParser { + public FinderOnePhasePowerMeter(String name) { + super(name); + } + + public List parse(LocalDateTime timestamp, List dataRecords) { ArrayList list = new ArrayList(); ElectricEnergyDataObject tdo = new ElectricEnergyDataObject(timestamp, name, diff --git a/src/de/hottis/MeasurementCollector/FinderThreePhasePowerMeter.java b/src/de/hottis/MeasurementCollector/FinderThreePhasePowerMeter.java index ab4de8b..4970271 100644 --- a/src/de/hottis/MeasurementCollector/FinderThreePhasePowerMeter.java +++ b/src/de/hottis/MeasurementCollector/FinderThreePhasePowerMeter.java @@ -6,8 +6,12 @@ import java.util.List; import org.openmuc.jmbus.DataRecord; -public class FinderThreePhasePowerMeter implements ADataParser { - public List parse(LocalDateTime timestamp, String name, List dataRecords) { +public class FinderThreePhasePowerMeter extends ADataParser { + public FinderThreePhasePowerMeter(String name) { + super(name); + } + + public List parse(LocalDateTime timestamp, List dataRecords) { ArrayList list = new ArrayList(); ElectricEnergyDataObject tdo = new ElectricEnergyDataObject(timestamp, name, diff --git a/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java b/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java index 6feb2a2..6c33253 100644 --- a/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java +++ b/src/de/hottis/MeasurementCollector/HottisFourChannelThermometer.java @@ -6,8 +6,12 @@ import java.util.List; import org.openmuc.jmbus.DataRecord; -public class HottisFourChannelThermometer implements ADataParser { - public List parse(LocalDateTime timestamp, String name, List dataRecords) { +public class HottisFourChannelThermometer extends ADataParser { + public HottisFourChannelThermometer(String name) { + super(name); + } + + public List parse(LocalDateTime timestamp, List dataRecords) { ArrayList list = new ArrayList(); TemperatureDataObject tdo = new TemperatureDataObject(timestamp, "Hedge", dataRecords.get(5).getScaledDataValue()); diff --git a/src/de/hottis/MeasurementCollector/MBusParser.java b/src/de/hottis/MeasurementCollector/MBusParser.java index 1933ca2..147ff41 100644 --- a/src/de/hottis/MeasurementCollector/MBusParser.java +++ b/src/de/hottis/MeasurementCollector/MBusParser.java @@ -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,71 +16,80 @@ 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> queue) { - super(TOPIC, queue); + + private HashMap 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(); + } + + public void registerConfiguredDataParsers() throws MeasurementCollectorException { + try { + @SuppressWarnings("unchecked") + Enumeration propNames = (Enumeration) 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]; 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()); - //} - - List 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 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); } diff --git a/src/de/hottis/MeasurementCollector/MeasurementCollector.java b/src/de/hottis/MeasurementCollector/MeasurementCollector.java index 10ac03a..1f151b6 100644 --- a/src/de/hottis/MeasurementCollector/MeasurementCollector.java +++ b/src/de/hottis/MeasurementCollector/MeasurementCollector.java @@ -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> queue = new ConcurrentLinkedQueue>(); - - MBusParser mbusParser = new MBusParser(queue); + MBusParser mbusParser = new MBusParser(config, queue); + mbusParser.registerConfiguredDataParsers(); mqttReceiver.registerParser(mbusParser); } diff --git a/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java b/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java index 0a4dc20..758e889 100644 --- a/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java +++ b/src/de/hottis/MeasurementCollector/MeasurementCollectorException.java @@ -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); } diff --git a/src/de/hottis/MeasurementCollector/TestParser.java b/src/de/hottis/MeasurementCollector/TestParser.java deleted file mode 100644 index 72c4aef..0000000 --- a/src/de/hottis/MeasurementCollector/TestParser.java +++ /dev/null @@ -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); - } - -} diff --git a/src/measurementCollector.props b/src/measurementCollector.props index 7cb4554..7a03150 100644 --- a/src/measurementCollector.props +++ b/src/measurementCollector.props @@ -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